Merge pull request #41742 from feiskyer/apparmor

Automatic merge from submit-queue (batch tested with PRs 40774, 41742)

CRI: using typed filed for Apparmor

**What this PR does / why we need it**:

CRI supports AppArmor via annotations [today](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/api/v1alpha1/runtime/api.proto#L237), we should move them to typed and structured fields instead. (refer [here](https://github.com/kubernetes/kubernetes/issues/30819#issuecomment-253369441))

**Which issue this PR fixes** 

Part of #39130.

**Release note**:

```release-note
NONE
```
pull/6/head
Kubernetes Submit Queue 2017-05-01 11:19:16 -07:00 committed by GitHub
commit 1d7c5cc08e
10 changed files with 363 additions and 321 deletions

View File

@ -641,17 +641,7 @@ type PodSandboxConfig struct {
// and the CRI). Whenever possible, however, runtime authors SHOULD
// consider proposing new typed fields for any new features instead.
//
// 1. AppArmor
//
// key: container.apparmor.security.beta.kubernetes.io/<container_name>
// description: apparmor profile for a container in this pod.
// value:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
//
// 2. Seccomp
// 1. Seccomp
//
// key: security.alpha.kubernetes.io/seccomp/pod
// description: the seccomp profile for the containers of an entire pod.
@ -668,7 +658,7 @@ type PodSandboxConfig struct {
// local seccomp profile root. Note that profile root is set in
// kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997.
//
// 3. Sysctls
// 2. Sysctls
//
// key: security.alpha.kubernetes.io/sysctls
// description: list of safe sysctls which are set for the sandbox.
@ -1350,6 +1340,12 @@ type LinuxContainerSecurityContext struct {
// List of groups applied to the first process run in the container, in
// addition to the container's primary GID.
SupplementalGroups []int64 `protobuf:"varint,8,rep,packed,name=supplemental_groups,json=supplementalGroups" json:"supplemental_groups,omitempty"`
// AppArmor profile for the container, candidate values are:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
ApparmorProfile string `protobuf:"bytes,9,opt,name=apparmor_profile,json=apparmorProfile,proto3" json:"apparmor_profile,omitempty"`
}
func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} }
@ -1414,6 +1410,13 @@ func (m *LinuxContainerSecurityContext) GetSupplementalGroups() []int64 {
return nil
}
func (m *LinuxContainerSecurityContext) GetApparmorProfile() string {
if m != nil {
return m.ApparmorProfile
}
return ""
}
// LinuxContainerConfig contains platform-specific configuration for
// Linux-based containers.
type LinuxContainerConfig struct {
@ -5214,6 +5217,12 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintApi(dAtA, i, uint64(j24))
i += copy(dAtA[i:], dAtA25[:j24])
}
if len(m.ApparmorProfile) > 0 {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(len(m.ApparmorProfile)))
i += copy(dAtA[i:], m.ApparmorProfile)
}
return i, nil
}
@ -7657,6 +7666,10 @@ func (m *LinuxContainerSecurityContext) Size() (n int) {
}
n += 1 + sovApi(uint64(l)) + l
}
l = len(m.ApparmorProfile)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n
}
@ -8899,6 +8912,7 @@ func (this *LinuxContainerSecurityContext) String() string {
`RunAsUsername:` + fmt.Sprintf("%v", this.RunAsUsername) + `,`,
`ReadonlyRootfs:` + fmt.Sprintf("%v", this.ReadonlyRootfs) + `,`,
`SupplementalGroups:` + fmt.Sprintf("%v", this.SupplementalGroups) + `,`,
`ApparmorProfile:` + fmt.Sprintf("%v", this.ApparmorProfile) + `,`,
`}`,
}, "")
return s
@ -14394,6 +14408,35 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error {
} else {
return fmt.Errorf("proto: wrong wireType = %d for field SupplementalGroups", wireType)
}
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ApparmorProfile", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
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 ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ApparmorProfile = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
@ -20654,226 +20697,227 @@ var (
func init() { proto.RegisterFile("api.proto", fileDescriptorApi) }
var fileDescriptorApi = []byte{
// 3528 bytes of a gzipped FileDescriptorProto
// 3550 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7,
0x95, 0x04, 0x40, 0x82, 0xc0, 0x03, 0x01, 0x82, 0x4d, 0x8a, 0x84, 0x40, 0x89, 0xa2, 0xc6, 0x92,
0x2c, 0xc9, 0x16, 0x2d, 0xd1, 0x5e, 0x69, 0x2d, 0x5b, 0xb2, 0x61, 0x92, 0x72, 0xd1, 0x92, 0x20,
0x7a, 0x20, 0x79, 0xed, 0xf5, 0x61, 0x76, 0x88, 0x69, 0x82, 0x23, 0x01, 0x33, 0xe3, 0x99, 0x86,
0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x71, 0x6f, 0x7b, 0x48, 0x95, 0x2b, 0x49, 0x55,
0x0e, 0xa9, 0x4a, 0x25, 0x3f, 0xc1, 0x55, 0xa9, 0x54, 0xe5, 0x90, 0x43, 0x72, 0x8b, 0x95, 0x7b,
0x7e, 0x43, 0xaa, 0xbf, 0x66, 0x7a, 0xbe, 0x28, 0x52, 0x76, 0xc5, 0xba, 0x4d, 0xbf, 0x7e, 0xfd,
0xfa, 0xf5, 0x7b, 0xaf, 0xdf, 0xd7, 0x34, 0x54, 0x4d, 0xcf, 0x5e, 0xf3, 0x7c, 0x97, 0xb8, 0x68,
0xda, 0x1f, 0x3b, 0xc4, 0x1e, 0xe1, 0xf6, 0x95, 0x81, 0x4d, 0xf6, 0xc7, 0xbb, 0x6b, 0x7d, 0x77,
0xf4, 0xd6, 0xc0, 0x1d, 0xb8, 0x6f, 0xb1, 0xf9, 0xdd, 0xf1, 0x1e, 0x1b, 0xb1, 0x01, 0xfb, 0xe2,
0xeb, 0xb4, 0xcb, 0xd0, 0xf8, 0x0c, 0xfb, 0x81, 0xed, 0x3a, 0x3a, 0xfe, 0x6a, 0x8c, 0x03, 0x82,
0x5a, 0x30, 0xfd, 0x94, 0x43, 0x5a, 0x85, 0xd5, 0xc2, 0xc5, 0xaa, 0x2e, 0x87, 0xda, 0xb7, 0x05,
0x98, 0x0d, 0x91, 0x03, 0xcf, 0x75, 0x02, 0x9c, 0x8f, 0x8d, 0xce, 0xc2, 0x8c, 0xe0, 0xc9, 0x70,
0xcc, 0x11, 0x6e, 0x15, 0xd9, 0x74, 0x4d, 0xc0, 0xba, 0xe6, 0x08, 0xa3, 0xd7, 0x61, 0x56, 0xa2,
0x48, 0x22, 0x25, 0x86, 0xd5, 0x10, 0x60, 0xb1, 0x1b, 0x5a, 0x83, 0x79, 0x89, 0x68, 0x7a, 0x76,
0x88, 0x3c, 0xc9, 0x90, 0xe7, 0xc4, 0x54, 0xc7, 0xb3, 0x05, 0xbe, 0xf6, 0x25, 0x54, 0x37, 0xbb,
0xbd, 0x0d, 0xd7, 0xd9, 0xb3, 0x07, 0x94, 0xc5, 0x00, 0xfb, 0x74, 0x4d, 0xab, 0xb0, 0x5a, 0xa2,
0x2c, 0x8a, 0x21, 0x6a, 0x43, 0x25, 0xc0, 0xa6, 0xdf, 0xdf, 0xc7, 0x41, 0xab, 0xc8, 0xa6, 0xc2,
0x31, 0x5d, 0xe5, 0x7a, 0xc4, 0x76, 0x9d, 0xa0, 0x55, 0xe2, 0xab, 0xc4, 0x50, 0xfb, 0xbf, 0x02,
0xd4, 0x76, 0x5c, 0x9f, 0xdc, 0x37, 0x3d, 0xcf, 0x76, 0x06, 0xe8, 0x0a, 0x54, 0x98, 0x2c, 0xfb,
0xee, 0x90, 0xc9, 0xa0, 0xb1, 0x3e, 0xb7, 0x26, 0x58, 0x5a, 0xdb, 0x11, 0x13, 0x7a, 0x88, 0x82,
0xce, 0x43, 0xa3, 0xef, 0x3a, 0xc4, 0xb4, 0x1d, 0xec, 0x1b, 0x9e, 0xeb, 0x13, 0x26, 0x99, 0x29,
0xbd, 0x1e, 0x42, 0x29, 0x71, 0xb4, 0x0c, 0xd5, 0x7d, 0x37, 0x20, 0x1c, 0xa3, 0xc4, 0x30, 0x2a,
0x14, 0xc0, 0x26, 0x97, 0x60, 0x9a, 0x4d, 0xda, 0x9e, 0x90, 0x41, 0x99, 0x0e, 0xb7, 0x3d, 0xed,
0x9b, 0x02, 0x4c, 0xdd, 0x77, 0xc7, 0x0e, 0x49, 0x6c, 0x63, 0x92, 0x7d, 0xa1, 0x1f, 0x65, 0x1b,
0x93, 0xec, 0x47, 0xdb, 0x50, 0x0c, 0xae, 0x22, 0xbe, 0x0d, 0x9d, 0x6c, 0x43, 0xc5, 0xc7, 0xa6,
0xe5, 0x3a, 0xc3, 0x03, 0xc6, 0x42, 0x45, 0x0f, 0xc7, 0x54, 0x77, 0x01, 0x1e, 0xda, 0xce, 0xf8,
0x99, 0xe1, 0xe3, 0xa1, 0xb9, 0x8b, 0x87, 0x8c, 0x95, 0x8a, 0xde, 0x10, 0x60, 0x9d, 0x43, 0xb5,
0xc7, 0x30, 0x4b, 0x95, 0x1d, 0x78, 0x66, 0x1f, 0x3f, 0x60, 0x22, 0xa4, 0xa6, 0xc1, 0x36, 0x75,
0x30, 0xf9, 0xda, 0xf5, 0x9f, 0x30, 0xce, 0x2a, 0x7a, 0x8d, 0xc2, 0xba, 0x1c, 0x84, 0x4e, 0x42,
0x85, 0xf3, 0x65, 0x5b, 0x8c, 0xad, 0x8a, 0xce, 0x4e, 0xbc, 0x63, 0x5b, 0xe1, 0x94, 0xed, 0xf5,
0x05, 0x57, 0xd3, 0xfc, 0xf4, 0x7d, 0x4d, 0x03, 0xd8, 0x76, 0xc8, 0xf5, 0x77, 0x3e, 0x33, 0x87,
0x63, 0x8c, 0x16, 0x60, 0xea, 0x29, 0xfd, 0x60, 0xf4, 0x4b, 0x3a, 0x1f, 0x68, 0x7f, 0x2a, 0xc2,
0xf2, 0x3d, 0xca, 0x60, 0xcf, 0x74, 0xac, 0x5d, 0xf7, 0x59, 0x0f, 0xf7, 0xc7, 0xbe, 0x4d, 0x0e,
0x36, 0x5c, 0x87, 0xe0, 0x67, 0x04, 0x6d, 0xc1, 0x9c, 0x23, 0xf9, 0x35, 0xa4, 0x09, 0x50, 0x0a,
0xb5, 0xf5, 0x56, 0xa8, 0xd7, 0xc4, 0x89, 0xf4, 0xa6, 0x13, 0x07, 0x04, 0xe8, 0x83, 0x48, 0x3e,
0x92, 0x48, 0x91, 0x11, 0x59, 0x0c, 0x89, 0xf4, 0xb6, 0x18, 0x1f, 0x82, 0x84, 0x94, 0x9b, 0x24,
0xf0, 0x36, 0xd0, 0xbb, 0x62, 0x98, 0x81, 0x31, 0x0e, 0xb0, 0xcf, 0x4e, 0x5a, 0x5b, 0x9f, 0x0f,
0x17, 0x47, 0xe7, 0xd4, 0xab, 0xfe, 0xd8, 0xe9, 0x04, 0x8f, 0x02, 0xec, 0xb3, 0x1b, 0x25, 0x34,
0x64, 0xf8, 0xae, 0x4b, 0xf6, 0x02, 0xa9, 0x15, 0x09, 0xd6, 0x19, 0x14, 0xbd, 0x05, 0xf3, 0xc1,
0xd8, 0xf3, 0x86, 0x78, 0x84, 0x1d, 0x62, 0x0e, 0x8d, 0x81, 0xef, 0x8e, 0xbd, 0xa0, 0x35, 0xb5,
0x5a, 0xba, 0x58, 0xd2, 0x91, 0x3a, 0xf5, 0x31, 0x9b, 0x41, 0x2b, 0x00, 0x9e, 0x6f, 0x3f, 0xb5,
0x87, 0x78, 0x80, 0xad, 0x56, 0x99, 0x11, 0x55, 0x20, 0xda, 0xff, 0x14, 0xe0, 0x04, 0x3b, 0xce,
0x8e, 0x6b, 0x09, 0xc9, 0x8a, 0xfb, 0xf7, 0x1a, 0xd4, 0xfb, 0x8c, 0xbc, 0xe1, 0x99, 0x3e, 0x76,
0x88, 0x30, 0xc4, 0x19, 0x0e, 0xdc, 0x61, 0x30, 0xf4, 0x00, 0x9a, 0x81, 0x50, 0x84, 0xd1, 0xe7,
0x9a, 0x10, 0xf2, 0x3a, 0x17, 0x1e, 0xf9, 0x10, 0xad, 0xe9, 0xb3, 0x41, 0x1c, 0xa0, 0xf9, 0x80,
0x22, 0x4e, 0xee, 0x63, 0x62, 0x5a, 0x26, 0x31, 0x11, 0x82, 0x49, 0xe6, 0x8c, 0x38, 0x0b, 0xec,
0x1b, 0x35, 0xa1, 0x34, 0x16, 0x56, 0x56, 0xd5, 0xe9, 0x27, 0x3a, 0x05, 0xd5, 0x50, 0x9f, 0xc2,
0x23, 0x45, 0x00, 0xea, 0x19, 0x4c, 0x42, 0xf0, 0xc8, 0x23, 0x4c, 0xb6, 0x75, 0x5d, 0x0e, 0xb5,
0xdf, 0x4d, 0x42, 0x33, 0x75, 0xfc, 0x1b, 0x50, 0x19, 0x89, 0xed, 0x85, 0x19, 0x2d, 0x47, 0xee,
0x21, 0xc5, 0xa1, 0x1e, 0x22, 0xd3, 0xdb, 0x47, 0xed, 0x5a, 0x71, 0x9e, 0xe1, 0x98, 0xca, 0x74,
0xe8, 0x0e, 0x0c, 0xcb, 0xf6, 0x71, 0x9f, 0xb8, 0xfe, 0x81, 0xe0, 0x72, 0x66, 0xe8, 0x0e, 0x36,
0x25, 0x0c, 0x5d, 0x03, 0xb0, 0x9c, 0x80, 0x8a, 0x73, 0xcf, 0x1e, 0x30, 0x5e, 0x6b, 0xeb, 0x28,
0xdc, 0x3b, 0x74, 0x90, 0x7a, 0xd5, 0x72, 0x02, 0xc1, 0xec, 0xbb, 0x50, 0xa7, 0x0e, 0xc7, 0x18,
0x71, 0xdf, 0xc6, 0x0d, 0xa2, 0xb6, 0xbe, 0xa0, 0x70, 0x1c, 0x3a, 0x3e, 0x7d, 0xc6, 0x8b, 0x06,
0x01, 0xba, 0x05, 0x65, 0x76, 0xe1, 0x83, 0x56, 0x99, 0xad, 0x39, 0x9f, 0x71, 0x4a, 0xbe, 0xcb,
0xda, 0x3d, 0x86, 0xb7, 0xe5, 0x10, 0xff, 0x40, 0x17, 0x8b, 0xd0, 0x3d, 0xa8, 0x99, 0x8e, 0xe3,
0x12, 0x93, 0xdf, 0x95, 0x69, 0x46, 0xe3, 0x72, 0x3e, 0x8d, 0x4e, 0x84, 0xcc, 0x09, 0xa9, 0xcb,
0xd1, 0x3b, 0x30, 0xc5, 0x2e, 0x53, 0xab, 0xc2, 0x4e, 0xbd, 0x12, 0xb7, 0xa1, 0x24, 0x31, 0x9d,
0x23, 0xb7, 0xdf, 0x85, 0x9a, 0xc2, 0x1a, 0x35, 0x8c, 0x27, 0xf8, 0x40, 0xd8, 0x0a, 0xfd, 0x8c,
0x3c, 0x0a, 0xd7, 0x07, 0x1f, 0xdc, 0x2c, 0xfe, 0x6b, 0xa1, 0x7d, 0x1b, 0x9a, 0x49, 0x8e, 0x8e,
0xb3, 0x5e, 0xdb, 0x86, 0x05, 0x7d, 0xec, 0x44, 0x8c, 0xc9, 0x68, 0x7c, 0x0d, 0xca, 0x42, 0x7f,
0xdc, 0x76, 0x4e, 0xe6, 0x4a, 0x44, 0x17, 0x88, 0xda, 0x2d, 0x38, 0x91, 0x20, 0x25, 0x62, 0xf5,
0x39, 0x68, 0x78, 0xae, 0x65, 0x04, 0x1c, 0x6c, 0xd8, 0x96, 0xbc, 0x89, 0x5e, 0x88, 0xbb, 0x6d,
0xd1, 0xe5, 0x3d, 0xe2, 0x7a, 0x69, 0x56, 0x8e, 0xb6, 0xbc, 0x05, 0x8b, 0xc9, 0xe5, 0x7c, 0x7b,
0xed, 0x03, 0x58, 0xd2, 0xf1, 0xc8, 0x7d, 0x8a, 0x5f, 0x96, 0x74, 0x1b, 0x5a, 0x69, 0x02, 0x11,
0xf1, 0x08, 0xda, 0x23, 0x26, 0x19, 0x07, 0xc7, 0x23, 0x7e, 0x49, 0x25, 0x20, 0xa2, 0x10, 0xa7,
0x83, 0x1a, 0x50, 0xb4, 0x3d, 0xb1, 0xa8, 0x68, 0x7b, 0xda, 0x17, 0x50, 0xed, 0xaa, 0xde, 0x40,
0x0d, 0x63, 0x55, 0x5d, 0x0e, 0xd1, 0x7a, 0x94, 0x41, 0x14, 0x5f, 0x10, 0x3e, 0xc2, 0xdc, 0xe2,
0x6e, 0xca, 0x89, 0x0a, 0x1e, 0xd6, 0x01, 0x42, 0x0f, 0x24, 0xc3, 0x11, 0x4a, 0xd3, 0xd3, 0x15,
0x2c, 0xed, 0x67, 0x31, 0x77, 0xa4, 0x1c, 0xc6, 0x0a, 0x0f, 0x63, 0xc5, 0xdc, 0x53, 0xf1, 0x38,
0xee, 0x69, 0x0d, 0xa6, 0x02, 0x62, 0x12, 0xee, 0x20, 0x1b, 0xca, 0xe1, 0xe2, 0x5b, 0x62, 0x9d,
0xa3, 0xa1, 0xd3, 0x00, 0x7d, 0x1f, 0x9b, 0x04, 0x5b, 0x86, 0xc9, 0x3d, 0x67, 0x49, 0xaf, 0x0a,
0x48, 0x87, 0xa0, 0x9b, 0x91, 0x1c, 0xa7, 0x18, 0x1b, 0xab, 0x19, 0x04, 0x63, 0x7a, 0x89, 0x24,
0x1d, 0xde, 0xf6, 0xf2, 0xe1, 0xb7, 0x5d, 0xac, 0xe3, 0xc8, 0x8a, 0xc3, 0x9a, 0xce, 0x75, 0x58,
0x7c, 0xc5, 0x51, 0x1c, 0x56, 0x25, 0xd7, 0x61, 0x09, 0x1a, 0x87, 0x3a, 0xac, 0x9f, 0xd2, 0xf5,
0xdc, 0x87, 0x56, 0xfa, 0xea, 0x08, 0x97, 0x71, 0x0d, 0xca, 0x01, 0x83, 0x1c, 0xe2, 0x7e, 0xc4,
0x12, 0x81, 0xa8, 0xdd, 0x81, 0x85, 0x84, 0x05, 0xf0, 0x6c, 0x2c, 0xb4, 0x97, 0xc2, 0x91, 0xec,
0x45, 0xfb, 0x7b, 0x41, 0xb5, 0xde, 0x3b, 0xf6, 0x90, 0x60, 0x3f, 0x65, 0xbd, 0x6f, 0x4b, 0xa2,
0xdc, 0x74, 0x4f, 0xe7, 0x11, 0xe5, 0x89, 0x92, 0xb0, 0xc4, 0x1e, 0x34, 0x98, 0x0e, 0x8d, 0x00,
0x0f, 0x59, 0xa8, 0x64, 0x19, 0x7e, 0x6d, 0xfd, 0xcd, 0x8c, 0xd5, 0x7c, 0x5f, 0x6e, 0x00, 0x3d,
0x81, 0xce, 0xd5, 0x57, 0x1f, 0xaa, 0xb0, 0xf6, 0x87, 0x80, 0xd2, 0x48, 0xc7, 0xd2, 0xc3, 0x27,
0xf4, 0xee, 0xd3, 0x04, 0x3f, 0x23, 0x06, 0xec, 0x31, 0x36, 0x0e, 0x51, 0x02, 0xe7, 0x53, 0x17,
0x88, 0xda, 0xff, 0x97, 0x00, 0xa2, 0xc9, 0x57, 0xf6, 0xd2, 0xdf, 0x08, 0xaf, 0x20, 0xcf, 0x33,
0xce, 0x64, 0xd0, 0xcb, 0xbc, 0x7c, 0x77, 0xe2, 0x97, 0x8f, 0x67, 0x1c, 0xe7, 0xb2, 0x56, 0xbf,
0xb2, 0xd7, 0x6e, 0x03, 0x16, 0x93, 0xea, 0x16, 0x97, 0xee, 0x12, 0x4c, 0xd9, 0x04, 0x8f, 0x78,
0xb9, 0xaa, 0xe6, 0xfc, 0x0a, 0x2e, 0xc7, 0xd0, 0xce, 0x42, 0x75, 0x7b, 0x64, 0x0e, 0x70, 0xcf,
0xc3, 0x7d, 0xba, 0x97, 0x4d, 0x07, 0x62, 0x7f, 0x3e, 0xd0, 0xd6, 0xa1, 0x72, 0x17, 0x1f, 0xf0,
0x3b, 0x78, 0x44, 0xfe, 0xb4, 0xdf, 0x17, 0x60, 0x89, 0xf9, 0xce, 0x0d, 0x59, 0x2c, 0xea, 0x38,
0x70, 0xc7, 0x7e, 0x1f, 0x07, 0x4c, 0xa5, 0xde, 0xd8, 0xf0, 0xb0, 0x6f, 0xbb, 0x96, 0x28, 0xad,
0xaa, 0x7d, 0x6f, 0xbc, 0xc3, 0x00, 0xb4, 0xa0, 0xa4, 0xd3, 0x5f, 0x8d, 0x5d, 0x61, 0x5b, 0x25,
0xbd, 0xd2, 0xf7, 0xc6, 0x9f, 0xd2, 0xb1, 0x5c, 0x1b, 0xec, 0x9b, 0x3e, 0x0e, 0x98, 0x0d, 0xf1,
0xb5, 0x3d, 0x06, 0x40, 0xd7, 0xe0, 0xc4, 0x08, 0x8f, 0x5c, 0xff, 0xc0, 0x18, 0xda, 0x23, 0x9b,
0x18, 0xb6, 0x63, 0xec, 0x1e, 0x10, 0x1c, 0x08, 0xc3, 0x41, 0x7c, 0xf2, 0x1e, 0x9d, 0xdb, 0x76,
0x3e, 0xa2, 0x33, 0x48, 0x83, 0xba, 0xeb, 0x8e, 0x8c, 0xa0, 0xef, 0xfa, 0xd8, 0x30, 0xad, 0xc7,
0x2c, 0x78, 0x94, 0xf4, 0x9a, 0xeb, 0x8e, 0x7a, 0x14, 0xd6, 0xb1, 0x1e, 0x6b, 0x26, 0xd4, 0x63,
0xa5, 0x16, 0xad, 0x02, 0x58, 0x4d, 0x25, 0xaa, 0x00, 0xfa, 0x4d, 0x61, 0xbe, 0x3b, 0x94, 0x72,
0x60, 0xdf, 0x14, 0x46, 0x0e, 0x3c, 0x59, 0x02, 0xb0, 0x6f, 0x2a, 0xb0, 0x21, 0x7e, 0x2a, 0xaa,
0xdd, 0xaa, 0xce, 0x07, 0x9a, 0x05, 0xb0, 0x61, 0x7a, 0xe6, 0xae, 0x3d, 0xb4, 0xc9, 0x01, 0xba,
0x04, 0x4d, 0xd3, 0xb2, 0x8c, 0xbe, 0x84, 0xd8, 0x58, 0xb6, 0x1e, 0x66, 0x4d, 0xcb, 0xda, 0x50,
0xc0, 0xe8, 0x0d, 0x98, 0xb3, 0x7c, 0xd7, 0x8b, 0xe3, 0xf2, 0x5e, 0x44, 0x93, 0x4e, 0xa8, 0xc8,
0xda, 0x6f, 0x4b, 0x70, 0x3a, 0xae, 0x96, 0x64, 0xf1, 0x7a, 0x03, 0x66, 0x12, 0xbb, 0xc6, 0xab,
0xc6, 0x88, 0x49, 0x3d, 0x86, 0x98, 0x28, 0xef, 0x8a, 0xc9, 0xf2, 0x2e, 0xbb, 0x2a, 0x2e, 0xfd,
0x18, 0x55, 0xf1, 0xe4, 0x0f, 0xa9, 0x8a, 0xa7, 0x8e, 0x54, 0x15, 0x5f, 0x60, 0x7d, 0x26, 0xb9,
0x88, 0x15, 0x54, 0x65, 0xde, 0x0c, 0x09, 0x71, 0x1c, 0xd9, 0x8f, 0x4a, 0x54, 0xcf, 0xd3, 0xc7,
0xa9, 0x9e, 0x2b, 0x79, 0xd5, 0xb3, 0xf6, 0xf3, 0x02, 0x2c, 0xc4, 0x35, 0x27, 0x0a, 0xae, 0xdb,
0x50, 0xf5, 0xe5, 0xd5, 0x12, 0xda, 0x5a, 0x8d, 0xa7, 0x2f, 0xe9, 0x2b, 0xa8, 0x47, 0x4b, 0xd0,
0xa7, 0xb9, 0x75, 0xf3, 0x85, 0x1c, 0x32, 0x2f, 0xac, 0x9c, 0x3b, 0x30, 0x17, 0x22, 0x1f, 0x5a,
0x38, 0x2b, 0x85, 0x70, 0x31, 0x5e, 0x08, 0x3b, 0x50, 0xde, 0xc4, 0x4f, 0xed, 0x3e, 0xfe, 0x51,
0xda, 0x50, 0xab, 0x50, 0xf3, 0xb0, 0x3f, 0xb2, 0x83, 0x20, 0xb4, 0xba, 0xaa, 0xae, 0x82, 0xb4,
0xbf, 0x4c, 0xc1, 0x6c, 0x52, 0xb2, 0xd7, 0x53, 0x75, 0x77, 0x3b, 0xba, 0x06, 0xc9, 0xf3, 0x29,
0x21, 0xee, 0xa2, 0xf4, 0xa2, 0xc5, 0x44, 0x92, 0x1d, 0x3a, 0x5a, 0xe1, 0x59, 0xe9, 0xf9, 0xfb,
0xee, 0x68, 0x64, 0x3a, 0x96, 0x6c, 0x11, 0x8a, 0x21, 0x95, 0x96, 0xe9, 0x0f, 0xa8, 0x6d, 0x53,
0x30, 0xfb, 0x46, 0x67, 0xa0, 0x46, 0x93, 0x55, 0xdb, 0x61, 0x65, 0x3b, 0xb3, 0xdc, 0xaa, 0x0e,
0x02, 0xb4, 0x69, 0xfb, 0xe8, 0x3c, 0x4c, 0x62, 0xe7, 0xa9, 0x0c, 0x66, 0x51, 0x0f, 0x51, 0x7a,
0x6f, 0x9d, 0x4d, 0xa3, 0x0b, 0x50, 0x1e, 0xb9, 0x63, 0x87, 0xc8, 0xb4, 0xb5, 0x11, 0x22, 0xb2,
0xc6, 0x9f, 0x2e, 0x66, 0xd1, 0x25, 0x98, 0xb6, 0x98, 0x0e, 0x64, 0x6e, 0x3a, 0x1b, 0x95, 0xfe,
0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0x86, 0xab, 0x89, 0x40, 0x9a, 0x10, 0x6a, 0x66, 0x2c,
0xbe, 0x1b, 0x8f, 0xc5, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71, 0x78, 0xe1, 0x7e, 0x12, 0x2a, 0x43,
0x77, 0xc0, 0xed, 0xa0, 0xc6, 0xeb, 0xa9, 0xa1, 0x3b, 0x60, 0x66, 0xb0, 0x40, 0x73, 0x0f, 0xcb,
0x76, 0x5a, 0x33, 0xec, 0x4e, 0xf2, 0x01, 0x0d, 0x29, 0xec, 0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5,
0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0xf1, 0x08, 0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e,
0xd2, 0x94, 0x91, 0x17, 0x0b, 0xb3, 0x89, 0x94, 0x31, 0xeb, 0x7e, 0xbe, 0x02, 0x9d, 0x81, 0x5f,
0x17, 0x60, 0x71, 0x83, 0x65, 0x4c, 0x8a, 0x27, 0x38, 0x46, 0x65, 0x8b, 0xae, 0x86, 0x2d, 0x84,
0x64, 0x19, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43, 0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0x6a,
0x3e, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e, 0x45, 0x76, 0x73, 0x16, 0x66, 0x22,
0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13, 0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4,
0x81, 0x8f, 0xb0, 0x96, 0xf5, 0x1f, 0xe2, 0x6b, 0x45, 0x8b, 0xa0, 0x07, 0x0b, 0x3d, 0xe2, 0x7a,
0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44, 0x4a, 0x23, 0x87, 0xda, 0x12, 0xef,
0x96, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0xb3, 0xe2, 0x65, 0x0e, 0x71, 0x52, 0xb6, 0x4a, 0xd2,
0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x75, 0x75, 0x25, 0x5e, 0x5d, 0x2d, 0xa5, 0x75, 0x1c,
0x2b, 0xae, 0xfe, 0xb7, 0xa8, 0x38, 0xcc, 0x9c, 0xda, 0x6a, 0x3d, 0x5e, 0x5b, 0x9d, 0xca, 0x21,
0x19, 0x2b, 0xad, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d, 0x55, 0x80, 0x4d, 0x32, 0xa7, 0xf1,
0x46, 0x7a, 0x8b, 0x7f, 0x62, 0xfd, 0xb5, 0xcd, 0xeb, 0xaf, 0x70, 0xeb, 0xb0, 0x81, 0x74, 0x35,
0x51, 0x7f, 0xb5, 0xf2, 0xd8, 0x0c, 0xcb, 0xaf, 0xff, 0x9e, 0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c,
0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32, 0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b,
0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15, 0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50,
0xe5, 0xa3, 0x18, 0x54, 0xa2, 0xd0, 0x9b, 0x4e, 0x16, 0x7a, 0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1,
0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e, 0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca,
0x96, 0x79, 0xf7, 0x78, 0x99, 0xa7, 0x5a, 0x95, 0x70, 0x84, 0xeb, 0x00, 0xe1, 0x9d, 0x97, 0xb5,
0x1e, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9, 0x3f, 0xea, 0x72, 0x1e, 0xc1, 0xab,
0xfc, 0x52, 0xcd, 0x92, 0x72, 0xda, 0x81, 0xd7, 0x53, 0x9d, 0x81, 0xa3, 0x59, 0xdd, 0x95, 0x78,
0x63, 0xe0, 0x78, 0xe6, 0x92, 0xea, 0x0b, 0xb0, 0xa0, 0x6e, 0xfa, 0x62, 0x9a, 0x97, 0x74, 0x55,
0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec, 0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09,
0xea, 0xb0, 0x9f, 0xa7, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b, 0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85,
0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b, 0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28,
0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x17, 0x2c, 0x1f, 0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40,
0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e, 0x9a, 0x75, 0x48, 0xbf, 0x31, 0x91,
0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0xb4, 0x1b, 0x95, 0x24, 0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53,
0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae, 0x26, 0xba, 0x92, 0xad, 0x3c, 0x29,
0x84, 0x4d, 0xc9, 0xff, 0x80, 0xd9, 0xad, 0x67, 0xb8, 0xdf, 0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb,
0x4d, 0x28, 0xf5, 0x47, 0x96, 0x28, 0xc7, 0xe9, 0xa7, 0x9a, 0x08, 0x94, 0xe2, 0x89, 0x80, 0x01,
0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8, 0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02,
0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd, 0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31,
0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2, 0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95,
0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13, 0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36,
0xf6, 0x87, 0xda, 0xbf, 0x43, 0xbd, 0x43, 0x88, 0xd9, 0xdf, 0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45,
0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73, 0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d,
0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31, 0x82, 0x49, 0xf1, 0xee, 0xa2, 0x74,
0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97, 0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f,
0x21, 0x92, 0xa6, 0x8b, 0x6a, 0xcf, 0xed, 0x30, 0x67, 0x42, 0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c,
0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44, 0x5a, 0xf1, 0xab, 0x02, 0x4c, 0x31,
0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10, 0x73, 0x10, 0x3e, 0x65, 0xa1, 0x80,
0x87, 0xe6, 0x20, 0x60, 0x2f, 0x71, 0xe8, 0xa4, 0x65, 0x0f, 0x70, 0x40, 0xe4, 0x7b, 0x96, 0x1a,
0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x27, 0xcf, 0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce,
0xf3, 0xff, 0xe2, 0x87, 0xb4, 0x58, 0xd8, 0xcf, 0xf2, 0x36, 0x54, 0x12, 0x5d, 0x95, 0x70, 0xac,
0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33, 0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f,
0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40, 0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3,
0xb1, 0xf5, 0xe1, 0x6f, 0xd0, 0x18, 0x81, 0xe4, 0xee, 0x62, 0xf1, 0x1f, 0x0a, 0x00, 0x9d, 0x31,
0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9, 0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae,
0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f, 0x5b, 0x88, 0xf4, 0x1b, 0x9d, 0x87,
0x06, 0x7f, 0x81, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10, 0xbd, 0xc4, 0x3a, 0x87, 0x76, 0x38,
0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2, 0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea,
0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40, 0x7c, 0x89, 0x26, 0x7b, 0x5b, 0x02,
0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87, 0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a,
0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70, 0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73,
0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62, 0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9,
0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97, 0xa1, 0x2e, 0x7e, 0x38, 0x0a, 0x23,
0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0x7b, 0xc7, 0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96,
0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34, 0xc4, 0xef, 0x49, 0x23, 0xf6, 0x03,
0x3f, 0x6a, 0x74, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a, 0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1,
0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x0b, 0xb9, 0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f,
0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07, 0xcd, 0x68, 0xc2, 0xb2, 0x65, 0xcb,
0x9c, 0xb5, 0xc2, 0x0b, 0x4a, 0x2b, 0x7c, 0x31, 0x0c, 0xc3, 0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19,
0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12, 0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2,
0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71, 0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1,
0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5, 0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c,
0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0x21, 0x1f, 0x9a, 0x86, 0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04,
0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3, 0x89, 0xbf, 0x5f, 0x68, 0x0e, 0xea,
0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56, 0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a,
0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5, 0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8,
0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7, 0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c,
0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77, 0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9,
0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc, 0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0xdf,
0xba, 0xcd, 0xd2, 0xfa, 0x2f, 0x6a, 0xd0, 0x90, 0x07, 0xc4, 0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69,
0xf9, 0xc6, 0x32, 0x4a, 0xd9, 0xe3, 0x0f, 0x42, 0xdb, 0xad, 0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4,
0xc3, 0x14, 0xa7, 0xfc, 0x69, 0x3c, 0xad, 0x8a, 0x32, 0xf5, 0x2b, 0xb3, 0xbd, 0x92, 0x37, 0x1d,
0x52, 0xec, 0x51, 0x6d, 0xa9, 0xef, 0x47, 0x50, 0xb4, 0x26, 0xf3, 0x5d, 0x4a, 0xfb, 0x4c, 0xee,
0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x5f, 0x8e, 0xa0, 0xa8, 0xcd, 0x9e, 0xf3, 0x2a, 0xa5, 0x7d,
0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x8d, 0xc5, 0x6a, 0xfe, 0x5f, 0xf2, 0x14, 0xe9, 0xbc, 0x5f,
0xef, 0x5c, 0x14, 0xf1, 0x3f, 0x84, 0x48, 0x7d, 0xd9, 0x90, 0xf1, 0xa7, 0x58, 0x11, 0x45, 0xf6,
0xaf, 0x45, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c, 0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb,
0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde, 0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65,
0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65, 0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3,
0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb, 0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57,
0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55, 0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8,
0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f, 0xda, 0x04, 0xea, 0x40, 0x45, 0xd6,
0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63, 0x26, 0x24, 0xf1, 0x2f, 0x30, 0x49,
0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3, 0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6,
0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87, 0x8b, 0x3f, 0xe1, 0xef, 0xae, 0x45,
0x8e, 0x8e, 0x96, 0x63, 0x8f, 0x12, 0xe3, 0x95, 0x40, 0xfb, 0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17,
0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7, 0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0,
0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1, 0xe5, 0xe2, 0xf5, 0xdf, 0x14, 0x61,
0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2, 0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51,
0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a, 0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6,
0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35, 0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3,
0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3, 0x74, 0x56, 0xa7, 0x70, 0x94, 0x95,
0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f, 0xfe, 0x7e, 0x65, 0xe2, 0xbf, 0x9e,
0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xe3, 0xf3, 0x95, 0xc2, 0x5f, 0x9f, 0xaf, 0x14, 0xbe,
0xf9, 0xdb, 0xca, 0xc4, 0x6e, 0x99, 0x3d, 0xc3, 0x7f, 0xfb, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff,
0x60, 0x93, 0xd6, 0x21, 0x3a, 0x31, 0x00, 0x00,
0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x31, 0xb7, 0x1c, 0x52, 0xe5, 0x4a, 0x52, 0x95,
0x43, 0xaa, 0x52, 0x95, 0x9f, 0xe0, 0xaa, 0x54, 0xaa, 0x72, 0xc8, 0x21, 0xb9, 0xc5, 0xca, 0x3d,
0xbf, 0x21, 0xd5, 0x5f, 0x33, 0x3d, 0x5f, 0x14, 0x29, 0xbb, 0x62, 0xdd, 0xa6, 0x5f, 0xbf, 0x7e,
0xfd, 0xfa, 0xbd, 0xd7, 0xef, 0x6b, 0x1a, 0xaa, 0xa6, 0x67, 0xaf, 0x79, 0xbe, 0x4b, 0x5c, 0x34,
0xed, 0x8f, 0x1d, 0x62, 0x8f, 0x70, 0xfb, 0xca, 0xc0, 0x26, 0xfb, 0xe3, 0xdd, 0xb5, 0xbe, 0x3b,
0x7a, 0x6b, 0xe0, 0x0e, 0xdc, 0xb7, 0xd8, 0xfc, 0xee, 0x78, 0x8f, 0x8d, 0xd8, 0x80, 0x7d, 0xf1,
0x75, 0xda, 0x65, 0x68, 0x7c, 0x86, 0xfd, 0xc0, 0x76, 0x1d, 0x1d, 0x7f, 0x35, 0xc6, 0x01, 0x41,
0x2d, 0x98, 0x7e, 0xca, 0x21, 0xad, 0xc2, 0x6a, 0xe1, 0x62, 0x55, 0x97, 0x43, 0xed, 0xdb, 0x02,
0xcc, 0x86, 0xc8, 0x81, 0xe7, 0x3a, 0x01, 0xce, 0xc7, 0x46, 0x67, 0x61, 0x46, 0xf0, 0x64, 0x38,
0xe6, 0x08, 0xb7, 0x8a, 0x6c, 0xba, 0x26, 0x60, 0x5d, 0x73, 0x84, 0xd1, 0xeb, 0x30, 0x2b, 0x51,
0x24, 0x91, 0x12, 0xc3, 0x6a, 0x08, 0xb0, 0xd8, 0x0d, 0xad, 0xc1, 0xbc, 0x44, 0x34, 0x3d, 0x3b,
0x44, 0x9e, 0x64, 0xc8, 0x73, 0x62, 0xaa, 0xe3, 0xd9, 0x02, 0x5f, 0xfb, 0x12, 0xaa, 0x9b, 0xdd,
0xde, 0x86, 0xeb, 0xec, 0xd9, 0x03, 0xca, 0x62, 0x80, 0x7d, 0xba, 0xa6, 0x55, 0x58, 0x2d, 0x51,
0x16, 0xc5, 0x10, 0xb5, 0xa1, 0x12, 0x60, 0xd3, 0xef, 0xef, 0xe3, 0xa0, 0x55, 0x64, 0x53, 0xe1,
0x98, 0xae, 0x72, 0x3d, 0x62, 0xbb, 0x4e, 0xd0, 0x2a, 0xf1, 0x55, 0x62, 0xa8, 0xfd, 0xac, 0x00,
0xb5, 0x1d, 0xd7, 0x27, 0xf7, 0x4d, 0xcf, 0xb3, 0x9d, 0x01, 0xba, 0x02, 0x15, 0x26, 0xcb, 0xbe,
0x3b, 0x64, 0x32, 0x68, 0xac, 0xcf, 0xad, 0x09, 0x96, 0xd6, 0x76, 0xc4, 0x84, 0x1e, 0xa2, 0xa0,
0xf3, 0xd0, 0xe8, 0xbb, 0x0e, 0x31, 0x6d, 0x07, 0xfb, 0x86, 0xe7, 0xfa, 0x84, 0x49, 0x66, 0x4a,
0xaf, 0x87, 0x50, 0x4a, 0x1c, 0x2d, 0x43, 0x75, 0xdf, 0x0d, 0x08, 0xc7, 0x28, 0x31, 0x8c, 0x0a,
0x05, 0xb0, 0xc9, 0x25, 0x98, 0x66, 0x93, 0xb6, 0x27, 0x64, 0x50, 0xa6, 0xc3, 0x6d, 0x4f, 0xfb,
0xa6, 0x00, 0x53, 0xf7, 0xdd, 0xb1, 0x43, 0x12, 0xdb, 0x98, 0x64, 0x5f, 0xe8, 0x47, 0xd9, 0xc6,
0x24, 0xfb, 0xd1, 0x36, 0x14, 0x83, 0xab, 0x88, 0x6f, 0x43, 0x27, 0xdb, 0x50, 0xf1, 0xb1, 0x69,
0xb9, 0xce, 0xf0, 0x80, 0xb1, 0x50, 0xd1, 0xc3, 0x31, 0xd5, 0x5d, 0x80, 0x87, 0xb6, 0x33, 0x7e,
0x66, 0xf8, 0x78, 0x68, 0xee, 0xe2, 0x21, 0x63, 0xa5, 0xa2, 0x37, 0x04, 0x58, 0xe7, 0x50, 0xed,
0x31, 0xcc, 0x52, 0x65, 0x07, 0x9e, 0xd9, 0xc7, 0x0f, 0x98, 0x08, 0xa9, 0x69, 0xb0, 0x4d, 0x1d,
0x4c, 0xbe, 0x76, 0xfd, 0x27, 0x8c, 0xb3, 0x8a, 0x5e, 0xa3, 0xb0, 0x2e, 0x07, 0xa1, 0x93, 0x50,
0xe1, 0x7c, 0xd9, 0x16, 0x63, 0xab, 0xa2, 0xb3, 0x13, 0xef, 0xd8, 0x56, 0x38, 0x65, 0x7b, 0x7d,
0xc1, 0xd5, 0x34, 0x3f, 0x7d, 0x5f, 0xd3, 0x00, 0xb6, 0x1d, 0x72, 0xfd, 0x9d, 0xcf, 0xcc, 0xe1,
0x18, 0xa3, 0x05, 0x98, 0x7a, 0x4a, 0x3f, 0x18, 0xfd, 0x92, 0xce, 0x07, 0xda, 0x9f, 0x8b, 0xb0,
0x7c, 0x8f, 0x32, 0xd8, 0x33, 0x1d, 0x6b, 0xd7, 0x7d, 0xd6, 0xc3, 0xfd, 0xb1, 0x6f, 0x93, 0x83,
0x0d, 0xd7, 0x21, 0xf8, 0x19, 0x41, 0x5b, 0x30, 0xe7, 0x48, 0x7e, 0x0d, 0x69, 0x02, 0x94, 0x42,
0x6d, 0xbd, 0x15, 0xea, 0x35, 0x71, 0x22, 0xbd, 0xe9, 0xc4, 0x01, 0x01, 0xfa, 0x20, 0x92, 0x8f,
0x24, 0x52, 0x64, 0x44, 0x16, 0x43, 0x22, 0xbd, 0x2d, 0xc6, 0x87, 0x20, 0x21, 0xe5, 0x26, 0x09,
0xbc, 0x0d, 0xf4, 0xae, 0x18, 0x66, 0x60, 0x8c, 0x03, 0xec, 0xb3, 0x93, 0xd6, 0xd6, 0xe7, 0xc3,
0xc5, 0xd1, 0x39, 0xf5, 0xaa, 0x3f, 0x76, 0x3a, 0xc1, 0xa3, 0x00, 0xfb, 0xec, 0x46, 0x09, 0x0d,
0x19, 0xbe, 0xeb, 0x92, 0xbd, 0x40, 0x6a, 0x45, 0x82, 0x75, 0x06, 0x45, 0x6f, 0xc1, 0x7c, 0x30,
0xf6, 0xbc, 0x21, 0x1e, 0x61, 0x87, 0x98, 0x43, 0x63, 0xe0, 0xbb, 0x63, 0x2f, 0x68, 0x4d, 0xad,
0x96, 0x2e, 0x96, 0x74, 0xa4, 0x4e, 0x7d, 0xcc, 0x66, 0xd0, 0x0a, 0x80, 0xe7, 0xdb, 0x4f, 0xed,
0x21, 0x1e, 0x60, 0xab, 0x55, 0x66, 0x44, 0x15, 0x88, 0xf6, 0x7f, 0x05, 0x38, 0xc1, 0x8e, 0xb3,
0xe3, 0x5a, 0x42, 0xb2, 0xe2, 0xfe, 0xbd, 0x06, 0xf5, 0x3e, 0x23, 0x6f, 0x78, 0xa6, 0x8f, 0x1d,
0x22, 0x0c, 0x71, 0x86, 0x03, 0x77, 0x18, 0x0c, 0x3d, 0x80, 0x66, 0x20, 0x14, 0x61, 0xf4, 0xb9,
0x26, 0x84, 0xbc, 0xce, 0x85, 0x47, 0x3e, 0x44, 0x6b, 0xfa, 0x6c, 0x10, 0x07, 0x68, 0x3e, 0xa0,
0x88, 0x93, 0xfb, 0x98, 0x98, 0x96, 0x49, 0x4c, 0x84, 0x60, 0x92, 0x39, 0x23, 0xce, 0x02, 0xfb,
0x46, 0x4d, 0x28, 0x8d, 0x85, 0x95, 0x55, 0x75, 0xfa, 0x89, 0x4e, 0x41, 0x35, 0xd4, 0xa7, 0xf0,
0x48, 0x11, 0x80, 0x7a, 0x06, 0x93, 0x10, 0x3c, 0xf2, 0x08, 0x93, 0x6d, 0x5d, 0x97, 0x43, 0xed,
0xf7, 0x93, 0xd0, 0x4c, 0x1d, 0xff, 0x06, 0x54, 0x46, 0x62, 0x7b, 0x61, 0x46, 0xcb, 0x91, 0x7b,
0x48, 0x71, 0xa8, 0x87, 0xc8, 0xf4, 0xf6, 0x51, 0xbb, 0x56, 0x9c, 0x67, 0x38, 0xa6, 0x32, 0x1d,
0xba, 0x03, 0xc3, 0xb2, 0x7d, 0xdc, 0x27, 0xae, 0x7f, 0x20, 0xb8, 0x9c, 0x19, 0xba, 0x83, 0x4d,
0x09, 0x43, 0xd7, 0x00, 0x2c, 0x27, 0xa0, 0xe2, 0xdc, 0xb3, 0x07, 0x8c, 0xd7, 0xda, 0x3a, 0x0a,
0xf7, 0x0e, 0x1d, 0xa4, 0x5e, 0xb5, 0x9c, 0x40, 0x30, 0xfb, 0x2e, 0xd4, 0xa9, 0xc3, 0x31, 0x46,
0xdc, 0xb7, 0x71, 0x83, 0xa8, 0xad, 0x2f, 0x28, 0x1c, 0x87, 0x8e, 0x4f, 0x9f, 0xf1, 0xa2, 0x41,
0x80, 0x6e, 0x41, 0x99, 0x5d, 0xf8, 0xa0, 0x55, 0x66, 0x6b, 0xce, 0x67, 0x9c, 0x92, 0xef, 0xb2,
0x76, 0x8f, 0xe1, 0x6d, 0x39, 0xc4, 0x3f, 0xd0, 0xc5, 0x22, 0x74, 0x0f, 0x6a, 0xa6, 0xe3, 0xb8,
0xc4, 0xe4, 0x77, 0x65, 0x9a, 0xd1, 0xb8, 0x9c, 0x4f, 0xa3, 0x13, 0x21, 0x73, 0x42, 0xea, 0x72,
0xf4, 0x0e, 0x4c, 0xb1, 0xcb, 0xd4, 0xaa, 0xb0, 0x53, 0xaf, 0xc4, 0x6d, 0x28, 0x49, 0x4c, 0xe7,
0xc8, 0xed, 0x77, 0xa1, 0xa6, 0xb0, 0x46, 0x0d, 0xe3, 0x09, 0x3e, 0x10, 0xb6, 0x42, 0x3f, 0x23,
0x8f, 0xc2, 0xf5, 0xc1, 0x07, 0x37, 0x8b, 0xff, 0x5e, 0x68, 0xdf, 0x86, 0x66, 0x92, 0xa3, 0xe3,
0xac, 0xd7, 0xb6, 0x61, 0x41, 0x1f, 0x3b, 0x11, 0x63, 0x32, 0x1a, 0x5f, 0x83, 0xb2, 0xd0, 0x1f,
0xb7, 0x9d, 0x93, 0xb9, 0x12, 0xd1, 0x05, 0xa2, 0x76, 0x0b, 0x4e, 0x24, 0x48, 0x89, 0x58, 0x7d,
0x0e, 0x1a, 0x9e, 0x6b, 0x19, 0x01, 0x07, 0x1b, 0xb6, 0x25, 0x6f, 0xa2, 0x17, 0xe2, 0x6e, 0x5b,
0x74, 0x79, 0x8f, 0xb8, 0x5e, 0x9a, 0x95, 0xa3, 0x2d, 0x6f, 0xc1, 0x62, 0x72, 0x39, 0xdf, 0x5e,
0xfb, 0x00, 0x96, 0x74, 0x3c, 0x72, 0x9f, 0xe2, 0x97, 0x25, 0xdd, 0x86, 0x56, 0x9a, 0x40, 0x44,
0x3c, 0x82, 0xf6, 0x88, 0x49, 0xc6, 0xc1, 0xf1, 0x88, 0x5f, 0x52, 0x09, 0x88, 0x28, 0xc4, 0xe9,
0xa0, 0x06, 0x14, 0x6d, 0x4f, 0x2c, 0x2a, 0xda, 0x9e, 0xf6, 0x05, 0x54, 0xbb, 0xaa, 0x37, 0x50,
0xc3, 0x58, 0x55, 0x97, 0x43, 0xb4, 0x1e, 0x65, 0x10, 0xc5, 0x17, 0x84, 0x8f, 0x30, 0xb7, 0xb8,
0x9b, 0x72, 0xa2, 0x82, 0x87, 0x75, 0x80, 0xd0, 0x03, 0xc9, 0x70, 0x84, 0xd2, 0xf4, 0x74, 0x05,
0x4b, 0xfb, 0x45, 0xcc, 0x1d, 0x29, 0x87, 0xb1, 0xc2, 0xc3, 0x58, 0x31, 0xf7, 0x54, 0x3c, 0x8e,
0x7b, 0x5a, 0x83, 0xa9, 0x80, 0x98, 0x84, 0x3b, 0xc8, 0x86, 0x72, 0xb8, 0xf8, 0x96, 0x58, 0xe7,
0x68, 0xe8, 0x34, 0x40, 0xdf, 0xc7, 0x26, 0xc1, 0x96, 0x61, 0x72, 0xcf, 0x59, 0xd2, 0xab, 0x02,
0xd2, 0x21, 0xe8, 0x66, 0x24, 0xc7, 0x29, 0xc6, 0xc6, 0x6a, 0x06, 0xc1, 0x98, 0x5e, 0x22, 0x49,
0x87, 0xb7, 0xbd, 0x7c, 0xf8, 0x6d, 0x17, 0xeb, 0x38, 0xb2, 0xe2, 0xb0, 0xa6, 0x73, 0x1d, 0x16,
0x5f, 0x71, 0x14, 0x87, 0x55, 0xc9, 0x75, 0x58, 0x82, 0xc6, 0xa1, 0x0e, 0xeb, 0xa7, 0x74, 0x3d,
0xf7, 0xa1, 0x95, 0xbe, 0x3a, 0xc2, 0x65, 0x5c, 0x83, 0x72, 0xc0, 0x20, 0x87, 0xb8, 0x1f, 0xb1,
0x44, 0x20, 0x6a, 0x77, 0x60, 0x21, 0x61, 0x01, 0x3c, 0x1b, 0x0b, 0xed, 0xa5, 0x70, 0x24, 0x7b,
0xd1, 0xfe, 0x51, 0x50, 0xad, 0xf7, 0x8e, 0x3d, 0x24, 0xd8, 0x4f, 0x59, 0xef, 0xdb, 0x92, 0x28,
0x37, 0xdd, 0xd3, 0x79, 0x44, 0x79, 0xa2, 0x24, 0x2c, 0xb1, 0x07, 0x0d, 0xa6, 0x43, 0x23, 0xc0,
0x43, 0x16, 0x2a, 0x59, 0x86, 0x5f, 0x5b, 0x7f, 0x33, 0x63, 0x35, 0xdf, 0x97, 0x1b, 0x40, 0x4f,
0xa0, 0x73, 0xf5, 0xd5, 0x87, 0x2a, 0xac, 0xfd, 0x21, 0xa0, 0x34, 0xd2, 0xb1, 0xf4, 0xf0, 0x09,
0xbd, 0xfb, 0x34, 0xc1, 0xcf, 0x88, 0x01, 0x7b, 0x8c, 0x8d, 0x43, 0x94, 0xc0, 0xf9, 0xd4, 0x05,
0xa2, 0xf6, 0xf3, 0x12, 0x40, 0x34, 0xf9, 0xca, 0x5e, 0xfa, 0x1b, 0xe1, 0x15, 0xe4, 0x79, 0xc6,
0x99, 0x0c, 0x7a, 0x99, 0x97, 0xef, 0x4e, 0xfc, 0xf2, 0xf1, 0x8c, 0xe3, 0x5c, 0xd6, 0xea, 0x57,
0xf6, 0xda, 0x6d, 0xc0, 0x62, 0x52, 0xdd, 0xe2, 0xd2, 0x5d, 0x82, 0x29, 0x9b, 0xe0, 0x11, 0x2f,
0x57, 0xd5, 0x9c, 0x5f, 0xc1, 0xe5, 0x18, 0xda, 0x59, 0xa8, 0x6e, 0x8f, 0xcc, 0x01, 0xee, 0x79,
0xb8, 0x4f, 0xf7, 0xb2, 0xe9, 0x40, 0xec, 0xcf, 0x07, 0xda, 0x3a, 0x54, 0xee, 0xe2, 0x03, 0x7e,
0x07, 0x8f, 0xc8, 0x9f, 0xf6, 0x87, 0x02, 0x2c, 0x31, 0xdf, 0xb9, 0x21, 0x8b, 0x45, 0x1d, 0x07,
0xee, 0xd8, 0xef, 0xe3, 0x80, 0xa9, 0xd4, 0x1b, 0x1b, 0x1e, 0xf6, 0x6d, 0xd7, 0x12, 0xa5, 0x55,
0xb5, 0xef, 0x8d, 0x77, 0x18, 0x80, 0x16, 0x94, 0x74, 0xfa, 0xab, 0xb1, 0x2b, 0x6c, 0xab, 0xa4,
0x57, 0xfa, 0xde, 0xf8, 0x53, 0x3a, 0x96, 0x6b, 0x83, 0x7d, 0xd3, 0xc7, 0x01, 0xb3, 0x21, 0xbe,
0xb6, 0xc7, 0x00, 0xe8, 0x1a, 0x9c, 0x18, 0xe1, 0x91, 0xeb, 0x1f, 0x18, 0x43, 0x7b, 0x64, 0x13,
0xc3, 0x76, 0x8c, 0xdd, 0x03, 0x82, 0x03, 0x61, 0x38, 0x88, 0x4f, 0xde, 0xa3, 0x73, 0xdb, 0xce,
0x47, 0x74, 0x06, 0x69, 0x50, 0x77, 0xdd, 0x91, 0x11, 0xf4, 0x5d, 0x1f, 0x1b, 0xa6, 0xf5, 0x98,
0x05, 0x8f, 0x92, 0x5e, 0x73, 0xdd, 0x51, 0x8f, 0xc2, 0x3a, 0xd6, 0x63, 0xcd, 0x84, 0x7a, 0xac,
0xd4, 0xa2, 0x55, 0x00, 0xab, 0xa9, 0x44, 0x15, 0x40, 0xbf, 0x29, 0xcc, 0x77, 0x87, 0x52, 0x0e,
0xec, 0x9b, 0xc2, 0xc8, 0x81, 0x27, 0x4b, 0x00, 0xf6, 0x4d, 0x05, 0x36, 0xc4, 0x4f, 0x45, 0xb5,
0x5b, 0xd5, 0xf9, 0x40, 0xb3, 0x00, 0x36, 0x4c, 0xcf, 0xdc, 0xb5, 0x87, 0x36, 0x39, 0x40, 0x97,
0xa0, 0x69, 0x5a, 0x96, 0xd1, 0x97, 0x10, 0x1b, 0xcb, 0xd6, 0xc3, 0xac, 0x69, 0x59, 0x1b, 0x0a,
0x18, 0xbd, 0x01, 0x73, 0x96, 0xef, 0x7a, 0x71, 0x5c, 0xde, 0x8b, 0x68, 0xd2, 0x09, 0x15, 0x59,
0x7b, 0x5e, 0x82, 0xd3, 0x71, 0xb5, 0x24, 0x8b, 0xd7, 0x1b, 0x30, 0x93, 0xd8, 0x35, 0x5e, 0x35,
0x46, 0x4c, 0xea, 0x31, 0xc4, 0x44, 0x79, 0x57, 0x4c, 0x96, 0x77, 0xd9, 0x55, 0x71, 0xe9, 0xc7,
0xa8, 0x8a, 0x27, 0x7f, 0x48, 0x55, 0x3c, 0x75, 0xa4, 0xaa, 0xf8, 0x02, 0xeb, 0x33, 0xc9, 0x45,
0xac, 0xa0, 0x2a, 0xf3, 0x66, 0x48, 0x88, 0xe3, 0xc8, 0x7e, 0x54, 0xa2, 0x7a, 0x9e, 0x3e, 0x4e,
0xf5, 0x5c, 0xc9, 0xad, 0x9e, 0xa9, 0x45, 0x78, 0x9e, 0xe9, 0x8f, 0x5c, 0xdf, 0xf0, 0x7c, 0x77,
0xcf, 0x1e, 0xe2, 0x56, 0x95, 0xb1, 0x30, 0x2b, 0xe1, 0x3b, 0x1c, 0xac, 0xfd, 0xb2, 0x00, 0x0b,
0x71, 0x25, 0x8b, 0xda, 0xec, 0x36, 0x54, 0x7d, 0x79, 0x0b, 0x85, 0x62, 0x57, 0xe3, 0x99, 0x4e,
0xfa, 0xb6, 0xea, 0xd1, 0x12, 0xf4, 0x69, 0x6e, 0x89, 0x7d, 0x21, 0x87, 0xcc, 0x0b, 0x8b, 0xec,
0x0e, 0xcc, 0x85, 0xc8, 0x87, 0xd6, 0xd8, 0x4a, 0xcd, 0x5c, 0x8c, 0xd7, 0xcc, 0x0e, 0x94, 0x37,
0xf1, 0x53, 0xbb, 0x8f, 0x7f, 0x94, 0x8e, 0xd5, 0x2a, 0xd4, 0x3c, 0xec, 0x8f, 0xec, 0x20, 0x08,
0x0d, 0xb4, 0xaa, 0xab, 0x20, 0xed, 0xaf, 0x53, 0x30, 0x9b, 0x94, 0xec, 0xf5, 0x54, 0x89, 0xde,
0x8e, 0x6e, 0x4c, 0xf2, 0x7c, 0x4a, 0x34, 0xbc, 0x28, 0x1d, 0x6e, 0x31, 0x91, 0x8f, 0x87, 0x3e,
0x59, 0x38, 0x61, 0x7a, 0xfe, 0xbe, 0x3b, 0x1a, 0x99, 0x8e, 0x25, 0xbb, 0x89, 0x62, 0x48, 0xa5,
0x65, 0xfa, 0x03, 0x7a, 0x0d, 0x28, 0x98, 0x7d, 0xa3, 0x33, 0x50, 0xa3, 0x79, 0xad, 0xed, 0xb0,
0x0a, 0x9f, 0x19, 0x79, 0x55, 0x07, 0x01, 0xda, 0xb4, 0x7d, 0x74, 0x1e, 0x26, 0xb1, 0xf3, 0x54,
0xc6, 0xbd, 0xa8, 0xdd, 0x28, 0x1d, 0xbd, 0xce, 0xa6, 0xd1, 0x05, 0x28, 0x8f, 0xdc, 0xb1, 0x43,
0x64, 0x86, 0xdb, 0x08, 0x11, 0x59, 0x8f, 0x50, 0x17, 0xb3, 0xe8, 0x12, 0x4c, 0x5b, 0x4c, 0x07,
0x32, 0x8d, 0x9d, 0x8d, 0xba, 0x04, 0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0xb1, 0xab, 0x89,
0x98, 0x9b, 0x10, 0x6a, 0x66, 0xd8, 0xbe, 0x1b, 0x0f, 0xdb, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71,
0x78, 0x8d, 0x7f, 0x12, 0x2a, 0x43, 0x77, 0xc0, 0xed, 0xa0, 0xc6, 0x4b, 0xaf, 0xa1, 0x3b, 0x60,
0x66, 0xb0, 0x40, 0xd3, 0x14, 0xcb, 0x76, 0x5a, 0x33, 0xec, 0xfa, 0xf2, 0x01, 0x8d, 0x3e, 0xec,
0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5, 0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0x1c, 0x09,
0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e, 0xd2, 0xec, 0x92, 0xd7, 0x15, 0xb3, 0x89, 0xec, 0x32, 0xeb,
0x7e, 0xbe, 0x02, 0x4d, 0x84, 0xdf, 0x16, 0x60, 0x71, 0x83, 0x25, 0x57, 0x8a, 0x27, 0x38, 0x46,
0x11, 0x8c, 0xae, 0x86, 0xdd, 0x86, 0x64, 0xc5, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43,
0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0xea, 0x53, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e,
0x45, 0x22, 0x74, 0x16, 0x66, 0x22, 0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13,
0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4, 0x81, 0x8f, 0xb0, 0x96, 0xb5, 0x2a, 0xe2, 0x6b, 0x45, 0x37,
0xa1, 0x07, 0x0b, 0x3d, 0xe2, 0x7a, 0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44,
0xf6, 0x23, 0x87, 0xda, 0x12, 0x6f, 0xac, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0x5f, 0xe3, 0x65,
0x0e, 0x71, 0x52, 0x76, 0x55, 0xd2, 0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x21, 0x76, 0x25,
0x5e, 0x88, 0x2d, 0xa5, 0x75, 0x1c, 0xab, 0xc3, 0xfe, 0xbf, 0xa8, 0x38, 0xcc, 0x9c, 0x32, 0x6c,
0x3d, 0x5e, 0x86, 0x9d, 0xca, 0x21, 0x19, 0xab, 0xc2, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d,
0x55, 0xab, 0x4d, 0x32, 0xa7, 0xf1, 0x46, 0x7a, 0x8b, 0x7f, 0x61, 0xa9, 0xb6, 0xcd, 0x4b, 0xb5,
0x70, 0xeb, 0xb0, 0xd7, 0x74, 0x35, 0x51, 0xaa, 0xb5, 0xf2, 0xd8, 0x0c, 0x2b, 0xb5, 0xff, 0x9d,
0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c, 0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32,
0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b, 0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15,
0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50, 0xe5, 0xa3, 0x18, 0x54, 0xa2, 0x26, 0x9c, 0x4e, 0xd6, 0x84,
0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1, 0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e,
0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca, 0x56, 0x84, 0xf7, 0x78, 0x45, 0xa8, 0x5a, 0x95, 0x70, 0x84,
0xeb, 0x00, 0xe1, 0x9d, 0x97, 0x65, 0x21, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9,
0x3f, 0x6a, 0x88, 0x1e, 0xc1, 0xab, 0xfc, 0x5a, 0xcd, 0x92, 0x72, 0x3a, 0x87, 0xd7, 0x53, 0x4d,
0x84, 0xa3, 0x59, 0xdd, 0x95, 0x78, 0x0f, 0xe1, 0x78, 0xe6, 0x92, 0x6a, 0x21, 0xb0, 0xa0, 0x6e,
0xfa, 0x62, 0x9a, 0x57, 0x7f, 0x55, 0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec,
0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09, 0xea, 0xb0, 0xff, 0xac, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b,
0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85, 0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b,
0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28, 0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x6f, 0x2d, 0x1f,
0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40, 0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e,
0x9a, 0x75, 0x48, 0x6b, 0x32, 0x91, 0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0x74, 0x26, 0x95, 0x24,
0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53, 0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae,
0x26, 0x1a, 0x98, 0xad, 0x3c, 0x29, 0x84, 0xfd, 0xcb, 0xff, 0x82, 0xd9, 0xad, 0x67, 0xb8, 0xdf,
0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb, 0x4d, 0x28, 0xf5, 0x47, 0x96, 0xa8, 0xdc, 0xe9, 0xa7, 0x9a,
0x08, 0x94, 0xe2, 0x89, 0x80, 0x01, 0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8,
0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02, 0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd,
0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31, 0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2,
0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95, 0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13,
0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36, 0xf6, 0x87, 0xda, 0x7f, 0x42, 0xbd, 0x43, 0x88, 0xd9, 0xdf,
0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45, 0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73,
0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d, 0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31,
0x82, 0x49, 0xf1, 0x44, 0xa3, 0x74, 0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97,
0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f, 0x21, 0x92, 0xa6, 0x8b, 0x6a, 0x7b, 0xee, 0x30, 0x67, 0x42,
0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c, 0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44,
0x5a, 0xf1, 0x9b, 0x02, 0x4c, 0x31, 0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10,
0x73, 0x10, 0xbe, 0x7a, 0xa1, 0x80, 0x87, 0xe6, 0x20, 0x60, 0x8f, 0x76, 0xe8, 0xa4, 0x65, 0x0f,
0x70, 0x40, 0xe4, 0xd3, 0x97, 0x1a, 0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x37, 0xcf,
0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce, 0xf3, 0x5f, 0xe8, 0x87, 0x74, 0x63, 0xd8, 0x7f, 0xf5, 0x36,
0x54, 0x12, 0x0d, 0x98, 0x70, 0xac, 0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33,
0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f, 0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40,
0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3, 0xb1, 0xf5, 0xe1, 0x1f, 0xd3, 0x18, 0x81, 0xe4, 0xee, 0x62,
0xf1, 0x1f, 0x0b, 0x00, 0x9d, 0x31, 0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9,
0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae, 0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f,
0xbb, 0x8d, 0xf4, 0x1b, 0x9d, 0x87, 0x06, 0x7f, 0xac, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10,
0x6d, 0xc7, 0x3a, 0x87, 0x76, 0x38, 0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2,
0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea, 0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40,
0x7c, 0x89, 0x26, 0xdb, 0x60, 0x02, 0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87,
0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a, 0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70,
0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73, 0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62,
0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9, 0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97,
0xa1, 0x2e, 0xfe, 0x4d, 0x0a, 0x23, 0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0xdb, 0xcc,
0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96, 0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34,
0xc4, 0x9f, 0x4c, 0x23, 0xf6, 0xaf, 0x3f, 0xea, 0x89, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a,
0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1, 0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x63, 0xba,
0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f, 0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07,
0xcd, 0x68, 0xc2, 0xb2, 0x65, 0x77, 0x9d, 0x75, 0xcd, 0x0b, 0x4a, 0xd7, 0x7c, 0x31, 0x0c, 0xc3,
0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19, 0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12,
0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2, 0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71,
0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1, 0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5,
0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c, 0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0xcd, 0x1f, 0x9a, 0x86,
0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04, 0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3,
0x89, 0x1f, 0x65, 0x68, 0x0e, 0xea, 0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56,
0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a, 0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5,
0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8, 0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7,
0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c, 0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77,
0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9, 0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc,
0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0x3f, 0xba, 0xcd, 0xd2, 0xfa, 0xaf, 0x6a, 0xd0, 0x90, 0x07, 0xc4,
0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69, 0xf9, 0x1c, 0x33, 0x4a, 0xd9, 0xe3, 0x6f, 0x47, 0xdb, 0xad,
0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4, 0xc3, 0x14, 0xa7, 0xfc, 0x94, 0x3c, 0xad, 0x8a, 0x32, 0xf5,
0xd7, 0xb3, 0xbd, 0x92, 0x37, 0x1d, 0x52, 0xec, 0x51, 0x6d, 0xa9, 0x4f, 0x4d, 0x50, 0xb4, 0x26,
0xf3, 0x09, 0x4b, 0xfb, 0x4c, 0xee, 0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x1f, 0x99, 0xa0, 0xa8,
0xcd, 0x9e, 0xf3, 0x80, 0xa5, 0x7d, 0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x39, 0xc6, 0x6a, 0xfe,
0x0f, 0xf5, 0x14, 0xe9, 0xbc, 0xbf, 0xf4, 0x5c, 0x14, 0xf1, 0x9f, 0x89, 0x48, 0x7d, 0x04, 0x91,
0xf1, 0x53, 0x59, 0x11, 0x45, 0xf6, 0x5f, 0x48, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c,
0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb, 0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde,
0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65, 0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65,
0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3, 0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb,
0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57, 0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55,
0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8, 0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f,
0xda, 0x04, 0xea, 0x40, 0x45, 0xd6, 0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63,
0x26, 0x24, 0xf1, 0x6f, 0x30, 0x49, 0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3,
0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6, 0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87,
0x8b, 0x3f, 0xe1, 0x4f, 0xb4, 0x45, 0x8e, 0x8e, 0x96, 0x63, 0xef, 0x17, 0xe3, 0x95, 0x40, 0xfb,
0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17, 0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7,
0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0, 0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1,
0xe5, 0xe2, 0xf5, 0xdf, 0x15, 0x61, 0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2,
0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51, 0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a,
0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6, 0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35,
0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3, 0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3,
0x74, 0x56, 0xa7, 0x70, 0x94, 0x95, 0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f,
0xf9, 0x7e, 0x65, 0xe2, 0x7f, 0x9e, 0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xd3, 0xf3, 0x95,
0xc2, 0xdf, 0x9e, 0xaf, 0x14, 0xbe, 0xf9, 0xfb, 0xca, 0xc4, 0x6e, 0x99, 0xbd, 0xd8, 0x7f, 0xfb,
0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x3a, 0x75, 0xdc, 0x65, 0x31, 0x00, 0x00,
}

View File

@ -269,17 +269,7 @@ message PodSandboxConfig {
// and the CRI). Whenever possible, however, runtime authors SHOULD
// consider proposing new typed fields for any new features instead.
//
// 1. AppArmor
//
// key: container.apparmor.security.beta.kubernetes.io/<container_name>
// description: apparmor profile for a container in this pod.
// value:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
//
// 2. Seccomp
// 1. Seccomp
//
// key: security.alpha.kubernetes.io/seccomp/pod
// description: the seccomp profile for the containers of an entire pod.
@ -296,7 +286,7 @@ message PodSandboxConfig {
// local seccomp profile root. Note that profile root is set in
// kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997.
//
// 3. Sysctls
// 2. Sysctls
//
// key: security.alpha.kubernetes.io/sysctls
// description: list of safe sysctls which are set for the sandbox.
@ -526,6 +516,12 @@ message LinuxContainerSecurityContext {
// List of groups applied to the first process run in the container, in
// addition to the container's primary GID.
repeated int64 supplemental_groups = 8;
// AppArmor profile for the container, candidate values are:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
string apparmor_profile = 9;
}
// LinuxContainerConfig contains platform-specific configuration for

View File

@ -145,7 +145,6 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
// Apply Linux-specific options if applicable.
if lc := config.GetLinux(); lc != nil {
// Apply resource options.
// TODO: Check if the units are correct.
// TODO: Can we assume the defaults are sane?
rOpts := lc.GetResources()
@ -162,7 +161,9 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
// Note: ShmSize is handled in kube_docker_client.go
// Apply security context.
applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep)
if err = applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep); err != nil {
return "", fmt.Errorf("failed to apply container security context for container %q: %v", config.Metadata.Name, err)
}
modifyPIDNamespaceOverrides(ds.disableSharedPID, apiVersion, hc)
}
@ -187,12 +188,12 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
}
hc.Resources.Devices = devices
// Apply appArmor and seccomp options.
securityOpts, err := getContainerSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep)
// Apply seccomp options.
seccompSecurityOpts, err := getSeccompSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep)
if err != nil {
return "", fmt.Errorf("failed to generate container security options for container %q: %v", config.Metadata.Name, err)
return "", fmt.Errorf("failed to generate seccomp security options for container %q: %v", config.Metadata.Name, err)
}
hc.SecurityOpt = append(hc.SecurityOpt, securityOpts...)
hc.SecurityOpt = append(hc.SecurityOpt, seccompSecurityOpts...)
createConfig.HostConfig = hc
createResp, err := ds.client.CreateContainer(createConfig)

