Merge pull request #35839 from Random-Liu/add-cri-runtime-status

Automatic merge from submit-queue

CRI: Add Status into CRI.

For https://github.com/kubernetes/kubernetes/issues/35701.
Fixes https://github.com/kubernetes/kubernetes/issues/35701.

This PR added a `Status` call in CRI, and the `RuntimeStatus` is defined as following:

``` protobuf
message RuntimeCondition {
    // Type of runtime condition.
    optional string type = 1;
    // Status of the condition, one of true/false.
    optional bool status = 2;
    // Brief reason for the condition's last transition.
    optional string reason = 3;
    // Human readable message indicating details about last transition.
    optional string message = 4;
}

message RuntimeStatus {
    // Conditions is an array of current observed runtime conditions.
    repeated RuntimeCondition conditions = 1;
}
```

Currently, only `conditions` is included in `RuntimeStatus`, and the definition is almost the same with `NodeCondition` and `PodCondition` in K8s api.

@yujuhong @feiskyer @bprashanth If this makes sense, I'll send a follow up PR to let dockershim return `RuntimeStatus` and let kubelet make use of it.
@yifan-gu @euank Does this make sense to rkt?
/cc @kubernetes/sig-node
This commit is contained in:
Kubernetes Submit Queue 2016-11-06 04:16:29 -08:00 committed by GitHub
commit 8371a778f6
22 changed files with 717 additions and 241 deletions

View File

@ -81,6 +81,8 @@ type RuntimeService interface {
// UpdateRuntimeConfig updates runtime configuration if specified
UpdateRuntimeConfig(runtimeConfig *runtimeApi.RuntimeConfig) error
// Status returns the status of the runtime.
Status() (*runtimeApi.RuntimeStatus, error)
}
// ImageManagerService interface should be implemented by a container image

View File