View File

@ -475,7 +475,9 @@ func (ds *dockerService) applySandboxLinuxOptions(hc *dockercontainer.HostConfig
}
hc.CgroupParent = cgroupParent
// Apply security context.
applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator)
if err = applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator); err != nil {
return err
}
return nil
}
@ -541,7 +543,7 @@ func (ds *dockerService) makeSandboxDockerConfig(c *runtimeapi.PodSandboxConfig,
}
// Set security options.
securityOpts, err := getSandboxSecurityOpts(c, ds.seccompProfileRoot, securityOptSep)
securityOpts, err := getSeccompSecurityOpts(sandboxContainerName, c, ds.seccompProfileRoot, securityOptSep)
if err != nil {
return nil, fmt.Errorf("failed to generate sandbox security options for sandbox %q: %v", c.Metadata.Name, err)
}

View File

@ -181,26 +181,32 @@ func makePortsAndBindings(pm []*runtimeapi.PortMapping) (map[dockernat.Port]stru
return exposedPorts, portBindings
}
// getContainerSecurityOpt gets container security options from container and sandbox config, currently from sandbox
// annotations.
// getSeccompSecurityOpts gets container seccomp options from container and sandbox
// config, currently from sandbox annotations.
// It is an experimental feature and may be promoted to official runtime api in the future.
func getContainerSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) {
appArmorOpts, err := dockertools.GetAppArmorOpts(sandboxConfig.GetAnnotations(), containerName)
if err != nil {
return nil, err
}
func getSeccompSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) {
seccompOpts, err := dockertools.GetSeccompOpts(sandboxConfig.GetAnnotations(), containerName, seccompProfileRoot)
if err != nil {
return nil, err
}
securityOpts := append(appArmorOpts, seccompOpts...)
fmtOpts := dockertools.FmtDockerOpts(securityOpts, separator)
fmtOpts := dockertools.FmtDockerOpts(seccompOpts, separator)
return fmtOpts, nil
}
func getSandboxSecurityOpts(sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) {
// sandboxContainerName doesn't exist in the pod, so pod security options will be returned by default.
return getContainerSecurityOpts(sandboxContainerName, sandboxConfig, seccompProfileRoot, separator)
// getApparmorSecurityOpts gets apparmor options from container config.
func getApparmorSecurityOpts(sc *runtimeapi.LinuxContainerSecurityContext, separator rune) ([]string, error) {
if sc == nil || sc.ApparmorProfile == "" {
return nil, nil
}
appArmorOpts, err := dockertools.GetAppArmorOpts(sc.ApparmorProfile)
if err != nil {
return nil, err
}
fmtOpts := dockertools.FmtDockerOpts(appArmorOpts, separator)
return fmtOpts, nil
}
func getNetworkNamespace(c *dockertypes.ContainerJSON) string {

View File

@ -43,10 +43,10 @@ func TestLabelsAndAnnotationsRoundTrip(t *testing.T) {
assert.Equal(t, expectedAnnotations, actualAnnotations)
}
// TestGetContainerSecurityOpts tests the logic of generating container security options from sandbox annotations.
// TestGetSeccompSecurityOpts tests the logic of generating container seccomp options from sandbox annotations.
// The actual profile loading logic is tested in dockertools.
// TODO: Migrate the corresponding test to dockershim.
func TestGetContainerSecurityOpts(t *testing.T) {
func TestGetSeccompSecurityOpts(t *testing.T) {
containerName := "bar"
makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig {
return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations)
@ -78,29 +78,10 @@ func TestGetContainerSecurityOpts(t *testing.T) {
v1.SeccompPodAnnotationKey: "docker/default",
}),
expectedOpts: nil,
}, {
msg: "AppArmor runtime/default",
config: makeConfig(map[string]string{
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileRuntimeDefault,
}),
expectedOpts: []string{"seccomp=unconfined"},
}, {
msg: "AppArmor local profile",
config: makeConfig(map[string]string{
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo",
}),
expectedOpts: []string{"seccomp=unconfined", "apparmor=foo"},
}, {
msg: "AppArmor and seccomp profile",
config: makeConfig(map[string]string{
v1.SeccompContainerAnnotationKeyPrefix + containerName: "docker/default",
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo",
}),
expectedOpts: []string{"apparmor=foo"},
}}
for i, test := range tests {
opts, err := getContainerSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=')
opts, err := getSeccompSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=')
assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg)
assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg)
for _, opt := range test.expectedOpts {
@ -109,43 +90,36 @@ func TestGetContainerSecurityOpts(t *testing.T) {
}
}
// TestGetSandboxSecurityOpts tests the logic of generating sandbox security options from sandbox annotations.
func TestGetSandboxSecurityOpts(t *testing.T) {
makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig {
return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations)
// TestGetApparmorSecurityOpts tests the logic of generating container apparmor options from sandbox annotations.
// The actual profile loading logic is tested in dockertools.
// TODO: Migrate the corresponding test to dockershim.
func TestGetApparmorSecurityOpts(t *testing.T) {
makeConfig := func(profile string) *runtimeapi.LinuxContainerSecurityContext {
return &runtimeapi.LinuxContainerSecurityContext{
ApparmorProfile: profile,
}
}
tests := []struct {
msg string
config *runtimeapi.PodSandboxConfig
config *runtimeapi.LinuxContainerSecurityContext
expectedOpts []string
}{{
msg: "No security annotations",
config: makeConfig(nil),
expectedOpts: []string{"seccomp=unconfined"},
}, {
msg: "Seccomp default",
config: makeConfig(map[string]string{
v1.SeccompPodAnnotationKey: "docker/default",
}),
msg: "No AppArmor options",
config: makeConfig(""),
expectedOpts: nil,
}, {
msg: "Seccomp unconfined",
config: makeConfig(map[string]string{
v1.SeccompPodAnnotationKey: "unconfined",
}),
expectedOpts: []string{"seccomp=unconfined"},
msg: "AppArmor runtime/default",
config: makeConfig("runtime/default"),
expectedOpts: []string{},
}, {
msg: "Seccomp pod and container profile",
config: makeConfig(map[string]string{
v1.SeccompContainerAnnotationKeyPrefix + "test-container": "unconfined",
v1.SeccompPodAnnotationKey: "docker/default",
}),
expectedOpts: nil,
msg: "AppArmor local profile",
config: makeConfig(apparmor.ProfileNamePrefix + "foo"),
expectedOpts: []string{"apparmor=foo"},
}}
for i, test := range tests {
opts, err := getSandboxSecurityOpts(test.config, "test/seccomp/profile/root", '=')
opts, err := getApparmorSecurityOpts(test.config, '=')
assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg)
assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg)
for _, opt := range test.expectedOpts {

View File

@ -31,9 +31,9 @@ import (
)
// applySandboxSecurityContext updates docker sandbox options according to security context.
func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) {
func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) error {
if lc == nil {
return
return nil
}
var sc *runtimeapi.LinuxContainerSecurityContext
@ -48,20 +48,25 @@ func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *d
}
modifyContainerConfig(sc, config)
modifyHostConfig(sc, hc, separator)
if err := modifyHostConfig(sc, hc, separator); err != nil {
return err
}
modifySandboxNamespaceOptions(sc.GetNamespaceOptions(), hc, network)
return nil
}
// applyContainerSecurityContext updates docker container options according to security context.
func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) {
func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) error {
if lc == nil {
return
return nil
}
modifyContainerConfig(lc.SecurityContext, config)
modifyHostConfig(lc.SecurityContext, hc, separator)
if err := modifyHostConfig(lc.SecurityContext, hc, separator); err != nil {
return err
}
modifyContainerNamespaceOptions(lc.SecurityContext.GetNamespaceOptions(), sandboxID, hc)
return
return nil
}
// modifyContainerConfig applies container security context config to dockercontainer.Config.
@ -78,9 +83,9 @@ func modifyContainerConfig(sc *runtimeapi.LinuxContainerSecurityContext, config
}
// modifyHostConfig applies security context config to dockercontainer.HostConfig.
func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) {
func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) error {
if sc == nil {
return
return nil
}
// Apply supplemental groups.
@ -107,6 +112,15 @@ func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *
separator,
)
}
// Apply apparmor options.
apparmorSecurityOpts, err := getApparmorSecurityOpts(sc, separator)
if err != nil {
return fmt.Errorf("failed to generate apparmor security options: %v", err)
}
hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, apparmorSecurityOpts...)
return nil
}
// modifySandboxNamespaceOptions apply namespace options for sandbox

View File

@ -1260,13 +1260,13 @@ func GetSeccompOpts(annotations map[string]string, ctrName, profileRoot string)
// Get the docker security options for AppArmor.
func (dm *DockerManager) getAppArmorOpts(pod *v1.Pod, ctrName string) ([]dockerOpt, error) {
return GetAppArmorOpts(pod.Annotations, ctrName)
profile := apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, ctrName)
return GetAppArmorOpts(profile)
}
// Temporarily export this function to share with dockershim.
// TODO: clean this up.
func GetAppArmorOpts(annotations map[string]string, ctrName string) ([]dockerOpt, error) {
profile := apparmor.GetProfileNameFromPodAnnotations(annotations, ctrName)
func GetAppArmorOpts(profile string) ([]dockerOpt, error) {
if profile == "" || profile == apparmor.ProfileRuntimeDefault {
// The docker applies the default profile by default.
return nil, nil

View File

@ -45,6 +45,7 @@ go_library(
"//pkg/kubelet/types:go_default_library",
"//pkg/kubelet/util/cache:go_default_library",
"//pkg/kubelet/util/format:go_default_library",
"//pkg/security/apparmor:go_default_library",
"//pkg/securitycontext:go_default_library",
"//pkg/util/parsers:go_default_library",
"//pkg/util/selinux:go_default_library",

View File

@ -21,6 +21,7 @@ import (
"k8s.io/kubernetes/pkg/api/v1"
runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
"k8s.io/kubernetes/pkg/security/apparmor"
"k8s.io/kubernetes/pkg/securitycontext"
)
@ -32,6 +33,9 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po
synthesized = &runtimeapi.LinuxContainerSecurityContext{}
}
// set ApparmorProfile.
synthesized.ApparmorProfile = apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, container.Name)
// set RunAsUser.
if synthesized.RunAsUser == nil {
if uid != nil {