@ -50,6 +50,7 @@ type FakeRuntimeService struct {
Called []string
FakeStatus *runtimeApi.RuntimeStatus
Containers map[string]*FakeContainer
Sandboxes map[string]*FakePodSandbox
}
@ -109,6 +110,15 @@ func (r *FakeRuntimeService) Version(apiVersion string) (*runtimeApi.VersionResp
}, nil
}
func (r *FakeRuntimeService) Status() (*runtimeApi.RuntimeStatus, error) {
r.Lock()
defer r.Unlock()
r.Called = append(r.Called, "Status")
return r.FakeStatus, nil
}
func (r *FakeRuntimeService) RunPodSandbox(config *runtimeApi.PodSandboxConfig) (string, error) {
r.Lock()
defer r.Unlock()

View File

@ -12,7 +12,10 @@ load(
go_library(
name = "go_default_library",
srcs = ["api.pb.go"],
srcs = [
"api.pb.go",
"constants.go",
],
tags = ["automanaged"],
deps = [
"//vendor:github.com/gogo/protobuf/proto",

View File

@ -98,6 +98,10 @@ It has these top-level messages:
RuntimeConfig
UpdateRuntimeConfigRequest
UpdateRuntimeConfigResponse
RuntimeCondition
RuntimeStatus
StatusRequest
StatusResponse
*/
package runtime
@ -2653,6 +2657,110 @@ func (m *UpdateRuntimeConfigResponse) String() string { return proto.
func (*UpdateRuntimeConfigResponse) ProtoMessage() {}
func (*UpdateRuntimeConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{72} }
// RuntimeCondition contains condition information for the runtime.
// There are 2 kinds of runtime conditions:
// 1. Required condtitions: Conditions are required for kubelet to work
// properly. If any required condition is unmet, the node will be not ready.
// The required conditions include:
// * RuntimeReady: RuntimeReady means the runtime is up and ready to accept
// basic containers e.g. container only needs host network.
// * NetworkReady: NetworkReady means the runtime network is up and ready to
// accept containers which require container network.
// 2. Optional conditions: Conditions are informative to the user, but kubelet
// will not rely on. Since condition type is an arbitrary string, all conditions
// not required are optional. These conditions will be exposed to users to help
// them understand the status of the system.
type RuntimeCondition struct {
// Type of runtime condition.
Type *string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
// Status of the condition, one of true/false.
Status *bool `protobuf:"varint,2,opt,name=status" json:"status,omitempty"`
// Reason is brief reason for the condition's last transition.
Reason *string `protobuf:"bytes,3,opt,name=reason" json:"reason,omitempty"`
// Message is human readable message indicating details about last transition.
Message *string `protobuf:"bytes,4,opt,name=message" json:"message,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *RuntimeCondition) Reset() { *m = RuntimeCondition{} }
func (m *RuntimeCondition) String() string { return proto.CompactTextString(m) }
func (*RuntimeCondition) ProtoMessage() {}
func (*RuntimeCondition) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{73} }
func (m *RuntimeCondition) GetType() string {
if m != nil && m.Type != nil {
return *m.Type
}
return ""
}
func (m *RuntimeCondition) GetStatus() bool {
if m != nil && m.Status != nil {
return *m.Status
}
return false
}
func (m *RuntimeCondition) GetReason() string {
if m != nil && m.Reason != nil {
return *m.Reason
}
return ""
}
func (m *RuntimeCondition) GetMessage() string {
if m != nil && m.Message != nil {
return *m.Message
}
return ""
}
// RuntimeStatus is information about the current status of the runtime.
type RuntimeStatus struct {
// Conditions is an array of current observed runtime conditions.
Conditions []*RuntimeCondition `protobuf:"bytes,1,rep,name=conditions" json:"conditions,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *RuntimeStatus) Reset() { *m = RuntimeStatus{} }
func (m *RuntimeStatus) String() string { return proto.CompactTextString(m) }
func (*RuntimeStatus) ProtoMessage() {}
func (*RuntimeStatus) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{74} }
func (m *RuntimeStatus) GetConditions() []*RuntimeCondition {
if m != nil {
return m.Conditions
}
return nil
}
type StatusRequest struct {
XXX_unrecognized []byte `json:"-"`
}
func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{75} }
type StatusResponse struct {
// The status of the Runtime.
Status *RuntimeStatus `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorApi, []int{76} }
func (m *StatusResponse) GetStatus() *RuntimeStatus {
if m != nil {
return m.Status
}
return nil
}
func init() {
proto.RegisterType((*VersionRequest)(nil), "runtime.VersionRequest")
proto.RegisterType((*VersionResponse)(nil), "runtime.VersionResponse")
@ -2727,6 +2835,10 @@ func init() {
proto.RegisterType((*RuntimeConfig)(nil), "runtime.RuntimeConfig")
proto.RegisterType((*UpdateRuntimeConfigRequest)(nil), "runtime.UpdateRuntimeConfigRequest")
proto.RegisterType((*UpdateRuntimeConfigResponse)(nil), "runtime.UpdateRuntimeConfigResponse")
proto.RegisterType((*RuntimeCondition)(nil), "runtime.RuntimeCondition")
proto.RegisterType((*RuntimeStatus)(nil), "runtime.RuntimeStatus")
proto.RegisterType((*StatusRequest)(nil), "runtime.StatusRequest")
proto.RegisterType((*StatusResponse)(nil), "runtime.StatusResponse")
proto.RegisterEnum("runtime.Protocol", Protocol_name, Protocol_value)
proto.RegisterEnum("runtime.PodSandboxState", PodSandboxState_name, PodSandboxState_value)
proto.RegisterEnum("runtime.ContainerState", ContainerState_name, ContainerState_value)
@ -2794,6 +2906,8 @@ type RuntimeServiceClient interface {
PortForward(ctx context.Context, in *PortForwardRequest, opts ...grpc.CallOption) (*PortForwardResponse, error)
// UpdateRuntimeConfig updates the runtime configuration based on request
UpdateRuntimeConfig(ctx context.Context, in *UpdateRuntimeConfigRequest, opts ...grpc.CallOption) (*UpdateRuntimeConfigResponse, error)
// Status returns the status of the runtime.
Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error)
}
type runtimeServiceClient struct {
@ -2957,6 +3071,15 @@ func (c *runtimeServiceClient) UpdateRuntimeConfig(ctx context.Context, in *Upda
return out, nil
}
func (c *runtimeServiceClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) {
out := new(StatusResponse)
err := grpc.Invoke(ctx, "/runtime.RuntimeService/Status", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for RuntimeService service
type RuntimeServiceServer interface {
@ -3011,6 +3134,8 @@ type RuntimeServiceServer interface {
PortForward(context.Context, *PortForwardRequest) (*PortForwardResponse, error)
// UpdateRuntimeConfig updates the runtime configuration based on request
UpdateRuntimeConfig(context.Context, *UpdateRuntimeConfigRequest) (*UpdateRuntimeConfigResponse, error)
// Status returns the status of the runtime.
Status(context.Context, *StatusRequest) (*StatusResponse, error)
}
func RegisterRuntimeServiceServer(s *grpc.Server, srv RuntimeServiceServer) {
@ -3323,6 +3448,24 @@ func _RuntimeService_UpdateRuntimeConfig_Handler(srv interface{}, ctx context.Co
return interceptor(ctx, in, info, handler)
}
func _RuntimeService_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StatusRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RuntimeServiceServer).Status(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/runtime.RuntimeService/Status",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RuntimeServiceServer).Status(ctx, req.(*StatusRequest))
}
return interceptor(ctx, in, info, handler)
}
var _RuntimeService_serviceDesc = grpc.ServiceDesc{
ServiceName: "runtime.RuntimeService",
HandlerType: (*RuntimeServiceServer)(nil),
@ -3395,6 +3538,10 @@ var _RuntimeService_serviceDesc = grpc.ServiceDesc{
MethodName: "UpdateRuntimeConfig",
Handler: _RuntimeService_UpdateRuntimeConfig_Handler,
},
{
MethodName: "Status",
Handler: _RuntimeService_Status_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: fileDescriptorApi,
@ -3578,204 +3725,209 @@ var _ImageService_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptorApi = []byte{
// 3179 bytes of a gzipped FileDescriptorProto
// 3262 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7,
0xb1, 0x04, 0x40, 0x82, 0x40, 0x83, 0x00, 0xc1, 0x21, 0x45, 0x42, 0xa0, 0x25, 0x51, 0x6b, 0xcb,
0x96, 0x64, 0x5b, 0x65, 0xf1, 0xbd, 0x67, 0x3d, 0xcb, 0x96, 0x6c, 0x98, 0xa4, 0xfd, 0x68, 0x49,
0xb1, 0x04, 0x40, 0x82, 0x40, 0x83, 0x00, 0xc1, 0x11, 0x45, 0x42, 0xa0, 0x25, 0x51, 0x6b, 0xcb,
0x96, 0x64, 0x9b, 0x65, 0xf1, 0xbd, 0x67, 0x3d, 0xcb, 0x96, 0x6c, 0x98, 0xa4, 0xfd, 0x68, 0x49,
0x10, 0xdf, 0x40, 0x72, 0xec, 0xf2, 0x61, 0xb3, 0xc2, 0x8e, 0xc0, 0x95, 0x80, 0xdd, 0xf5, 0xec,
0x80, 0x16, 0x73, 0xcd, 0x25, 0x87, 0x1c, 0x72, 0xcd, 0x2d, 0x95, 0x4a, 0x95, 0x0f, 0xb9, 0xa5,
0x2a, 0x55, 0xf9, 0x0f, 0xa9, 0xfc, 0x90, 0x1c, 0x72, 0xcf, 0x31, 0x35, 0x1f, 0x3b, 0x3b, 0xfb,
0x01, 0x9a, 0x94, 0x53, 0xb1, 0x6e, 0x3b, 0x3d, 0xdd, 0x3d, 0x3d, 0xdd, 0x3d, 0x3d, 0xdd, 0x3d,
0x0b, 0x75, 0x27, 0xf4, 0x6e, 0x84, 0x34, 0x60, 0x01, 0x5a, 0xa4, 0x53, 0x9f, 0x79, 0x13, 0x62,
0x5d, 0x87, 0xd6, 0x97, 0x84, 0x46, 0x5e, 0xe0, 0x63, 0xf2, 0xed, 0x94, 0x44, 0x0c, 0x75, 0x60,
0xf1, 0x48, 0x42, 0x3a, 0xa5, 0xad, 0xd2, 0xd5, 0x3a, 0x8e, 0x87, 0xd6, 0xf7, 0x25, 0x58, 0xd6,
0xc8, 0x51, 0x18, 0xf8, 0x11, 0x99, 0x8d, 0x8d, 0x2e, 0xc3, 0x92, 0x5a, 0xc4, 0xf6, 0x9d, 0x09,
0xe9, 0x94, 0xc5, 0x74, 0x43, 0xc1, 0xfa, 0xce, 0x84, 0xa0, 0xb7, 0x60, 0x39, 0x46, 0x89, 0x99,
0x54, 0x04, 0x56, 0x4b, 0x81, 0xd5, 0x6a, 0xe8, 0x06, 0xac, 0xc6, 0x88, 0x4e, 0xe8, 0x69, 0xe4,
0x79, 0x81, 0xbc, 0xa2, 0xa6, 0x7a, 0xa1, 0xa7, 0xf0, 0xad, 0x6f, 0xa0, 0xbe, 0xdb, 0x1f, 0xec,
0x04, 0xfe, 0x53, 0x6f, 0xc4, 0x45, 0x8c, 0x08, 0xe5, 0x34, 0x9d, 0xd2, 0x56, 0x85, 0x8b, 0xa8,
0x86, 0xa8, 0x0b, 0xb5, 0x88, 0x38, 0x74, 0x78, 0x48, 0xa2, 0x4e, 0x59, 0x4c, 0xe9, 0x31, 0xa7,
0x0a, 0x42, 0xe6, 0x05, 0x7e, 0xd4, 0xa9, 0x48, 0x2a, 0x35, 0xb4, 0x7e, 0x5b, 0x82, 0xc6, 0x41,
0x40, 0xd9, 0x03, 0x27, 0x0c, 0x3d, 0x7f, 0x84, 0xde, 0x85, 0x9a, 0x50, 0xea, 0x30, 0x18, 0x0b,
0x1d, 0xb4, 0xb6, 0x57, 0x6e, 0x28, 0x91, 0x6e, 0x1c, 0xa8, 0x09, 0xac, 0x51, 0xd0, 0x15, 0x68,
0x0d, 0x03, 0x9f, 0x39, 0x9e, 0x4f, 0xa8, 0x1d, 0x06, 0x94, 0x09, 0xcd, 0x2c, 0xe0, 0xa6, 0x86,
0x72, 0xe6, 0x68, 0x13, 0xea, 0x87, 0x41, 0xc4, 0x24, 0x46, 0x45, 0x60, 0xd4, 0x38, 0x40, 0x4c,
0x6e, 0xc0, 0xa2, 0x98, 0xf4, 0x42, 0xa5, 0x83, 0x2a, 0x1f, 0xee, 0x87, 0xd6, 0x6f, 0x4a, 0xb0,
0xf0, 0x20, 0x98, 0xfa, 0x2c, 0xb3, 0x8c, 0xc3, 0x0e, 0x95, 0x7d, 0x8c, 0x65, 0x1c, 0x76, 0x98,
0x2c, 0xc3, 0x31, 0xa4, 0x89, 0xe4, 0x32, 0x7c, 0xb2, 0x0b, 0x35, 0x4a, 0x1c, 0x37, 0xf0, 0xc7,
0xc7, 0x42, 0x84, 0x1a, 0xd6, 0x63, 0x6e, 0xbb, 0x88, 0x8c, 0x3d, 0x7f, 0xfa, 0xc2, 0xa6, 0x64,
0xec, 0x3c, 0x21, 0x63, 0x21, 0x4a, 0x0d, 0xb7, 0x14, 0x18, 0x4b, 0xa8, 0xf5, 0x0c, 0x96, 0xb9,
0xb1, 0xa3, 0xd0, 0x19, 0x92, 0x87, 0x42, 0x85, 0xdc, 0x35, 0xc4, 0xa2, 0x3e, 0x61, 0xdf, 0x05,
0xf4, 0xb9, 0x90, 0xac, 0x86, 0x1b, 0x1c, 0xd6, 0x97, 0x20, 0x74, 0x1e, 0x6a, 0x52, 0x2e, 0xcf,
0x15, 0x62, 0xd5, 0xb0, 0xd8, 0xf1, 0x81, 0xe7, 0xea, 0x29, 0x2f, 0x1c, 0x2a, 0xa9, 0x16, 0xe5,
0xee, 0x87, 0xd6, 0x2f, 0x4b, 0x70, 0xee, 0x3e, 0x5f, 0xfc, 0x20, 0x70, 0x07, 0x8e, 0xef, 0x3e,
0x09, 0x5e, 0x28, 0x27, 0x78, 0x1d, 0x9a, 0xc3, 0x11, 0x0d, 0xa6, 0xa1, 0x1d, 0x3a, 0x94, 0xf8,
0x4c, 0x69, 0x63, 0x49, 0x02, 0x0f, 0x04, 0x0c, 0xed, 0xc1, 0x8a, 0x1f, 0x8b, 0x6a, 0xc7, 0xd6,
0xe7, 0xab, 0x37, 0xb6, 0x3b, 0xda, 0xa4, 0x99, 0xcd, 0xe0, 0xb6, 0x9f, 0x06, 0x44, 0x16, 0x05,
0x94, 0xac, 0xff, 0x80, 0x30, 0xc7, 0x75, 0x98, 0x83, 0x10, 0xcc, 0x8b, 0x73, 0x20, 0x17, 0x16,
0xdf, 0xa8, 0x0d, 0x95, 0xa9, 0xda, 0x60, 0x1d, 0xf3, 0x4f, 0xf4, 0x1a, 0xd4, 0x35, 0x3f, 0x75,
0x18, 0x12, 0x00, 0x77, 0x4a, 0x87, 0x31, 0x32, 0x09, 0x99, 0x50, 0x76, 0x13, 0xc7, 0x43, 0xeb,
0x2f, 0xf3, 0xd0, 0xce, 0x6d, 0xfa, 0x16, 0xd4, 0x26, 0x6a, 0x79, 0xb1, 0x6c, 0x63, 0x7b, 0x33,
0xf1, 0xcc, 0x9c, 0x84, 0x58, 0x23, 0x73, 0xc3, 0x73, 0x95, 0x1a, 0xe7, 0x56, 0x8f, 0xb9, 0x26,
0xc7, 0xc1, 0xc8, 0x76, 0x3d, 0x4a, 0x86, 0x2c, 0xa0, 0xc7, 0x4a, 0xca, 0xa5, 0x71, 0x30, 0xda,
0x8d, 0x61, 0xe8, 0x26, 0x80, 0xeb, 0x47, 0xf6, 0x50, 0xc8, 0x21, 0x64, 0x6d, 0x6c, 0x23, 0xbd,
0xb6, 0x3e, 0x9b, 0xb8, 0xee, 0xfa, 0x91, 0x12, 0xf6, 0x03, 0x68, 0x72, 0x5f, 0xb7, 0x27, 0xf2,
0x58, 0x45, 0x9d, 0x85, 0xad, 0xca, 0xd5, 0xc6, 0xf6, 0x9a, 0x21, 0xb1, 0x3e, 0x73, 0x78, 0x29,
0x4c, 0x06, 0x11, 0xba, 0x03, 0x55, 0xe1, 0x6b, 0x51, 0xa7, 0x2a, 0x68, 0xae, 0x14, 0xec, 0x52,
0xae, 0x72, 0xe3, 0xbe, 0xc0, 0xdb, 0xf3, 0x19, 0x3d, 0xc6, 0x8a, 0x08, 0xdd, 0x87, 0x86, 0xe3,
0xfb, 0x01, 0x73, 0xa4, 0xc1, 0x17, 0x05, 0x8f, 0xeb, 0xb3, 0x79, 0xf4, 0x12, 0x64, 0xc9, 0xc8,
0x24, 0x47, 0xff, 0x0d, 0x0b, 0xc2, 0xff, 0x3b, 0x35, 0xb1, 0xeb, 0x8b, 0x9a, 0x4f, 0xa1, 0x63,
0x62, 0x89, 0xdc, 0xfd, 0x00, 0x1a, 0x86, 0x68, 0xdc, 0x31, 0x9e, 0x93, 0x63, 0xe5, 0x2b, 0xfc,
0x13, 0xad, 0xc1, 0xc2, 0x91, 0x33, 0x9e, 0xc6, 0xf6, 0x90, 0x83, 0xdb, 0xe5, 0xff, 0x2d, 0x75,
0xef, 0x42, 0x3b, 0x2b, 0xd1, 0x59, 0xe8, 0xad, 0x7d, 0x58, 0xc3, 0x53, 0x3f, 0x11, 0x2c, 0xbe,
0x08, 0x6e, 0x42, 0x55, 0xd9, 0x4f, 0xfa, 0xce, 0xf9, 0x99, 0x1a, 0xc1, 0x0a, 0xd1, 0xba, 0x03,
0xe7, 0x32, 0xac, 0xd4, 0x35, 0xf1, 0x06, 0xb4, 0xc2, 0xc0, 0xb5, 0x23, 0x09, 0xb6, 0x3d, 0x37,
0x3e, 0x7f, 0xa1, 0xc6, 0xdd, 0x77, 0x39, 0xf9, 0x80, 0x05, 0x61, 0x5e, 0x94, 0xd3, 0x91, 0x77,
0x60, 0x3d, 0x4b, 0x2e, 0x97, 0xb7, 0x3e, 0x86, 0x0d, 0x4c, 0x26, 0xc1, 0x11, 0x79, 0x59, 0xd6,
0x5d, 0xe8, 0xe4, 0x19, 0x24, 0xcc, 0x13, 0xe8, 0x80, 0x39, 0x6c, 0x1a, 0x9d, 0x8d, 0xf9, 0x35,
0x93, 0x81, 0x0a, 0x80, 0x92, 0x0f, 0x6a, 0x41, 0xd9, 0x0b, 0x15, 0x51, 0xd9, 0x0b, 0xad, 0xaf,
0xa1, 0xde, 0x37, 0xa3, 0x81, 0x19, 0x41, 0xeb, 0x38, 0x1e, 0xa2, 0xed, 0xe4, 0xf2, 0xfa, 0xa1,
0xf0, 0xa5, 0xaf, 0xb5, 0x7b, 0xb9, 0xd0, 0xa9, 0x64, 0xd8, 0x06, 0xd0, 0x11, 0x28, 0x52, 0xbe,
0x82, 0x16, 0x73, 0xcd, 0x25, 0x87, 0x1c, 0x72, 0xcd, 0x2d, 0x95, 0x4a, 0x95, 0xab, 0x92, 0x5b,
0xaa, 0x52, 0x95, 0xff, 0x90, 0xca, 0x0f, 0xc9, 0x3f, 0xc8, 0x31, 0x35, 0x9f, 0x3b, 0xfb, 0x01,
0x9a, 0x94, 0x53, 0xb1, 0x6e, 0x3b, 0x3d, 0xdd, 0x3d, 0x3d, 0xdd, 0x3d, 0x3d, 0xdd, 0x3d, 0x0b,
0x75, 0x27, 0xf4, 0xb6, 0x42, 0x1a, 0xc4, 0x01, 0x5a, 0xa4, 0x53, 0x3f, 0xf6, 0x26, 0xc4, 0xba,
0x01, 0xad, 0x2f, 0x09, 0x8d, 0xbc, 0xc0, 0xc7, 0xe4, 0xdb, 0x29, 0x89, 0x62, 0xd4, 0x81, 0xc5,
0x23, 0x01, 0xe9, 0x94, 0x36, 0x4b, 0xd7, 0xea, 0x58, 0x0d, 0xad, 0xef, 0x4b, 0xb0, 0xac, 0x91,
0xa3, 0x30, 0xf0, 0x23, 0x32, 0x1b, 0x1b, 0x5d, 0x81, 0x25, 0xb9, 0x88, 0xed, 0x3b, 0x13, 0xd2,
0x29, 0xf3, 0xe9, 0x86, 0x84, 0xf5, 0x9d, 0x09, 0x41, 0x6f, 0xc1, 0xb2, 0x42, 0x51, 0x4c, 0x2a,
0x1c, 0xab, 0x25, 0xc1, 0x72, 0x35, 0xb4, 0x05, 0xe7, 0x14, 0xa2, 0x13, 0x7a, 0x1a, 0x79, 0x9e,
0x23, 0xaf, 0xc8, 0xa9, 0x5e, 0xe8, 0x49, 0x7c, 0xeb, 0x1b, 0xa8, 0xef, 0xf6, 0x07, 0x3b, 0x81,
0xff, 0xd4, 0x1b, 0x31, 0x11, 0x23, 0x42, 0x19, 0x4d, 0xa7, 0xb4, 0x59, 0x61, 0x22, 0xca, 0x21,
0xea, 0x42, 0x2d, 0x22, 0x0e, 0x1d, 0x1e, 0x92, 0xa8, 0x53, 0xe6, 0x53, 0x7a, 0xcc, 0xa8, 0x82,
0x30, 0xf6, 0x02, 0x3f, 0xea, 0x54, 0x04, 0x95, 0x1c, 0x5a, 0xbf, 0x2d, 0x41, 0xe3, 0x20, 0xa0,
0xf1, 0x03, 0x27, 0x0c, 0x3d, 0x7f, 0x84, 0xde, 0x85, 0x1a, 0x57, 0xea, 0x30, 0x18, 0x73, 0x1d,
0xb4, 0xb6, 0x57, 0xb6, 0xa4, 0x48, 0x5b, 0x07, 0x72, 0x02, 0x6b, 0x14, 0x74, 0x15, 0x5a, 0xc3,
0xc0, 0x8f, 0x1d, 0xcf, 0x27, 0xd4, 0x0e, 0x03, 0x1a, 0x73, 0xcd, 0x2c, 0xe0, 0xa6, 0x86, 0x32,
0xe6, 0x68, 0x03, 0xea, 0x87, 0x41, 0x14, 0x0b, 0x8c, 0x0a, 0xc7, 0xa8, 0x31, 0x00, 0x9f, 0x5c,
0x87, 0x45, 0x3e, 0xe9, 0x85, 0x52, 0x07, 0x55, 0x36, 0xdc, 0x0f, 0xad, 0xdf, 0x94, 0x60, 0xe1,
0x41, 0x30, 0xf5, 0xe3, 0xcc, 0x32, 0x4e, 0x7c, 0x28, 0xed, 0x63, 0x2c, 0xe3, 0xc4, 0x87, 0xc9,
0x32, 0x0c, 0x43, 0x98, 0x48, 0x2c, 0xc3, 0x26, 0xbb, 0x50, 0xa3, 0xc4, 0x71, 0x03, 0x7f, 0x7c,
0xcc, 0x45, 0xa8, 0x61, 0x3d, 0x66, 0xb6, 0x8b, 0xc8, 0xd8, 0xf3, 0xa7, 0x2f, 0x6c, 0x4a, 0xc6,
0xce, 0x13, 0x32, 0xe6, 0xa2, 0xd4, 0x70, 0x4b, 0x82, 0xb1, 0x80, 0x5a, 0xcf, 0x60, 0x99, 0x19,
0x3b, 0x0a, 0x9d, 0x21, 0x79, 0xc8, 0x55, 0xc8, 0x5c, 0x83, 0x2f, 0xea, 0x93, 0xf8, 0xbb, 0x80,
0x3e, 0xe7, 0x92, 0xd5, 0x70, 0x83, 0xc1, 0xfa, 0x02, 0x84, 0x2e, 0x40, 0x4d, 0xc8, 0xe5, 0xb9,
0x5c, 0xac, 0x1a, 0xe6, 0x3b, 0x3e, 0xf0, 0x5c, 0x3d, 0xe5, 0x85, 0x43, 0x29, 0xd5, 0xa2, 0xd8,
0xfd, 0xd0, 0xfa, 0x65, 0x09, 0xce, 0xdf, 0x67, 0x8b, 0x1f, 0x04, 0xee, 0xc0, 0xf1, 0xdd, 0x27,
0xc1, 0x0b, 0xe9, 0x04, 0xaf, 0x43, 0x73, 0x38, 0xa2, 0xc1, 0x34, 0xb4, 0x43, 0x87, 0x12, 0x3f,
0x96, 0xda, 0x58, 0x12, 0xc0, 0x03, 0x0e, 0x43, 0x7b, 0xb0, 0xe2, 0x2b, 0x51, 0x6d, 0x65, 0x7d,
0xb6, 0x7a, 0x63, 0xbb, 0xa3, 0x4d, 0x9a, 0xd9, 0x0c, 0x6e, 0xfb, 0x69, 0x40, 0x64, 0x51, 0x40,
0xc9, 0xfa, 0x0f, 0x48, 0xec, 0xb8, 0x4e, 0xec, 0x20, 0x04, 0xf3, 0xfc, 0x1c, 0x88, 0x85, 0xf9,
0x37, 0x6a, 0x43, 0x65, 0x2a, 0x37, 0x58, 0xc7, 0xec, 0x13, 0xbd, 0x06, 0x75, 0xcd, 0x4f, 0x1e,
0x86, 0x04, 0xc0, 0x9c, 0xd2, 0x89, 0x63, 0x32, 0x09, 0x63, 0xae, 0xec, 0x26, 0x56, 0x43, 0xeb,
0xaf, 0xf3, 0xd0, 0xce, 0x6d, 0xfa, 0x16, 0xd4, 0x26, 0x72, 0x79, 0xbe, 0x6c, 0x63, 0x7b, 0x23,
0xf1, 0xcc, 0x9c, 0x84, 0x58, 0x23, 0x33, 0xc3, 0x33, 0x95, 0x1a, 0xe7, 0x56, 0x8f, 0x99, 0x26,
0xc7, 0xc1, 0xc8, 0x76, 0x3d, 0x4a, 0x86, 0x71, 0x40, 0x8f, 0xa5, 0x94, 0x4b, 0xe3, 0x60, 0xb4,
0xab, 0x60, 0xe8, 0x26, 0x80, 0xeb, 0x47, 0xf6, 0x90, 0xcb, 0xc1, 0x65, 0x6d, 0x6c, 0x23, 0xbd,
0xb6, 0x3e, 0x9b, 0xb8, 0xee, 0xfa, 0x91, 0x14, 0xf6, 0x03, 0x68, 0x32, 0x5f, 0xb7, 0x27, 0xe2,
0x58, 0x45, 0x9d, 0x85, 0xcd, 0xca, 0xb5, 0xc6, 0xf6, 0xaa, 0x21, 0xb1, 0x3e, 0x73, 0x78, 0x29,
0x4c, 0x06, 0x11, 0xba, 0x03, 0x55, 0xee, 0x6b, 0x51, 0xa7, 0xca, 0x69, 0xae, 0x16, 0xec, 0x52,
0xac, 0xb2, 0x75, 0x9f, 0xe3, 0xed, 0xf9, 0x31, 0x3d, 0xc6, 0x92, 0x08, 0xdd, 0x87, 0x86, 0xe3,
0xfb, 0x41, 0xec, 0x08, 0x83, 0x2f, 0x72, 0x1e, 0x37, 0x66, 0xf3, 0xe8, 0x25, 0xc8, 0x82, 0x91,
0x49, 0x8e, 0xfe, 0x1b, 0x16, 0xb8, 0xff, 0x77, 0x6a, 0x7c, 0xd7, 0x97, 0x34, 0x9f, 0x42, 0xc7,
0xc4, 0x02, 0xb9, 0xfb, 0x01, 0x34, 0x0c, 0xd1, 0x98, 0x63, 0x3c, 0x27, 0xc7, 0xd2, 0x57, 0xd8,
0x27, 0x5a, 0x85, 0x85, 0x23, 0x67, 0x3c, 0x55, 0xf6, 0x10, 0x83, 0xdb, 0xe5, 0xff, 0x2d, 0x75,
0xef, 0x42, 0x3b, 0x2b, 0xd1, 0x59, 0xe8, 0xad, 0x7d, 0x58, 0xc5, 0x53, 0x3f, 0x11, 0x4c, 0x5d,
0x04, 0x37, 0xa1, 0x2a, 0xed, 0x27, 0x7c, 0xe7, 0xc2, 0x4c, 0x8d, 0x60, 0x89, 0x68, 0xdd, 0x81,
0xf3, 0x19, 0x56, 0xf2, 0x9a, 0x78, 0x03, 0x5a, 0x61, 0xe0, 0xda, 0x91, 0x00, 0xdb, 0x9e, 0xab,
0xce, 0x5f, 0xa8, 0x71, 0xf7, 0x5d, 0x46, 0x3e, 0x88, 0x83, 0x30, 0x2f, 0xca, 0xe9, 0xc8, 0x3b,
0xb0, 0x96, 0x25, 0x17, 0xcb, 0x5b, 0x1f, 0xc3, 0x3a, 0x26, 0x93, 0xe0, 0x88, 0xbc, 0x2c, 0xeb,
0x2e, 0x74, 0xf2, 0x0c, 0x12, 0xe6, 0x09, 0x74, 0x10, 0x3b, 0xf1, 0x34, 0x3a, 0x1b, 0xf3, 0xeb,
0x26, 0x03, 0x19, 0x00, 0x05, 0x1f, 0xd4, 0x82, 0xb2, 0x17, 0x4a, 0xa2, 0xb2, 0x17, 0x5a, 0x5f,
0x43, 0xbd, 0x6f, 0x46, 0x03, 0x33, 0x82, 0xd6, 0xb1, 0x1a, 0xa2, 0xed, 0xe4, 0xf2, 0xfa, 0xa1,
0xf0, 0xa5, 0xaf, 0xb5, 0x7b, 0xb9, 0xd0, 0x29, 0x65, 0xd8, 0x06, 0xd0, 0x11, 0x28, 0x92, 0xbe,
0x80, 0xf2, 0xfc, 0xb0, 0x81, 0x65, 0xfd, 0x21, 0x15, 0x8e, 0x8c, 0xcd, 0xb8, 0x7a, 0x33, 0x6e,
0x2a, 0x3c, 0x95, 0xcf, 0x12, 0x9e, 0x6e, 0xc0, 0x42, 0xc4, 0x1c, 0x26, 0x03, 0x64, 0xcb, 0xd8,
0x5c, 0x7a, 0x49, 0x82, 0x25, 0x1a, 0xba, 0x00, 0x30, 0xa4, 0xc4, 0x61, 0xc4, 0xb5, 0x1d, 0x19,
0x39, 0x2b, 0xb8, 0xae, 0x20, 0x3d, 0x86, 0x6e, 0x27, 0x7a, 0x5c, 0x10, 0x62, 0x6c, 0x15, 0x30,
0x4c, 0xd9, 0x25, 0xd1, 0xb4, 0x3e, 0xed, 0xd5, 0x93, 0x4f, 0xbb, 0xa2, 0x93, 0xc8, 0x46, 0xc0,
0x5a, 0x9c, 0x19, 0xb0, 0x24, 0xc5, 0x69, 0x02, 0x56, 0x6d, 0x66, 0xc0, 0x52, 0x3c, 0x4e, 0x0c,
0x58, 0x3f, 0x65, 0xe8, 0x79, 0x00, 0x9d, 0xfc, 0xd1, 0x51, 0x21, 0xe3, 0x26, 0x54, 0x23, 0x01,
0x39, 0x21, 0xfc, 0x28, 0x12, 0x85, 0x68, 0xfd, 0xbd, 0x64, 0x7a, 0xdd, 0x67, 0xde, 0x98, 0x11,
0x9a, 0xf3, 0x3a, 0xed, 0x3c, 0xe5, 0xd3, 0x39, 0xcf, 0x00, 0x5a, 0x42, 0xed, 0x76, 0x44, 0xc6,
0xe2, 0x76, 0x13, 0xf9, 0x60, 0x63, 0xfb, 0x9d, 0x02, 0x42, 0xb9, 0xa4, 0xb4, 0xd9, 0x40, 0xa1,
0x4b, 0x8d, 0x37, 0xc7, 0x26, 0xac, 0xfb, 0x09, 0xa0, 0x3c, 0xd2, 0x99, 0x54, 0xf7, 0x05, 0x3f,
0xae, 0x3c, 0x1d, 0x2c, 0x08, 0xdb, 0x4f, 0x85, 0x18, 0x27, 0xe8, 0x4d, 0xca, 0x89, 0x15, 0xa2,
0xf5, 0xbb, 0x0a, 0x40, 0x32, 0xf9, 0xca, 0x9e, 0xd3, 0x5b, 0xfa, 0xd4, 0xc8, 0xd4, 0xe0, 0x52,
0x01, 0xbf, 0xc2, 0xf3, 0xf2, 0x59, 0xfa, 0xbc, 0xc8, 0x24, 0xe1, 0x8d, 0x22, 0xea, 0x57, 0xf6,
0xa4, 0xec, 0xc0, 0x7a, 0xd6, 0xdc, 0xea, 0x9c, 0x5c, 0x83, 0x05, 0x8f, 0x91, 0x89, 0x2c, 0x6e,
0x1a, 0xdb, 0xab, 0x05, 0xdb, 0xc2, 0x12, 0xc3, 0xba, 0x0c, 0xf5, 0xfd, 0x89, 0x33, 0x22, 0x83,
0x90, 0x0c, 0xf9, 0x5a, 0x1e, 0x1f, 0xa8, 0xf5, 0xe5, 0xc0, 0xda, 0x86, 0xda, 0x3d, 0x72, 0xfc,
0x25, 0x5f, 0xf7, 0xb4, 0xf2, 0x59, 0x7f, 0x2d, 0xc1, 0x86, 0x08, 0x77, 0x3b, 0x71, 0x69, 0x81,
0x49, 0x14, 0x4c, 0xe9, 0x90, 0x44, 0xc2, 0xa4, 0xe1, 0xd4, 0x0e, 0x09, 0xf5, 0x02, 0xe9, 0x53,
0xdc, 0xa4, 0xe1, 0xf4, 0x40, 0x00, 0x78, 0xf9, 0xc1, 0xa7, 0xbf, 0x9d, 0x06, 0xca, 0xb7, 0x2a,
0xb8, 0x36, 0x0c, 0xa7, 0xff, 0xcf, 0xc7, 0x31, 0x6d, 0x74, 0xe8, 0x50, 0x12, 0x09, 0x1f, 0x92,
0xb4, 0x03, 0x01, 0x40, 0x37, 0xe1, 0xdc, 0x84, 0x4c, 0x02, 0x7a, 0x6c, 0x8f, 0xbd, 0x89, 0xc7,
0x6c, 0xcf, 0xb7, 0x9f, 0x1c, 0x33, 0x12, 0x29, 0xc7, 0x41, 0x72, 0xf2, 0x3e, 0x9f, 0xdb, 0xf7,
0x3f, 0xe5, 0x33, 0xc8, 0x82, 0x66, 0x10, 0x4c, 0xec, 0x68, 0x18, 0x50, 0x62, 0x3b, 0xee, 0x33,
0x11, 0xef, 0x2b, 0xb8, 0x11, 0x04, 0x93, 0x01, 0x87, 0xf5, 0xdc, 0x67, 0x96, 0x03, 0xcd, 0xc1,
0x9e, 0xd8, 0x8e, 0xaa, 0x56, 0x10, 0xcc, 0x4f, 0x23, 0x75, 0x9c, 0xea, 0x58, 0x7c, 0x73, 0x18,
0x0d, 0xc6, 0xb1, 0x1e, 0xc4, 0x37, 0x87, 0xb1, 0xe3, 0x30, 0xce, 0xda, 0xc5, 0x37, 0x57, 0xd8,
0x98, 0x1c, 0xa9, 0xda, 0xa8, 0x8e, 0xe5, 0xc0, 0x72, 0x01, 0x76, 0x9c, 0xd0, 0x79, 0xe2, 0x8d,
0x3d, 0x76, 0x8c, 0xae, 0x41, 0xdb, 0x71, 0x5d, 0x7b, 0x18, 0x43, 0x3c, 0x12, 0x17, 0xaa, 0xcb,
0x8e, 0xeb, 0xee, 0x18, 0x60, 0xf4, 0x36, 0xac, 0xb8, 0x34, 0x08, 0xd3, 0xb8, 0xb2, 0x72, 0x6d,
0xf3, 0x09, 0x13, 0xd9, 0xfa, 0x67, 0x09, 0xd6, 0xd2, 0x66, 0x51, 0x99, 0xf6, 0x5d, 0xa8, 0xd3,
0xd8, 0x40, 0x2a, 0x48, 0x6c, 0xa5, 0xef, 0xad, 0xbc, 0x21, 0x71, 0x42, 0x82, 0x6e, 0xc1, 0x52,
0x46, 0x80, 0x52, 0xca, 0xf1, 0x92, 0xbd, 0xe1, 0x14, 0x22, 0xfa, 0x38, 0xa9, 0x19, 0x93, 0xda,
0x9a, 0xd3, 0xae, 0x6b, 0xda, 0x94, 0xea, 0x75, 0x2d, 0xa9, 0x2a, 0x2b, 0xf4, 0xa6, 0x32, 0x45,
0xb6, 0xa0, 0x10, 0x34, 0x8f, 0x23, 0x42, 0xa5, 0x79, 0xac, 0xaf, 0xa0, 0xae, 0x41, 0x71, 0x91,
0x25, 0x7d, 0x4f, 0x14, 0x59, 0x6d, 0xa8, 0x8c, 0x54, 0xd9, 0x55, 0xc1, 0xfc, 0x93, 0x57, 0xb3,
0x8e, 0xeb, 0x7a, 0x7c, 0x15, 0x67, 0x6c, 0x8f, 0x3c, 0x57, 0x56, 0xfd, 0x15, 0xdc, 0x4a, 0xc0,
0x9f, 0x7b, 0x6e, 0x64, 0xf5, 0x60, 0x45, 0x2b, 0xe7, 0xc4, 0xd2, 0xce, 0x28, 0xd5, 0xca, 0xe9,
0x52, 0xcd, 0x87, 0xea, 0x2e, 0x39, 0xf2, 0x86, 0xe4, 0xdf, 0x52, 0xa3, 0x6f, 0x41, 0x23, 0x24,
0x74, 0xe2, 0x45, 0x91, 0xd6, 0x67, 0x1d, 0x9b, 0x20, 0xeb, 0xf7, 0x55, 0x58, 0xce, 0xba, 0xc0,
0xfb, 0xb9, 0xca, 0xb0, 0x9b, 0x98, 0x2f, 0xbb, 0x3f, 0x23, 0xa2, 0x5f, 0x8d, 0x83, 0x46, 0x39,
0x63, 0x01, 0x1d, 0x57, 0x54, 0x20, 0xe1, 0xfb, 0x1f, 0x06, 0x93, 0x89, 0xe3, 0xbb, 0x71, 0xff,
0x44, 0x0d, 0xb9, 0xb6, 0x1c, 0x3a, 0xe2, 0xc7, 0x94, 0x83, 0xc5, 0x37, 0xba, 0x04, 0x0d, 0x9e,
0x4e, 0x79, 0xbe, 0x28, 0x2c, 0xc5, 0xb1, 0xac, 0x63, 0x50, 0xa0, 0x5d, 0x8f, 0xa2, 0x2b, 0x30,
0x4f, 0xfc, 0xa3, 0x38, 0x76, 0x27, 0x0d, 0x96, 0x38, 0x58, 0x61, 0x31, 0x8d, 0xde, 0x84, 0xea,
0x24, 0x98, 0xfa, 0x2c, 0x4e, 0xac, 0x5a, 0x1a, 0x51, 0x74, 0x45, 0xb0, 0x9a, 0x45, 0xd7, 0x60,
0xd1, 0x15, 0x36, 0x88, 0xb3, 0xa7, 0xe5, 0xa4, 0x38, 0x15, 0x70, 0x1c, 0xcf, 0xa3, 0x8f, 0xf4,
0xad, 0x53, 0xcf, 0xdc, 0x1b, 0x19, 0xa5, 0x16, 0x5e, 0x3d, 0xf7, 0xd2, 0x57, 0x0f, 0x08, 0x16,
0xd7, 0x66, 0xb2, 0x38, 0xb9, 0xb4, 0xbc, 0x08, 0x10, 0x52, 0xef, 0xc8, 0x1b, 0x93, 0x11, 0x71,
0x3b, 0x0d, 0xd1, 0xfb, 0x30, 0x20, 0xa2, 0x9f, 0xa6, 0xfa, 0x33, 0x36, 0x0d, 0x02, 0xf6, 0x34,
0xea, 0x2c, 0xc9, 0x9e, 0x4c, 0x0c, 0xc6, 0x02, 0x8a, 0xce, 0x43, 0x8d, 0xd7, 0xf0, 0xc2, 0xa1,
0x9a, 0xb2, 0x74, 0x18, 0x07, 0x23, 0xe1, 0x4f, 0x6b, 0xfc, 0xce, 0x76, 0x3d, 0xbf, 0xd3, 0x12,
0x94, 0x72, 0xc0, 0x43, 0xb1, 0xf8, 0xb0, 0x03, 0x7f, 0x48, 0x3a, 0xcb, 0x62, 0xaa, 0x2e, 0x20,
0x0f, 0xfd, 0xa1, 0xb8, 0x29, 0x18, 0x3b, 0xee, 0xb4, 0x05, 0x9c, 0x7f, 0xa2, 0xff, 0x8a, 0xf3,
0xe2, 0x15, 0xe1, 0x28, 0x17, 0x66, 0xc4, 0x97, 0x57, 0xa6, 0x08, 0xfe, 0x53, 0x09, 0xd6, 0x77,
0x44, 0xa6, 0x61, 0xc4, 0xbe, 0x33, 0x14, 0x71, 0xe8, 0x3d, 0x5d, 0x2d, 0x67, 0x2b, 0xae, 0xec,
0x66, 0x15, 0x1e, 0xfa, 0x04, 0x5a, 0x31, 0x4f, 0x45, 0x59, 0xf9, 0xa1, 0x3a, 0xbb, 0x19, 0x99,
0x43, 0xeb, 0x23, 0xd8, 0xc8, 0xc9, 0xac, 0xb2, 0x82, 0xcb, 0xb0, 0x94, 0x84, 0x16, 0x2d, 0x72,
0x43, 0xc3, 0xf6, 0x5d, 0xeb, 0x36, 0xaf, 0xb6, 0x1d, 0xca, 0x72, 0x1b, 0x3e, 0x05, 0xad, 0x28,
0xb5, 0xd3, 0xb4, 0xaa, 0x1a, 0x1e, 0xc0, 0x1a, 0x2f, 0xc2, 0x5f, 0x82, 0x29, 0x0f, 0x19, 0x7c,
0xdb, 0xc1, 0x94, 0xa9, 0xd0, 0x1c, 0x0f, 0xad, 0x0d, 0xd9, 0x18, 0xc8, 0xaf, 0xf6, 0x21, 0xac,
0xcb, 0xba, 0xfc, 0x65, 0x36, 0x71, 0x3e, 0xee, 0x0a, 0xe4, 0xf9, 0xfe, 0xba, 0x6c, 0xc4, 0xcc,
0x19, 0x85, 0xc4, 0xbb, 0xe9, 0x42, 0x62, 0x23, 0x6f, 0xf0, 0x54, 0x72, 0x9b, 0x77, 0xa3, 0x4a,
0x81, 0x1b, 0xe1, 0x5c, 0xb5, 0x31, 0x2f, 0x42, 0xc6, 0xdb, 0x79, 0xee, 0xff, 0xc1, 0x62, 0x63,
0x5f, 0x16, 0x1b, 0x7a, 0x69, 0xdd, 0xe0, 0x78, 0x2f, 0x53, 0x6c, 0x74, 0x66, 0x89, 0xa9, 0x6b,
0x8d, 0x5f, 0xcd, 0x43, 0x5d, 0xcf, 0xe5, 0x74, 0x9a, 0x57, 0x52, 0xb9, 0x40, 0x49, 0xe6, 0xed,
0x55, 0x79, 0x99, 0xdb, 0x6b, 0xfe, 0x87, 0x6e, 0xaf, 0x4d, 0xa8, 0x8b, 0x0f, 0x9b, 0x92, 0xa7,
0xea, 0x36, 0xaa, 0x09, 0x00, 0x26, 0x4f, 0x13, 0xc3, 0x57, 0x4f, 0x65, 0xf8, 0x74, 0x55, 0xb3,
0x98, 0xad, 0x6a, 0xde, 0xd7, 0xf7, 0x8b, 0xbc, 0x89, 0x2e, 0xe6, 0xd9, 0x15, 0xde, 0x2c, 0x7b,
0xe9, 0x9b, 0x45, 0x5e, 0x4e, 0xaf, 0x17, 0x10, 0xbf, 0xb2, 0x35, 0xcd, 0x7d, 0x59, 0xd3, 0x98,
0x5e, 0xa5, 0xa2, 0xd7, 0x36, 0x80, 0x3e, 0xa8, 0x71, 0x61, 0x83, 0xf2, 0x5b, 0xc3, 0x06, 0x16,
0x0f, 0x05, 0x29, 0xfd, 0x27, 0x5d, 0xb8, 0x53, 0x84, 0x82, 0x3f, 0x2e, 0x18, 0xe7, 0x7d, 0x46,
0xbb, 0xea, 0xfd, 0x5c, 0x19, 0x7c, 0x3a, 0xaf, 0x7b, 0x37, 0x5d, 0x05, 0x9f, 0xcd, 0x5d, 0x72,
0x45, 0xb0, 0xb8, 0x89, 0x1d, 0xaa, 0xa6, 0x65, 0xfd, 0x52, 0x57, 0x90, 0x1e, 0xe3, 0x89, 0xd4,
0x53, 0xcf, 0xf7, 0xa2, 0x43, 0x39, 0x5f, 0x15, 0xf3, 0x10, 0x83, 0x7a, 0xe2, 0x5d, 0x89, 0xbc,
0xf0, 0x98, 0x3d, 0x0c, 0x5c, 0x22, 0x9c, 0x71, 0x01, 0xd7, 0x38, 0x60, 0x27, 0x70, 0x49, 0x72,
0x40, 0x6a, 0x67, 0x3a, 0x20, 0xf5, 0xcc, 0x01, 0x59, 0x87, 0x2a, 0x25, 0x4e, 0x14, 0xf8, 0x1d,
0x90, 0xaf, 0x53, 0x72, 0xc4, 0x03, 0xfc, 0x84, 0x44, 0x11, 0x5f, 0xa0, 0x21, 0xb3, 0x0e, 0x35,
0x34, 0x92, 0xac, 0xa5, 0x59, 0x49, 0xd6, 0x09, 0xfd, 0xb0, 0x4c, 0x92, 0xd5, 0x9c, 0x95, 0x64,
0x9d, 0xa6, 0x1d, 0x66, 0xa4, 0x90, 0xad, 0x93, 0x52, 0xc8, 0x9f, 0xf2, 0xe0, 0xdc, 0x83, 0x8d,
0x9c, 0xab, 0xab, 0x93, 0xf3, 0x5e, 0xa6, 0x6b, 0xd6, 0x99, 0xa5, 0x05, 0xdd, 0x34, 0xfb, 0x39,
0x2c, 0xef, 0xbd, 0x20, 0xc3, 0xc1, 0xb1, 0x3f, 0x3c, 0xc3, 0x5d, 0xdd, 0x86, 0xca, 0x70, 0xe2,
0xaa, 0xda, 0x93, 0x7f, 0x9a, 0xb7, 0x77, 0x25, 0x7d, 0x7b, 0xdb, 0xd0, 0x4e, 0x56, 0x50, 0x72,
0xae, 0x73, 0x39, 0x5d, 0x8e, 0xcc, 0x99, 0x2f, 0x61, 0x35, 0x52, 0x70, 0x42, 0xa9, 0xd8, 0xb5,
0x84, 0x13, 0x4a, 0xd3, 0x6e, 0x5b, 0x49, 0xbb, 0xad, 0xf5, 0x0c, 0x1a, 0x7c, 0x81, 0x1f, 0x25,
0xbe, 0x4a, 0x61, 0x2b, 0x49, 0x0a, 0xab, 0x33, 0xe1, 0x79, 0x23, 0x13, 0xb6, 0xb6, 0x60, 0x49,
0xae, 0xa5, 0x36, 0xc2, 0xab, 0x4b, 0x3a, 0x8e, 0xed, 0x36, 0xa5, 0x63, 0xeb, 0xff, 0xa0, 0xd9,
0x63, 0xcc, 0x19, 0x1e, 0x9e, 0x41, 0x1e, 0xbd, 0x56, 0xd9, 0x5c, 0xcb, 0x82, 0x56, 0xcc, 0x69,
0xe6, 0x6a, 0x7d, 0x40, 0x07, 0x01, 0x65, 0x9f, 0x05, 0xf4, 0x3b, 0x87, 0xba, 0x67, 0xcb, 0x59,
0x11, 0xcc, 0xab, 0x07, 0xe8, 0xca, 0xd5, 0x05, 0x2c, 0xbe, 0xad, 0xb7, 0x60, 0x35, 0xc5, 0x6f,
0xe6, 0xc2, 0xb7, 0xa0, 0x21, 0xa2, 0x82, 0xca, 0x8e, 0xae, 0x9a, 0xed, 0xa4, 0x93, 0x42, 0x07,
0x2f, 0xa1, 0x79, 0xd8, 0x17, 0x70, 0x1d, 0xa3, 0xdf, 0xc9, 0x24, 0x12, 0x6b, 0x69, 0xfa, 0x4c,
0x12, 0xf1, 0x1c, 0x16, 0x04, 0x38, 0x17, 0xa3, 0x37, 0xa1, 0x4e, 0x49, 0x18, 0xd8, 0xcc, 0x19,
0xe9, 0x27, 0x7d, 0x0e, 0x78, 0xe4, 0x8c, 0x22, 0xf1, 0x47, 0x02, 0x9f, 0x74, 0xbd, 0x11, 0x89,
0x58, 0xfc, 0xae, 0xdf, 0xe0, 0xb0, 0x5d, 0x09, 0xe2, 0x1a, 0x89, 0xbc, 0x5f, 0xc8, 0x04, 0x61,
0x1e, 0x8b, 0x6f, 0xeb, 0x23, 0x40, 0xa6, 0xbc, 0x4a, 0x21, 0x6f, 0x42, 0x55, 0x6c, 0x27, 0xbe,
0x9e, 0x5a, 0x69, 0x81, 0xb1, 0x9a, 0xb5, 0xee, 0x02, 0x92, 0x1a, 0x48, 0x5d, 0x49, 0xa7, 0xd7,
0xd6, 0x87, 0xb0, 0x9a, 0xa2, 0xd7, 0x0f, 0x6a, 0x29, 0x06, 0xd9, 0xd5, 0x15, 0xf1, 0xdf, 0x4a,
0x00, 0xbd, 0x29, 0x3b, 0x54, 0x55, 0x7f, 0x17, 0x6a, 0xd3, 0x88, 0x50, 0xa3, 0x57, 0xa1, 0xc7,
0x7c, 0x2e, 0x74, 0xa2, 0xe8, 0xbb, 0x80, 0xc6, 0x39, 0x97, 0x1e, 0x8b, 0x8a, 0x7d, 0xca, 0x0e,
0xe3, 0xce, 0x16, 0xff, 0x46, 0x57, 0xa0, 0x25, 0x7f, 0xa3, 0xb0, 0x1d, 0xd7, 0xa5, 0x24, 0x8a,
0x54, 0x8b, 0xab, 0x29, 0xa1, 0x3d, 0x09, 0xe4, 0x68, 0x9e, 0x4b, 0x7c, 0xe6, 0xb1, 0x63, 0x9b,
0x05, 0xcf, 0x89, 0xaf, 0xb2, 0xa9, 0x66, 0x0c, 0x7d, 0xc4, 0x81, 0x1c, 0x8d, 0x92, 0x91, 0x17,
0x31, 0x1a, 0xa3, 0x55, 0x25, 0x5a, 0x0c, 0x15, 0x68, 0xd6, 0xf7, 0x25, 0x68, 0x1f, 0x4c, 0xc7,
0x63, 0xb9, 0xc9, 0xb3, 0xea, 0x12, 0xbd, 0xa5, 0xf6, 0x91, 0x6d, 0x58, 0x25, 0x2a, 0x52, 0x9b,
0xfb, 0xf1, 0xa5, 0xd9, 0x2a, 0xac, 0x18, 0x82, 0xaa, 0xaa, 0xe2, 0x2e, 0x20, 0x59, 0x70, 0xbc,
0x9c, 0xfc, 0xd6, 0x39, 0x58, 0x4d, 0xd1, 0x2b, 0xb6, 0xd7, 0xa1, 0xa9, 0x5e, 0xa7, 0x94, 0x9d,
0xcf, 0x43, 0x8d, 0x9f, 0xfe, 0xa1, 0xe7, 0xc6, 0x5d, 0xcb, 0xc5, 0x30, 0x70, 0x77, 0x3c, 0x97,
0x5a, 0x7d, 0x68, 0x62, 0xc9, 0x5e, 0xe1, 0xde, 0x81, 0x96, 0x7a, 0xcb, 0xb2, 0x53, 0xaf, 0xbd,
0x49, 0x4b, 0x2e, 0xc5, 0x1b, 0x37, 0x7d, 0x73, 0x68, 0x7d, 0x03, 0xdd, 0xc7, 0xa1, 0xcb, 0xd3,
0x17, 0x93, 0x6b, 0xbc, 0xb5, 0x3b, 0x10, 0xff, 0xc9, 0x33, 0x8b, 0x79, 0x9a, 0xac, 0x49, 0xcd,
0xa1, 0x75, 0x01, 0x36, 0x0b, 0x99, 0xcb, 0x7d, 0x5f, 0x7f, 0x0d, 0x6a, 0xf1, 0xff, 0x35, 0x68,
0x11, 0x2a, 0x8f, 0x76, 0x0e, 0xda, 0x73, 0xfc, 0xe3, 0xf1, 0xee, 0x41, 0xbb, 0x74, 0xfd, 0x36,
0x2c, 0x67, 0x9e, 0x19, 0xd0, 0x0a, 0x34, 0x07, 0xbd, 0xfe, 0xee, 0xa7, 0x0f, 0xbf, 0xb2, 0xf1,
0x5e, 0x6f, 0xf7, 0xeb, 0xf6, 0x1c, 0x5a, 0x83, 0x76, 0x0c, 0xea, 0x3f, 0x7c, 0x24, 0xa1, 0xa5,
0xeb, 0xcf, 0xa1, 0x95, 0x4e, 0xce, 0xd0, 0x39, 0x58, 0xd9, 0x79, 0xd8, 0x7f, 0xd4, 0xdb, 0xef,
0xef, 0x61, 0x7b, 0x07, 0xef, 0xf5, 0x1e, 0xed, 0xed, 0xb6, 0xe7, 0xd2, 0x60, 0xfc, 0xb8, 0xdf,
0xdf, 0xef, 0x7f, 0xde, 0x2e, 0x71, 0xae, 0x09, 0x78, 0xef, 0xab, 0x7d, 0x8e, 0x5c, 0x4e, 0x23,
0x3f, 0xee, 0xdf, 0xeb, 0x3f, 0xfc, 0x59, 0xbf, 0x5d, 0xd9, 0xfe, 0x07, 0x40, 0x4b, 0x6d, 0x70,
0x40, 0xa8, 0x68, 0x0c, 0xde, 0x85, 0xc5, 0xf8, 0xd7, 0xa7, 0x24, 0x5d, 0x4c, 0xff, 0xa7, 0xd5,
0xed, 0xe4, 0x27, 0x94, 0x3f, 0xcc, 0xa1, 0x03, 0x61, 0x65, 0xe3, 0x49, 0xe7, 0x82, 0xa9, 0xf0,
0xdc, 0x9b, 0x51, 0xf7, 0xe2, 0xac, 0x69, 0xcd, 0x71, 0x00, 0xad, 0xf4, 0xdb, 0x3a, 0x4a, 0x68,
0x0a, 0xdf, 0xec, 0xbb, 0x97, 0x66, 0xce, 0x6b, 0xa6, 0x5f, 0x43, 0x3b, 0xfb, 0xaa, 0x8e, 0x92,
0x4e, 0xf4, 0x8c, 0x17, 0xfb, 0xee, 0xe5, 0x13, 0x30, 0x4c, 0xd6, 0xb9, 0xf7, 0xe7, 0xad, 0xd9,
0x2f, 0x88, 0x39, 0xd6, 0xb3, 0x9e, 0x25, 0xa5, 0x2a, 0xd2, 0x4f, 0x31, 0xc8, 0x7c, 0xf5, 0x2d,
0x78, 0x92, 0x33, 0x54, 0x51, 0xfc, 0x86, 0x63, 0xcd, 0xa1, 0x2f, 0x61, 0x39, 0xd3, 0xca, 0x41,
0x09, 0x55, 0x71, 0x63, 0xaa, 0xbb, 0x35, 0x1b, 0x21, 0x6d, 0x37, 0xb3, 0x51, 0x93, 0xb2, 0x5b,
0x41, 0xf7, 0x27, 0x65, 0xb7, 0xc2, 0x0e, 0x8f, 0x70, 0xaf, 0x54, 0x3b, 0xc6, 0x70, 0xaf, 0xa2,
0xde, 0x4f, 0xf7, 0xe2, 0xac, 0x69, 0x73, 0xfb, 0x99, 0x56, 0x8c, 0xb1, 0xfd, 0xe2, 0x0e, 0x4f,
0x77, 0x6b, 0x36, 0x42, 0xd6, 0x56, 0x49, 0x89, 0x99, 0xb1, 0x55, 0xae, 0xa3, 0x91, 0xb1, 0x55,
0xbe, 0x36, 0x55, 0xb6, 0xca, 0xd4, 0x8a, 0x97, 0x66, 0xa6, 0xd9, 0x79, 0x5b, 0x15, 0x67, 0xee,
0xd6, 0x1c, 0xea, 0x41, 0x2d, 0xce, 0x93, 0x51, 0x72, 0xba, 0x33, 0xc9, 0x79, 0xf7, 0x7c, 0xc1,
0x8c, 0x66, 0xf1, 0x3f, 0x30, 0xcf, 0xa1, 0x68, 0x2d, 0x85, 0x14, 0x93, 0x9e, 0xcb, 0x40, 0x35,
0xd9, 0x87, 0x50, 0x95, 0x89, 0x26, 0x4a, 0x22, 0x73, 0x2a, 0x87, 0xed, 0x6e, 0xe4, 0xe0, 0x9a,
0xf8, 0x0b, 0xf9, 0x3b, 0xa4, 0xca, 0x18, 0xd1, 0x66, 0xea, 0x87, 0xad, 0x74, 0x5e, 0xda, 0x7d,
0xad, 0x78, 0x52, 0xf3, 0x7a, 0x02, 0xab, 0x05, 0x11, 0x1f, 0x25, 0x6d, 0x8d, 0xd9, 0x97, 0x4d,
0xf7, 0x8d, 0x93, 0x91, 0xe2, 0x35, 0xb6, 0xff, 0x5c, 0x86, 0x25, 0x79, 0xb5, 0xaa, 0x68, 0xfb,
0x39, 0x40, 0x92, 0xe0, 0xa1, 0x6e, 0xca, 0x01, 0x52, 0x59, 0x6a, 0x77, 0xb3, 0x70, 0xce, 0xd4,
0x84, 0x91, 0xab, 0x19, 0x9a, 0xc8, 0x67, 0x80, 0x86, 0x26, 0x0a, 0xd2, 0x3b, 0x6b, 0x0e, 0xed,
0x42, 0x5d, 0x27, 0x10, 0xc8, 0xc8, 0x3b, 0x32, 0xd9, 0x4f, 0xb7, 0x5b, 0x34, 0x65, 0x4a, 0x64,
0x64, 0x0c, 0x86, 0x44, 0xf9, 0x3c, 0xc4, 0x90, 0xa8, 0x28, 0xc9, 0x98, 0xfb, 0x57, 0x00, 0x00,
0x00, 0xff, 0xff, 0xc4, 0xce, 0xc1, 0x50, 0x3f, 0x2c, 0x00, 0x00,
0x2a, 0x3c, 0x95, 0xcf, 0x12, 0x9e, 0xb6, 0x60, 0x21, 0x8a, 0x9d, 0x58, 0x04, 0xc8, 0x96, 0xb1,
0xb9, 0xf4, 0x92, 0x04, 0x0b, 0x34, 0x74, 0x11, 0x60, 0x48, 0x89, 0x13, 0x13, 0xd7, 0x76, 0x44,
0xe4, 0xac, 0xe0, 0xba, 0x84, 0xf4, 0x62, 0x74, 0x3b, 0xd1, 0xe3, 0x02, 0x17, 0x63, 0xb3, 0x80,
0x61, 0xca, 0x2e, 0x89, 0xa6, 0xf5, 0x69, 0xaf, 0x9e, 0x7c, 0xda, 0x25, 0x9d, 0x40, 0x36, 0x02,
0xd6, 0xe2, 0xcc, 0x80, 0x25, 0x28, 0x4e, 0x13, 0xb0, 0x6a, 0x33, 0x03, 0x96, 0xe4, 0x71, 0x62,
0xc0, 0xfa, 0x29, 0x43, 0xcf, 0x03, 0xe8, 0xe4, 0x8f, 0x8e, 0x0c, 0x19, 0x37, 0xa1, 0x1a, 0x71,
0xc8, 0x09, 0xe1, 0x47, 0x92, 0x48, 0x44, 0xeb, 0x1f, 0x25, 0xd3, 0xeb, 0x3e, 0xf3, 0xc6, 0x31,
0xa1, 0x39, 0xaf, 0xd3, 0xce, 0x53, 0x3e, 0x9d, 0xf3, 0x0c, 0xa0, 0xc5, 0xd5, 0x6e, 0x47, 0x64,
0xcc, 0x6f, 0x37, 0x9e, 0x0f, 0x36, 0xb6, 0xdf, 0x29, 0x20, 0x14, 0x4b, 0x0a, 0x9b, 0x0d, 0x24,
0xba, 0xd0, 0x78, 0x73, 0x6c, 0xc2, 0xba, 0x9f, 0x00, 0xca, 0x23, 0x9d, 0x49, 0x75, 0x5f, 0xb0,
0xe3, 0xca, 0xd2, 0xc1, 0x82, 0xb0, 0xfd, 0x94, 0x8b, 0x71, 0x82, 0xde, 0x84, 0x9c, 0x58, 0x22,
0x5a, 0xbf, 0xab, 0x00, 0x24, 0x93, 0xaf, 0xec, 0x39, 0xbd, 0xa5, 0x4f, 0x8d, 0x48, 0x0d, 0x2e,
0x17, 0xf0, 0x2b, 0x3c, 0x2f, 0x9f, 0xa5, 0xcf, 0x8b, 0x48, 0x12, 0xde, 0x28, 0xa2, 0x7e, 0x65,
0x4f, 0xca, 0x0e, 0xac, 0x65, 0xcd, 0x2d, 0xcf, 0xc9, 0x75, 0x58, 0xf0, 0x62, 0x32, 0x11, 0xc5,
0x4d, 0x63, 0xfb, 0x5c, 0xc1, 0xb6, 0xb0, 0xc0, 0xb0, 0xae, 0x40, 0x7d, 0x7f, 0xe2, 0x8c, 0xc8,
0x20, 0x24, 0x43, 0xb6, 0x96, 0xc7, 0x06, 0x72, 0x7d, 0x31, 0xb0, 0xb6, 0xa1, 0x76, 0x8f, 0x1c,
0x7f, 0xc9, 0xd6, 0x3d, 0xad, 0x7c, 0xd6, 0xdf, 0x4a, 0xb0, 0xce, 0xc3, 0xdd, 0x8e, 0x2a, 0x2d,
0x30, 0x89, 0x82, 0x29, 0x1d, 0x92, 0x88, 0x9b, 0x34, 0x9c, 0xda, 0x21, 0xa1, 0x5e, 0x20, 0x7c,
0x8a, 0x99, 0x34, 0x9c, 0x1e, 0x70, 0x00, 0x2b, 0x3f, 0xd8, 0xf4, 0xb7, 0xd3, 0x40, 0xfa, 0x56,
0x05, 0xd7, 0x86, 0xe1, 0xf4, 0xff, 0xd9, 0x58, 0xd1, 0x46, 0x87, 0x0e, 0x25, 0x11, 0xf7, 0x21,
0x41, 0x3b, 0xe0, 0x00, 0x74, 0x13, 0xce, 0x4f, 0xc8, 0x24, 0xa0, 0xc7, 0xf6, 0xd8, 0x9b, 0x78,
0xb1, 0xed, 0xf9, 0xf6, 0x93, 0xe3, 0x98, 0x44, 0xd2, 0x71, 0x90, 0x98, 0xbc, 0xcf, 0xe6, 0xf6,
0xfd, 0x4f, 0xd9, 0x0c, 0xb2, 0xa0, 0x19, 0x04, 0x13, 0x3b, 0x1a, 0x06, 0x94, 0xd8, 0x8e, 0xfb,
0x8c, 0xc7, 0xfb, 0x0a, 0x6e, 0x04, 0xc1, 0x64, 0xc0, 0x60, 0x3d, 0xf7, 0x99, 0xe5, 0x40, 0x73,
0xb0, 0xc7, 0xb7, 0x23, 0xab, 0x15, 0x04, 0xf3, 0xd3, 0x48, 0x1e, 0xa7, 0x3a, 0xe6, 0xdf, 0x0c,
0x46, 0x83, 0xb1, 0xd2, 0x03, 0xff, 0x66, 0xb0, 0xf8, 0x38, 0x54, 0x59, 0x3b, 0xff, 0x66, 0x0a,
0x1b, 0x93, 0x23, 0x59, 0x1b, 0xd5, 0xb1, 0x18, 0x58, 0x2e, 0xc0, 0x8e, 0x13, 0x3a, 0x4f, 0xbc,
0xb1, 0x17, 0x1f, 0xa3, 0xeb, 0xd0, 0x76, 0x5c, 0xd7, 0x1e, 0x2a, 0x88, 0x47, 0x54, 0xa1, 0xba,
0xec, 0xb8, 0xee, 0x8e, 0x01, 0x46, 0x6f, 0xc3, 0x8a, 0x4b, 0x83, 0x30, 0x8d, 0x2b, 0x2a, 0xd7,
0x36, 0x9b, 0x30, 0x91, 0xad, 0x7f, 0x96, 0x60, 0x35, 0x6d, 0x16, 0x99, 0x69, 0xdf, 0x85, 0x3a,
0x55, 0x06, 0x92, 0x41, 0x62, 0x33, 0x7d, 0x6f, 0xe5, 0x0d, 0x89, 0x13, 0x12, 0x74, 0x0b, 0x96,
0x32, 0x02, 0x94, 0x52, 0x8e, 0x97, 0xec, 0x0d, 0xa7, 0x10, 0xd1, 0xc7, 0x49, 0xcd, 0x98, 0xd4,
0xd6, 0x8c, 0x76, 0x4d, 0xd3, 0xa6, 0x54, 0xaf, 0x6b, 0x49, 0x59, 0x59, 0xa1, 0x37, 0xa5, 0x29,
0xb2, 0x05, 0x05, 0xa7, 0x79, 0x1c, 0x11, 0x2a, 0xcc, 0x63, 0x7d, 0x05, 0x75, 0x0d, 0x52, 0x45,
0x96, 0xf0, 0x3d, 0x5e, 0x64, 0xb5, 0xa1, 0x32, 0x92, 0x65, 0x57, 0x05, 0xb3, 0x4f, 0x56, 0xcd,
0x3a, 0xae, 0xeb, 0xb1, 0x55, 0x9c, 0xb1, 0x3d, 0xf2, 0x5c, 0x51, 0xf5, 0x57, 0x70, 0x2b, 0x01,
0x7f, 0xee, 0xb9, 0x91, 0xd5, 0x83, 0x15, 0xad, 0x9c, 0x13, 0x4b, 0x3b, 0xa3, 0x54, 0x2b, 0xa7,
0x4b, 0x35, 0x1f, 0xaa, 0xbb, 0xe4, 0xc8, 0x1b, 0x92, 0x7f, 0x4b, 0x8d, 0xbe, 0x09, 0x8d, 0x90,
0xd0, 0x89, 0x17, 0x45, 0x5a, 0x9f, 0x75, 0x6c, 0x82, 0xac, 0xdf, 0x57, 0x61, 0x39, 0xeb, 0x02,
0xef, 0xe7, 0x2a, 0xc3, 0x6e, 0x62, 0xbe, 0xec, 0xfe, 0x8c, 0x88, 0x7e, 0x4d, 0x05, 0x8d, 0x72,
0xc6, 0x02, 0x3a, 0xae, 0xc8, 0x40, 0xc2, 0xf6, 0x3f, 0x0c, 0x26, 0x13, 0xc7, 0x77, 0x55, 0xff,
0x44, 0x0e, 0x99, 0xb6, 0x1c, 0x3a, 0x62, 0xc7, 0x94, 0x81, 0xf9, 0x37, 0xba, 0x0c, 0x0d, 0x96,
0x4e, 0x79, 0x3e, 0x2f, 0x2c, 0xf9, 0xb1, 0xac, 0x63, 0x90, 0xa0, 0x5d, 0x8f, 0xa2, 0xab, 0x30,
0x4f, 0xfc, 0x23, 0x15, 0xbb, 0x93, 0x06, 0x8b, 0x0a, 0x56, 0x98, 0x4f, 0xa3, 0x37, 0xa1, 0x3a,
0x09, 0xa6, 0x7e, 0xac, 0x12, 0xab, 0x96, 0x46, 0xe4, 0x5d, 0x11, 0x2c, 0x67, 0xd1, 0x75, 0x58,
0x74, 0xb9, 0x0d, 0x54, 0xf6, 0xb4, 0x9c, 0x14, 0xa7, 0x1c, 0x8e, 0xd5, 0x3c, 0xfa, 0x48, 0xdf,
0x3a, 0xf5, 0xcc, 0xbd, 0x91, 0x51, 0x6a, 0xe1, 0xd5, 0x73, 0x2f, 0x7d, 0xf5, 0x00, 0x67, 0x71,
0x7d, 0x26, 0x8b, 0x93, 0x4b, 0xcb, 0x4b, 0x00, 0x21, 0xf5, 0x8e, 0xbc, 0x31, 0x19, 0x11, 0xb7,
0xd3, 0xe0, 0xbd, 0x0f, 0x03, 0xc2, 0xfb, 0x69, 0xb2, 0x3f, 0x63, 0xd3, 0x20, 0x88, 0x9f, 0x46,
0x9d, 0x25, 0xd1, 0x93, 0x51, 0x60, 0xcc, 0xa1, 0xe8, 0x02, 0xd4, 0x58, 0x0d, 0xcf, 0x1d, 0xaa,
0x29, 0x4a, 0x87, 0x71, 0x30, 0xe2, 0xfe, 0xb4, 0xca, 0xee, 0x6c, 0xd7, 0xf3, 0x3b, 0x2d, 0x4e,
0x29, 0x06, 0x2c, 0x14, 0xf3, 0x0f, 0x3b, 0xf0, 0x87, 0xa4, 0xb3, 0xcc, 0xa7, 0xea, 0x1c, 0xf2,
0xd0, 0x1f, 0xf2, 0x9b, 0x22, 0x8e, 0x8f, 0x3b, 0x6d, 0x0e, 0x67, 0x9f, 0xe8, 0xbf, 0x54, 0x5e,
0xbc, 0xc2, 0x1d, 0xe5, 0xe2, 0x8c, 0xf8, 0xf2, 0xca, 0x14, 0xc1, 0x7f, 0x2e, 0xc1, 0xda, 0x0e,
0xcf, 0x34, 0x8c, 0xd8, 0x77, 0x86, 0x22, 0x0e, 0xbd, 0xa7, 0xab, 0xe5, 0x6c, 0xc5, 0x95, 0xdd,
0xac, 0xc4, 0x43, 0x9f, 0x40, 0x4b, 0xf1, 0x94, 0x94, 0x95, 0x1f, 0xaa, 0xb3, 0x9b, 0x91, 0x39,
0xb4, 0x3e, 0x82, 0xf5, 0x9c, 0xcc, 0x32, 0x2b, 0xb8, 0x02, 0x4b, 0x49, 0x68, 0xd1, 0x22, 0x37,
0x34, 0x6c, 0xdf, 0xb5, 0x6e, 0xb3, 0x6a, 0xdb, 0xa1, 0x71, 0x6e, 0xc3, 0xa7, 0xa0, 0xe5, 0xa5,
0x76, 0x9a, 0x56, 0x56, 0xc3, 0x03, 0x58, 0x65, 0x45, 0xf8, 0x4b, 0x30, 0x65, 0x21, 0x83, 0x6d,
0x3b, 0x98, 0xc6, 0x32, 0x34, 0xab, 0xa1, 0xb5, 0x2e, 0x1a, 0x03, 0xf9, 0xd5, 0x3e, 0x84, 0x35,
0x51, 0x97, 0xbf, 0xcc, 0x26, 0x2e, 0xa8, 0xae, 0x40, 0x9e, 0xef, 0xaf, 0xcb, 0x46, 0xcc, 0x9c,
0x51, 0x48, 0xbc, 0x9b, 0x2e, 0x24, 0xd6, 0xf3, 0x06, 0x4f, 0x25, 0xb7, 0x79, 0x37, 0xaa, 0x14,
0xb8, 0x11, 0xce, 0x55, 0x1b, 0xf3, 0x3c, 0x64, 0xbc, 0x9d, 0xe7, 0xfe, 0x1f, 0x2c, 0x36, 0xf6,
0x45, 0xb1, 0xa1, 0x97, 0xd6, 0x0d, 0x8e, 0xf7, 0x32, 0xc5, 0x46, 0x67, 0x96, 0x98, 0xba, 0xd6,
0xf8, 0xd5, 0x3c, 0xd4, 0xf5, 0x5c, 0x4e, 0xa7, 0x79, 0x25, 0x95, 0x0b, 0x94, 0x64, 0xde, 0x5e,
0x95, 0x97, 0xb9, 0xbd, 0xe6, 0x7f, 0xe8, 0xf6, 0xda, 0x80, 0x3a, 0xff, 0xb0, 0x29, 0x79, 0x2a,
0x6f, 0xa3, 0x1a, 0x07, 0x60, 0xf2, 0x34, 0x31, 0x7c, 0xf5, 0x54, 0x86, 0x4f, 0x57, 0x35, 0x8b,
0xd9, 0xaa, 0xe6, 0x7d, 0x7d, 0xbf, 0x88, 0x9b, 0xe8, 0x52, 0x9e, 0x5d, 0xe1, 0xcd, 0xb2, 0x97,
0xbe, 0x59, 0xc4, 0xe5, 0xf4, 0x7a, 0x01, 0xf1, 0x2b, 0x5b, 0xd3, 0xdc, 0x17, 0x35, 0x8d, 0xe9,
0x55, 0x32, 0x7a, 0x6d, 0x03, 0xe8, 0x83, 0xaa, 0x0a, 0x1b, 0x94, 0xdf, 0x1a, 0x36, 0xb0, 0x58,
0x28, 0x48, 0xe9, 0x3f, 0xe9, 0xc2, 0x9d, 0x22, 0x14, 0xfc, 0x69, 0xc1, 0x38, 0xef, 0x33, 0xda,
0x55, 0xef, 0xe7, 0xca, 0xe0, 0xd3, 0x79, 0xdd, 0xbb, 0xe9, 0x2a, 0xf8, 0x6c, 0xee, 0x92, 0x2b,
0x82, 0xf9, 0x4d, 0xec, 0x50, 0x39, 0x2d, 0xea, 0x97, 0xba, 0x84, 0xf4, 0x62, 0x96, 0x48, 0x3d,
0xf5, 0x7c, 0x2f, 0x3a, 0x14, 0xf3, 0x55, 0x3e, 0x0f, 0x0a, 0xd4, 0xe3, 0xef, 0x4a, 0xe4, 0x85,
0x17, 0xdb, 0xc3, 0xc0, 0x25, 0xdc, 0x19, 0x17, 0x70, 0x8d, 0x01, 0x76, 0x02, 0x97, 0x24, 0x07,
0xa4, 0x76, 0xa6, 0x03, 0x52, 0xcf, 0x1c, 0x90, 0x35, 0xa8, 0x52, 0xe2, 0x44, 0x81, 0xdf, 0x01,
0xf1, 0x3a, 0x25, 0x46, 0x2c, 0xc0, 0x4f, 0x48, 0x14, 0xb1, 0x05, 0x1a, 0x22, 0xeb, 0x90, 0x43,
0x23, 0xc9, 0x5a, 0x9a, 0x95, 0x64, 0x9d, 0xd0, 0x0f, 0xcb, 0x24, 0x59, 0xcd, 0x59, 0x49, 0xd6,
0x69, 0xda, 0x61, 0x46, 0x0a, 0xd9, 0x3a, 0x29, 0x85, 0xfc, 0x29, 0x0f, 0xce, 0x3d, 0x58, 0xcf,
0xb9, 0xba, 0x3c, 0x39, 0xef, 0x65, 0xba, 0x66, 0x9d, 0x59, 0x5a, 0xd0, 0x4d, 0xb3, 0x9f, 0xc3,
0xf2, 0xde, 0x0b, 0x32, 0x1c, 0x1c, 0xfb, 0xc3, 0x33, 0xdc, 0xd5, 0x6d, 0xa8, 0x0c, 0x27, 0xae,
0xac, 0x3d, 0xd9, 0xa7, 0x79, 0x7b, 0x57, 0xd2, 0xb7, 0xb7, 0x0d, 0xed, 0x64, 0x05, 0x29, 0xe7,
0x1a, 0x93, 0xd3, 0x65, 0xc8, 0x8c, 0xf9, 0x12, 0x96, 0x23, 0x09, 0x27, 0x94, 0xf2, 0x5d, 0x0b,
0x38, 0xa1, 0x34, 0xed, 0xb6, 0x95, 0xb4, 0xdb, 0x5a, 0xcf, 0xa0, 0xc1, 0x16, 0xf8, 0x51, 0xe2,
0xcb, 0x14, 0xb6, 0x92, 0xa4, 0xb0, 0x3a, 0x13, 0x9e, 0x37, 0x32, 0x61, 0x6b, 0x13, 0x96, 0xc4,
0x5a, 0x72, 0x23, 0xac, 0xba, 0xa4, 0x63, 0x65, 0xb7, 0x29, 0x1d, 0x5b, 0xff, 0x07, 0xcd, 0x5e,
0x1c, 0x3b, 0xc3, 0xc3, 0x33, 0xc8, 0xa3, 0xd7, 0x2a, 0x9b, 0x6b, 0x59, 0xd0, 0x52, 0x9c, 0x66,
0xae, 0xd6, 0x07, 0x74, 0x10, 0xd0, 0xf8, 0xb3, 0x80, 0x7e, 0xe7, 0x50, 0xf7, 0x6c, 0x39, 0x2b,
0x82, 0x79, 0xf9, 0x00, 0x5d, 0xb9, 0xb6, 0x80, 0xf9, 0xb7, 0xf5, 0x16, 0x9c, 0x4b, 0xf1, 0x9b,
0xb9, 0xf0, 0x2d, 0x68, 0xf0, 0xa8, 0x20, 0xb3, 0xa3, 0x6b, 0x66, 0x3b, 0xe9, 0xa4, 0xd0, 0xc1,
0x4a, 0x68, 0x16, 0xf6, 0x39, 0x5c, 0xc7, 0xe8, 0x77, 0x32, 0x89, 0xc4, 0x6a, 0x9a, 0x3e, 0x93,
0x44, 0x3c, 0x87, 0x05, 0x0e, 0xce, 0xc5, 0xe8, 0x0d, 0xa8, 0x53, 0x12, 0x06, 0x76, 0xec, 0x8c,
0xf4, 0x93, 0x3e, 0x03, 0x3c, 0x72, 0x46, 0x11, 0xff, 0x23, 0x81, 0x4d, 0xba, 0xde, 0x88, 0x44,
0xb1, 0x7a, 0xd7, 0x6f, 0x30, 0xd8, 0xae, 0x00, 0x31, 0x8d, 0x44, 0xde, 0x2f, 0x44, 0x82, 0x30,
0x8f, 0xf9, 0xb7, 0xf5, 0x11, 0x20, 0x53, 0x5e, 0xa9, 0x90, 0x37, 0xa1, 0xca, 0xb7, 0xa3, 0xae,
0xa7, 0x56, 0x5a, 0x60, 0x2c, 0x67, 0xad, 0xbb, 0x80, 0x84, 0x06, 0x52, 0x57, 0xd2, 0xe9, 0xb5,
0xf5, 0x21, 0x9c, 0x4b, 0xd1, 0xeb, 0x07, 0xb5, 0x14, 0x83, 0xec, 0xea, 0x92, 0xf8, 0xef, 0x25,
0x80, 0xde, 0x34, 0x3e, 0x94, 0x55, 0x7f, 0x17, 0x6a, 0xd3, 0x88, 0x50, 0xa3, 0x57, 0xa1, 0xc7,
0x6c, 0x2e, 0x74, 0xa2, 0xe8, 0xbb, 0x80, 0xaa, 0x9c, 0x4b, 0x8f, 0x79, 0xc5, 0x3e, 0x8d, 0x0f,
0x55, 0x67, 0x8b, 0x7d, 0xa3, 0xab, 0xd0, 0x12, 0xbf, 0x51, 0xd8, 0x8e, 0xeb, 0x52, 0x12, 0x45,
0xb2, 0xc5, 0xd5, 0x14, 0xd0, 0x9e, 0x00, 0x32, 0x34, 0xcf, 0x25, 0x7e, 0xec, 0xc5, 0xc7, 0x76,
0x1c, 0x3c, 0x27, 0xbe, 0xcc, 0xa6, 0x9a, 0x0a, 0xfa, 0x88, 0x01, 0x19, 0x1a, 0x25, 0x23, 0x2f,
0x8a, 0xa9, 0x42, 0xab, 0x0a, 0x34, 0x05, 0xe5, 0x68, 0xd6, 0xf7, 0x25, 0x68, 0x1f, 0x4c, 0xc7,
0x63, 0xb1, 0xc9, 0xb3, 0xea, 0x12, 0xbd, 0x25, 0xf7, 0x91, 0x6d, 0x58, 0x25, 0x2a, 0x92, 0x9b,
0xfb, 0xf1, 0xa5, 0xd9, 0x39, 0x58, 0x31, 0x04, 0x95, 0x55, 0xc5, 0x5d, 0x40, 0xa2, 0xe0, 0x78,
0x39, 0xf9, 0xad, 0xf3, 0x70, 0x2e, 0x45, 0x2f, 0xd9, 0xde, 0x80, 0xa6, 0x7c, 0x9d, 0x92, 0x76,
0xbe, 0x00, 0x35, 0x76, 0xfa, 0x87, 0x9e, 0xab, 0xba, 0x96, 0x8b, 0x61, 0xe0, 0xee, 0x78, 0x2e,
0xb5, 0xfa, 0xd0, 0xc4, 0x82, 0xbd, 0xc4, 0xbd, 0x03, 0x2d, 0xf9, 0x96, 0x65, 0xa7, 0x5e, 0x7b,
0x93, 0x96, 0x5c, 0x8a, 0x37, 0x6e, 0xfa, 0xe6, 0xd0, 0xfa, 0x06, 0xba, 0x8f, 0x43, 0x97, 0xa5,
0x2f, 0x26, 0x57, 0xb5, 0xb5, 0x3b, 0xa0, 0xfe, 0xe4, 0x99, 0xc5, 0x3c, 0x4d, 0xd6, 0xa4, 0xe6,
0xd0, 0xba, 0x08, 0x1b, 0x85, 0xcc, 0xe5, 0xbe, 0x43, 0x68, 0x27, 0x13, 0xa2, 0x4b, 0xa7, 0x9b,
0xb0, 0x25, 0xa3, 0x09, 0xbb, 0xa6, 0xef, 0x44, 0x11, 0x5d, 0xe5, 0xc8, 0x48, 0x53, 0x2a, 0xb3,
0xd2, 0x94, 0xf9, 0x54, 0x9a, 0x62, 0x7d, 0xa1, 0xb5, 0x27, 0x73, 0xc4, 0x0f, 0x78, 0xa2, 0x2a,
0xd6, 0x56, 0x91, 0xe0, 0x42, 0xc1, 0xe6, 0x04, 0x06, 0x36, 0x90, 0xad, 0x65, 0x68, 0xa6, 0x62,
0x82, 0xf5, 0x09, 0xb4, 0x32, 0x87, 0x7c, 0x2b, 0x73, 0x99, 0xe7, 0xd4, 0x96, 0xbe, 0xca, 0x6f,
0xbc, 0x06, 0x35, 0xf5, 0xc3, 0x11, 0x5a, 0x84, 0xca, 0xa3, 0x9d, 0x83, 0xf6, 0x1c, 0xfb, 0x78,
0xbc, 0x7b, 0xd0, 0x2e, 0xdd, 0xb8, 0x0d, 0xcb, 0x99, 0x77, 0x17, 0xb4, 0x02, 0xcd, 0x41, 0xaf,
0xbf, 0xfb, 0xe9, 0xc3, 0xaf, 0x6c, 0xbc, 0xd7, 0xdb, 0xfd, 0xba, 0x3d, 0x87, 0x56, 0xa1, 0xad,
0x40, 0xfd, 0x87, 0x8f, 0x04, 0xb4, 0x74, 0xe3, 0x39, 0xb4, 0xd2, 0xd9, 0x2a, 0x3a, 0x0f, 0x2b,
0x3b, 0x0f, 0xfb, 0x8f, 0x7a, 0xfb, 0xfd, 0x3d, 0x6c, 0xef, 0xe0, 0xbd, 0xde, 0xa3, 0xbd, 0xdd,
0xf6, 0x5c, 0x1a, 0x8c, 0x1f, 0xf7, 0xfb, 0xfb, 0xfd, 0xcf, 0xdb, 0x25, 0xc6, 0x35, 0x01, 0xef,
0x7d, 0xb5, 0xcf, 0x90, 0xcb, 0x69, 0xe4, 0xc7, 0xfd, 0x7b, 0xfd, 0x87, 0x3f, 0xeb, 0xb7, 0x2b,
0xdb, 0x7f, 0x6c, 0x40, 0x4b, 0x6d, 0x90, 0x50, 0xde, 0x29, 0xbd, 0x0b, 0x8b, 0xea, 0x5f, 0xb0,
0x24, 0x7f, 0x4e, 0xff, 0xb8, 0xd6, 0xed, 0xe4, 0x27, 0xa4, 0xa3, 0xcc, 0xa1, 0x03, 0x6e, 0x38,
0xe3, 0x8d, 0xeb, 0xa2, 0xa9, 0xca, 0xdc, 0x23, 0x5a, 0xf7, 0xd2, 0xac, 0x69, 0xcd, 0x71, 0xc0,
0xac, 0x65, 0xfe, 0x6c, 0x80, 0x12, 0x9a, 0xc2, 0x9f, 0x18, 0xba, 0x97, 0x67, 0xce, 0x6b, 0xa6,
0x5f, 0x43, 0x3b, 0xfb, 0x9b, 0x01, 0x4a, 0x5a, 0xf3, 0x33, 0x7e, 0x61, 0xe8, 0x5e, 0x39, 0x01,
0xc3, 0x64, 0x9d, 0x7b, 0x90, 0xdf, 0x9c, 0xfd, 0xa4, 0x9a, 0x63, 0x3d, 0xeb, 0x9d, 0x56, 0xa8,
0x22, 0xfd, 0x36, 0x85, 0xcc, 0x67, 0xf0, 0x82, 0x37, 0x4a, 0x43, 0x15, 0xc5, 0x8f, 0x5a, 0xd6,
0x1c, 0xfa, 0x12, 0x96, 0x33, 0xbd, 0x2d, 0x94, 0x50, 0x15, 0x77, 0xea, 0xba, 0x9b, 0xb3, 0x11,
0xd2, 0x76, 0x33, 0x3b, 0x57, 0x29, 0xbb, 0x15, 0xb4, 0xc3, 0x52, 0x76, 0x2b, 0x6c, 0x79, 0x71,
0xf7, 0x4a, 0xf5, 0xa7, 0x0c, 0xf7, 0x2a, 0x6a, 0x86, 0x75, 0x2f, 0xcd, 0x9a, 0x36, 0xb7, 0x9f,
0xe9, 0x4d, 0x19, 0xdb, 0x2f, 0x6e, 0x79, 0x75, 0x37, 0x67, 0x23, 0x64, 0x6d, 0x95, 0xd4, 0xdc,
0x19, 0x5b, 0xe5, 0x5a, 0x3c, 0x19, 0x5b, 0xe5, 0x8b, 0x75, 0x69, 0xab, 0x4c, 0xf1, 0x7c, 0x79,
0x66, 0xdd, 0x91, 0xb7, 0x55, 0x71, 0x29, 0x63, 0xcd, 0xa1, 0x1e, 0xd4, 0x54, 0xe1, 0x80, 0x92,
0xd3, 0x9d, 0xa9, 0x56, 0xba, 0x17, 0x0a, 0x66, 0x34, 0x8b, 0xff, 0x81, 0x79, 0x06, 0x45, 0xab,
0x29, 0x24, 0x45, 0x7a, 0x3e, 0x03, 0xd5, 0x64, 0x1f, 0x42, 0x55, 0x64, 0xde, 0x28, 0x89, 0xb9,
0xa9, 0xa4, 0xbe, 0xbb, 0x9e, 0x83, 0x6b, 0xe2, 0x2f, 0xc4, 0xff, 0xa1, 0x32, 0x85, 0x46, 0x1b,
0xa9, 0x3f, 0xd8, 0xd2, 0x89, 0x7a, 0xf7, 0xb5, 0xe2, 0x49, 0xcd, 0xeb, 0x09, 0x9c, 0x2b, 0xb8,
0x02, 0x51, 0xd2, 0xe7, 0x99, 0x7d, 0xfb, 0x76, 0xdf, 0x38, 0x19, 0xc9, 0xdc, 0xac, 0xb4, 0xda,
0x9a, 0xe9, 0xea, 0x86, 0xb1, 0xd6, 0x73, 0x70, 0x45, 0xbc, 0xfd, 0x97, 0x32, 0x2c, 0x89, 0x44,
0x45, 0x86, 0xea, 0xcf, 0x01, 0x92, 0x74, 0x19, 0x75, 0x53, 0xde, 0x93, 0xca, 0xf9, 0xbb, 0x1b,
0x85, 0x73, 0xa6, 0x1a, 0x8d, 0xcc, 0xd7, 0x50, 0x63, 0x3e, 0x9f, 0x36, 0xd4, 0x58, 0x90, 0x2c,
0x5b, 0x73, 0x68, 0x17, 0xea, 0x3a, 0x1d, 0x43, 0x46, 0x16, 0x97, 0xc9, 0x25, 0xbb, 0xdd, 0xa2,
0x29, 0x53, 0x22, 0x23, 0xff, 0x32, 0x24, 0xca, 0x67, 0x75, 0x86, 0x44, 0x45, 0x29, 0xdb, 0xdc,
0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x33, 0x75, 0xd6, 0x8d, 0x2d, 0x00, 0x00,
}

View File

@ -60,6 +60,9 @@ service RuntimeService {
// UpdateRuntimeConfig updates the runtime configuration based on request
rpc UpdateRuntimeConfig(UpdateRuntimeConfigRequest) returns (UpdateRuntimeConfigResponse) {}
// Status returns the status of the runtime.
rpc Status(StatusRequest) returns (StatusResponse) {}
}
// Image service defines the public APIs for managing images
@ -796,3 +799,40 @@ message UpdateRuntimeConfigRequest {
}
message UpdateRuntimeConfigResponse {}
// RuntimeCondition contains condition information for the runtime.
// There are 2 kinds of runtime conditions:
// 1. Required condtitions: Conditions are required for kubelet to work
// properly. If any required condition is unmet, the node will be not ready.
// The required conditions include:
// * RuntimeReady: RuntimeReady means the runtime is up and ready to accept
// basic containers e.g. container only needs host network.
// * NetworkReady: NetworkReady means the runtime network is up and ready to
// accept containers which require container network.
// 2. Optional conditions: Conditions are informative to the user, but kubelet
// will not rely on. Since condition type is an arbitrary string, all conditions
// not required are optional. These conditions will be exposed to users to help
// them understand the status of the system.
message RuntimeCondition {
// Type of runtime condition.
optional string type = 1;
// Status of the condition, one of true/false.
optional bool status = 2;
// Reason is brief reason for the condition's last transition.
optional string reason = 3;
// Message is human readable message indicating details about last transition.
optional string message = 4;
}
// RuntimeStatus is information about the current status of the runtime.
message RuntimeStatus {
// Conditions is an array of current observed runtime conditions.
repeated RuntimeCondition conditions = 1;
}
message StatusRequest {}
message StatusResponse {
// The status of the Runtime.
optional RuntimeStatus status = 1;
}

View File

@ -0,0 +1,27 @@
/*
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 runtime
// This file contains all constants defined in CRI.
// Required runtime condition type.
const (
// RuntimeReady means the runtime is up and ready to accept basic containers.
RuntimeReady = "RuntimeReady"
// NetworkReady means the runtime network is up and ready to accept containers which require network.
NetworkReady = "NetworkReady"
)

View File

@ -70,8 +70,9 @@ type Runtime interface {
// This may be different from the runtime engine's version.
// TODO(random-liu): We should fold this into Version()
APIVersion() (Version, error)
// Status returns error if the runtime is unhealthy; nil otherwise.
Status() error
// Status returns the status of the runtime. An error is returned if the Status
// function itself fails, nil otherwise.
Status() (*RuntimeStatus, error)
// GetPods returns a list of containers grouped by pods. The boolean parameter
// specifies whether the runtime returns all containers including those already
// exited and dead containers (used for garbage collection).
@ -446,6 +447,59 @@ type VolumeInfo struct {
type VolumeMap map[string]VolumeInfo
// RuntimeConditionType is the types of required runtime conditions.
type RuntimeConditionType string
const (
// RuntimeReady means the runtime is up and ready to accept basic containers.
RuntimeReady RuntimeConditionType = "RuntimeReady"
// NetworkReady means the runtime network is up and ready to accept containers which require network.
NetworkReady RuntimeConditionType = "NetworkReady"
)
// RuntimeStatus contains the status of the runtime.
type RuntimeStatus struct {
// Conditions is an array of current observed runtime conditions.
Conditions []RuntimeCondition
}
// GetRuntimeCondition gets a specified runtime condition from the runtime status.
func (r *RuntimeStatus) GetRuntimeCondition(t RuntimeConditionType) *RuntimeCondition {
for i := range r.Conditions {
c := &r.Conditions[i]
if c.Type == t {
return c
}
}
return nil
}
// String formats the runtime status into human readable string.
func (s *RuntimeStatus) String() string {
var ss []string
for _, c := range s.Conditions {
ss = append(ss, c.String())
}
return fmt.Sprintf("Runtime Conditions: %s", strings.Join(ss, ", "))
}
// RuntimeCondition contains condition information for the runtime.
type RuntimeCondition struct {
// Type of runtime condition.
Type RuntimeConditionType
// Status of the condition, one of true/false.
Status bool
// Reason is brief reason for the condition's last transition.
Reason string
// Message is human readable message indicating details about last transition.
Message string
}
// String formats the runtime condition into human readable string.
func (c *RuntimeCondition) String() string {
return fmt.Sprintf("%s=%t reason:%s message:%s", c.Type, c.Status, c.Reason, c.Message)
}
type Pods []*Pod
// FindPodByID finds and returns a pod in the pod list by UID. It will return an empty pod

View File

@ -50,6 +50,7 @@ type FakeRuntime struct {
KilledPods []string
StartedContainers []string
KilledContainers []string
RuntimeStatus *RuntimeStatus
VersionInfo string
APIVersionInfo string
RuntimeType string
@ -137,6 +138,7 @@ func (f *FakeRuntime) ClearCalls() {
f.KilledPods = []string{}
f.StartedContainers = []string{}
f.KilledContainers = []string{}
f.RuntimeStatus = nil
f.VersionInfo = ""
f.RuntimeType = ""
f.Err = nil
@ -207,12 +209,12 @@ func (f *FakeRuntime) APIVersion() (Version, error) {
return &FakeVersion{Version: f.APIVersionInfo}, f.Err
}
func (f *FakeRuntime) Status() error {
func (f *FakeRuntime) Status() (*RuntimeStatus, error) {
f.Lock()
defer f.Unlock()
f.CalledFunctions = append(f.CalledFunctions, "Status")
return f.StatusErr
return f.RuntimeStatus, f.StatusErr
}
func (f *FakeRuntime) GetPods(all bool) ([]*Pod, error) {

View File

@ -54,9 +54,9 @@ func (r *Mock) APIVersion() (Version, error) {
return args.Get(0).(Version), args.Error(1)
}
func (r *Mock) Status() error {
func (r *Mock) Status() (*RuntimeStatus, error) {
args := r.Called()
return args.Error(0)
return args.Get(0).(*RuntimeStatus), args.Error(0)
}
func (r *Mock) GetPods(all bool) ([]*Pod, error) {

View File

@ -49,6 +49,7 @@ go_library(
"//vendor:github.com/docker/engine-api/types/versions",
"//vendor:github.com/docker/go-connections/nat",
"//vendor:github.com/golang/glog",
"//vendor:github.com/golang/protobuf/proto",
],
)

View File

@ -21,6 +21,8 @@ import (
"io"
"github.com/golang/glog"
"github.com/golang/protobuf/proto"
"k8s.io/kubernetes/pkg/apis/componentconfig"
internalApi "k8s.io/kubernetes/pkg/kubelet/api"
runtimeApi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
@ -58,7 +60,7 @@ const (
sandboxIDLabelKey = "io.kubernetes.sandbox.id"
)
// NetworkPluginArgs is the subset of kubelet runtime args we pass
// NetworkPluginSettings is the subset of kubelet runtime args we pass
// to the container runtime shim so it can probe for network plugins.
// In the future we will feed these directly to a standalone container
// runtime process.
@ -222,3 +224,28 @@ type dockerNetworkHost struct {
func (ds *dockerService) Start() error {
return ds.containerManager.Start()
}
// Status returns the status of the runtime.
// TODO(random-liu): Set network condition accordingly here.
func (ds *dockerService) Status() (*runtimeApi.RuntimeStatus, error) {
runtimeReady := &runtimeApi.RuntimeCondition{
Type: proto.String(runtimeApi.RuntimeReady),
Status: proto.Bool(true),
}
networkReady := &runtimeApi.RuntimeCondition{
Type: proto.String(runtimeApi.NetworkReady),
Status: proto.Bool(true),
}
conditions := []*runtimeApi.RuntimeCondition{runtimeReady, networkReady}
if _, err := ds.client.Version(); err != nil {
runtimeReady.Status = proto.Bool(false)
runtimeReady.Reason = proto.String("DockerDaemonNotReady")
runtimeReady.Message = proto.String(fmt.Sprintf("docker: failed to get docker version: %v", err))
}
if err := ds.networkPlugin.Status(); err != nil {
networkReady.Status = proto.Bool(false)
networkReady.Reason = proto.String("NetworkPluginNotReady")
networkReady.Message = proto.String(fmt.Sprintf("docker: network plugin is not ready: %v", err))
}
return &runtimeApi.RuntimeStatus{Conditions: conditions}, nil
}

View File

@ -17,10 +17,14 @@ limitations under the License.
package dockershim
import (
"github.com/golang/mock/gomock"
"errors"
"testing"
"time"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
runtimeApi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
"k8s.io/kubernetes/pkg/kubelet/dockertools"
"k8s.io/kubernetes/pkg/kubelet/network"
@ -39,3 +43,49 @@ func newTestDockerService() (*dockerService, *dockertools.FakeDockerClient, *clo
c := dockertools.NewFakeDockerClientWithClock(fakeClock)
return &dockerService{client: c, os: &containertest.FakeOS{}, networkPlugin: &network.NoopNetworkPlugin{}}, c, fakeClock
}
// TestStatus tests the runtime status logic.
func TestStatus(t *testing.T) {
ds, fDocker, _ := newTestDockerService()
assertStatus := func(expected map[string]bool, status *runtimeApi.RuntimeStatus) {
conditions := status.GetConditions()
assert.Equal(t, len(expected), len(conditions))
for k, v := range expected {
for _, c := range conditions {
if k == c.GetType() {
assert.Equal(t, v, c.GetStatus())
}
}
}
}
// Should report ready status if version returns no error.
status, err := ds.Status()
assert.NoError(t, err)
assertStatus(map[string]bool{
runtimeApi.RuntimeReady: true,
runtimeApi.NetworkReady: true,
}, status)
// Should not report ready status if version returns error.
fDocker.InjectError("version", errors.New("test error"))
status, err = ds.Status()
assert.NoError(t, err)
assertStatus(map[string]bool{
runtimeApi.RuntimeReady: false,
runtimeApi.NetworkReady: true,
}, status)
// Should not report ready status is network plugin returns error.
mockPlugin := newTestNetworkPlugin(t)
ds.networkPlugin = mockPlugin
defer mockPlugin.Finish()
mockPlugin.EXPECT().Status().Return(errors.New("network error"))
status, err = ds.Status()
assert.NoError(t, err)
assertStatus(map[string]bool{
runtimeApi.RuntimeReady: true,
runtimeApi.NetworkReady: false,
}, status)
}

View File

@ -51,6 +51,14 @@ func (d *dockerService) Version(ctx context.Context, r *runtimeApi.VersionReques
return d.runtimeService.Version(r.GetVersion())
}
func (d *dockerService) Status(ctx context.Context, r *runtimeApi.StatusRequest) (*runtimeApi.StatusResponse, error) {
status, err := d.runtimeService.Status()
if err != nil {
return nil, err
}
return &runtimeApi.StatusResponse{Status: status}, nil
}
func (d *dockerService) RunPodSandbox(ctx context.Context, r *runtimeApi.RunPodSandboxRequest) (*runtimeApi.RunPodSandboxResponse, error) {
podSandboxId, err := d.runtimeService.RunPodSandbox(r.GetConfig())
if err != nil {

View File

@ -1105,8 +1105,8 @@ func (dm *DockerManager) APIVersion() (kubecontainer.Version, error) {
// Now we do this by checking whether:
// 1) `docker version` works
// 2) docker version is compatible with minimum requirement
func (dm *DockerManager) Status() error {
return dm.checkVersionCompatibility()
func (dm *DockerManager) Status() (*kubecontainer.RuntimeStatus, error) {
return nil, dm.checkVersionCompatibility()
}
func (dm *DockerManager) checkVersionCompatibility() error {

View File

@ -1999,10 +1999,40 @@ func (kl *Kubelet) PLEGHealthCheck() (bool, error) {
// and returns an error if the status check fails. If the status check is OK,
// update the container runtime uptime in the kubelet runtimeState.
func (kl *Kubelet) updateRuntimeUp() {
if err := kl.containerRuntime.Status(); err != nil {
s, err := kl.containerRuntime.Status()
if err != nil {
glog.Errorf("Container runtime sanity check failed: %v", err)
return
}
// Only check specific conditions when runtime integration type is cri,
// because the old integration doesn't populate any runtime condition.
if kl.kubeletConfiguration.ExperimentalRuntimeIntegrationType == "cri" {
if s == nil {
glog.Errorf("Container runtime status is nil")
return
}
// Periodically log the whole runtime status for debugging.
// TODO(random-liu): Consider to send node event when optional
// condition is unmet.
glog.V(4).Infof("Container runtime status: %v", s)
networkReady := s.GetRuntimeCondition(kubecontainer.NetworkReady)
if networkReady == nil || !networkReady.Status {
glog.Errorf("Container runtime network not ready: %v", networkReady)
kl.runtimeState.setNetworkState(fmt.Errorf("runtime network not ready: %v", networkReady))
} else {
// Set nil if the containe runtime network is ready.
kl.runtimeState.setNetworkState(nil)
}
// TODO(random-liu): Add runtime error in runtimeState, and update it
// when runtime is not ready, so that the information in RuntimeReady
// condition will be propagated to NodeReady condition.
runtimeReady := s.GetRuntimeCondition(kubecontainer.RuntimeReady)
// If RuntimeReady is not set or is false, report an error.
if runtimeReady == nil || !runtimeReady.Status {
glog.Errorf("Container runtime not ready: %v", runtimeReady)
return
}
}
kl.oneTimeInitializer.Do(kl.initializeRuntimeDependentModules)
kl.runtimeState.setRuntimeSync(kl.clock.Now())
}

View File

@ -191,19 +191,11 @@ func (kl *Kubelet) cleanupBandwidthLimits(allPods []*api.Pod) error {
// syncNetworkStatus updates the network state
func (kl *Kubelet) syncNetworkStatus() {
// TODO(#35701): cri shim handles network plugin but we currently
// don't have a cri status hook, so network plugin status isn't
// reported if --experimental-runtime-integration=cri. This isn't
// too bad, because kubenet is the only network plugin that
// implements status(), and it just checks for plugin binaries
// on the filesystem.
// For cri integration, network state will be updated in updateRuntimeUp,
// we'll get runtime network status through cri directly.
// TODO: Remove this once we completely switch to cri integration.
if kl.networkPlugin != nil {
kl.runtimeState.setNetworkState(kl.networkPlugin.Status())
} else if kl.runtimeState.podCIDR() != "" {
// Don't mark the node ready till we've successfully executed
// the first UpdatePodCIDR call through cri. See comment above
// setPodCIDR call.
kl.runtimeState.setNetworkState(nil)
}
}
@ -231,9 +223,6 @@ func (kl *Kubelet) updatePodCIDR(cidr string) {
return
}
// We need to be careful about setting podCIDR. Till #35839 lands we're
// using it to indicate network plugin status for cri shims. See comment
// in syncNetworkStatus.
glog.Infof("Setting Pod CIDR: %v -> %v", podCIDR, cidr)
kl.runtimeState.setPodCIDR(cidr)
}

View File

@ -762,7 +762,7 @@ func TestUpdateNodeStatusWithRuntimeStateError(t *testing.T) {
},
}
checkNodeStatus := func(status api.ConditionStatus, reason, message string) {
checkNodeStatus := func(status api.ConditionStatus, reason string) {
kubeClient.ClearActions()
if err := kubelet.updateNodeStatus(); err != nil {
t.Errorf("unexpected error: %v", err)
@ -795,11 +795,14 @@ func TestUpdateNodeStatusWithRuntimeStateError(t *testing.T) {
if updatedNode.Status.Conditions[lastIndex].Type != api.NodeReady {
t.Errorf("unexpected node condition order. NodeReady should be last.")
}
if updatedNode.Status.Conditions[lastIndex].Message == "" {
t.Errorf("unexpected empty condition message")
}
updatedNode.Status.Conditions[lastIndex].Message = ""
expectedNode.Status.Conditions[lastIndex] = api.NodeCondition{
Type: api.NodeReady,
Status: status,
Reason: reason,
Message: message,
LastHeartbeatTime: unversioned.Time{},
LastTransitionTime: unversioned.Time{},
}
@ -808,23 +811,21 @@ func TestUpdateNodeStatusWithRuntimeStateError(t *testing.T) {
}
}
readyMessage := "kubelet is posting ready status"
downMessage := "container runtime is down"
// TODO(random-liu): Refactor the unit test to be table driven test.
// Should report kubelet not ready if the runtime check is out of date
clock.SetTime(time.Now().Add(-maxWaitForContainerRuntime))
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady", downMessage)
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Should report kubelet ready if the runtime check is updated
clock.SetTime(time.Now())
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionTrue, "KubeletReady", readyMessage)
checkNodeStatus(api.ConditionTrue, "KubeletReady")
// Should report kubelet not ready if the runtime check is out of date
clock.SetTime(time.Now().Add(-maxWaitForContainerRuntime))
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady", downMessage)
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Should report kubelet not ready if the runtime check failed
fakeRuntime := testKubelet.fakeRuntime
@ -832,7 +833,51 @@ func TestUpdateNodeStatusWithRuntimeStateError(t *testing.T) {
fakeRuntime.StatusErr = fmt.Errorf("injected runtime status error")
clock.SetTime(time.Now())
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady", downMessage)
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Test cri integration.
kubelet.kubeletConfiguration.ExperimentalRuntimeIntegrationType = "cri"
fakeRuntime.StatusErr = nil
// Should report node not ready if runtime status is nil.
fakeRuntime.RuntimeStatus = nil
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Should report node not ready if runtime status is empty.
fakeRuntime.RuntimeStatus = &kubecontainer.RuntimeStatus{}
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Should report node not ready if RuntimeReady is false.
fakeRuntime.RuntimeStatus = &kubecontainer.RuntimeStatus{
Conditions: []kubecontainer.RuntimeCondition{
{Type: kubecontainer.RuntimeReady, Status: false},
{Type: kubecontainer.NetworkReady, Status: true},
},
}
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
// Should report node ready if RuntimeReady is true.
fakeRuntime.RuntimeStatus = &kubecontainer.RuntimeStatus{
Conditions: []kubecontainer.RuntimeCondition{
{Type: kubecontainer.RuntimeReady, Status: true},
{Type: kubecontainer.NetworkReady, Status: true},
},
}
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionTrue, "KubeletReady")
// Should report node not ready if NetworkReady is false.
fakeRuntime.RuntimeStatus = &kubecontainer.RuntimeStatus{
Conditions: []kubecontainer.RuntimeCondition{
{Type: kubecontainer.RuntimeReady, Status: true},
{Type: kubecontainer.NetworkReady, Status: false},
},
}
kubelet.updateRuntimeUp()
checkNodeStatus(api.ConditionFalse, "KubeletNotReady")
}
func TestUpdateNodeStatusError(t *testing.T) {

View File

@ -216,3 +216,17 @@ func buildFullContainerLogsPath(podUID types.UID, containerName string, restartC
func buildPodLogsDirectory(podUID types.UID) string {
return filepath.Join(podLogsRootDirectory, string(podUID))
}
// toKubeRuntimeStatus converts the runtimeApi.RuntimeStatus to kubecontainer.RuntimeStatus.
func toKubeRuntimeStatus(status *runtimeApi.RuntimeStatus) *kubecontainer.RuntimeStatus {
conditions := []kubecontainer.RuntimeCondition{}
for _, c := range status.GetConditions() {
conditions = append(conditions, kubecontainer.RuntimeCondition{
Type: kubecontainer.RuntimeConditionType(c.GetType()),
Status: c.GetStatus(),
Reason: c.GetReason(),
Message: c.GetMessage(),
})
}
return &kubecontainer.RuntimeStatus{Conditions: conditions}
}

View File

@ -68,6 +68,15 @@ func (in instrumentedRuntimeService) Version(apiVersion string) (*runtimeApi.Ver
return out, err
}
func (in instrumentedRuntimeService) Status() (*runtimeApi.RuntimeStatus, error) {
const operation = "status"
defer recordOperation(operation, time.Now())
out, err := in.service.Status()
recordError(operation, err)
return out, err
}
func (in instrumentedRuntimeService) CreateContainer(podSandboxID string, config *runtimeApi.ContainerConfig, sandboxConfig *runtimeApi.PodSandboxConfig) (string, error) {
const operation = "create_container"
defer recordOperation(operation, time.Now())

View File

@ -268,15 +268,14 @@ func (m *kubeGenericRuntimeManager) APIVersion() (kubecontainer.Version, error)
return newRuntimeVersion(typedVersion.GetRuntimeApiVersion())
}
// Status returns error if the runtime is unhealthy; nil otherwise.
func (m *kubeGenericRuntimeManager) Status() error {
_, err := m.runtimeService.Version(kubeRuntimeAPIVersion)
// Status returns the status of the runtime. An error is returned if the Status
// function itself fails, nil otherwise.
func (m *kubeGenericRuntimeManager) Status() (*kubecontainer.RuntimeStatus, error) {
status, err := m.runtimeService.Status()
if err != nil {
glog.Errorf("Checkout remote runtime status failed: %v", err)
return err
return nil, err
}
return nil
return toKubeRuntimeStatus(status), nil
}
// GetPods returns a list of containers grouped by pods. The boolean parameter

View File

@ -339,3 +339,17 @@ func (r *RemoteRuntimeService) UpdateRuntimeConfig(runtimeConfig *runtimeApi.Run
return nil
}
// Status returns the status of the runtime.
func (r *RemoteRuntimeService) Status() (*runtimeApi.RuntimeStatus, error) {
ctx, cancel := getContextWithTimeout(r.timeout)
defer cancel()
resp, err := r.runtimeClient.Status(ctx, &runtimeApi.StatusRequest{})
if err != nil {
glog.Errorf("Status from runtime service failed: %v", err)
return nil, err
}
return resp.Status, nil
}

View File

@ -1701,8 +1701,8 @@ func (r *Runtime) APIVersion() (kubecontainer.Version, error) {
}
// Status returns error if rkt is unhealthy, nil otherwise.
func (r *Runtime) Status() error {
return r.checkVersion(minimumRktBinVersion, minimumRktApiVersion, minimumSystemdVersion)
func (r *Runtime) Status() (*kubecontainer.RuntimeStatus, error) {
return nil, r.checkVersion(minimumRktBinVersion, minimumRktApiVersion, minimumSystemdVersion)
}
// SyncPod syncs the running pod to match the specified desired pod.