Bootstrap Token (#781)

* Partial implementation of Bootstrap Token
Fetching the token from the db and sending it back to the client when the client asks for it ie sends the GetBootstrapTokenRequest is not implemented

Also earlier code for Bootstrap Token from commit 58c3782 "mdm: add SetBootstrapToken command." is removed

* implements rest of the bootstrap token feature - micromdm now sends bootstrap token back to the client, when client requests it

* regenerate some proto files

* use original proto generator versions
    checkin.pb.go: golang/protobuf@v1.2.0
    mdm.pb.go: gogo/protobuf@v1.3.2
    device.pb.go: golang/protobuf@v1.0.0

* cleanup syntax

* use more idiomatic naming

* clean up BootstrapToken storage

* add GetBootstrapToken test

* remove extra newline

Co-authored-by: Jesse Peterson <jessepeterson@users.noreply.github.com>

* add doc comments

Co-authored-by: Ilkka Vanhatalo <ilkka.vanhatalo@helsinki.fi>
Co-authored-by: Jesse Peterson <jessepeterson@users.noreply.github.com>
This commit is contained in:
Kory Prince
2021-10-05 12:43:46 -05:00
committed by GitHub
parent 6dc4facba0
commit fcf1d185fc
25 changed files with 751 additions and 413 deletions

View File

@@ -7,9 +7,15 @@ import (
"github.com/go-kit/kit/endpoint"
"github.com/google/uuid"
"github.com/groob/plist"
"github.com/pkg/errors"
)
// BootstrapToken holds MDM Bootstrap Token data
type BootstrapToken struct {
BootstrapToken []byte
}
func (svc *MDMService) Checkin(ctx context.Context, event CheckinEvent) ([]byte, error) {
// reject user settings at the loginwindow.
// https://github.com/micromdm/micromdm/pull/379
@@ -33,8 +39,26 @@ func (svc *MDMService) Checkin(ctx context.Context, event CheckinEvent) ([]byte,
}
}
var resp []byte
if topic == GetBootstrapTokenTopic {
udid := event.Command.UDID
btBytes, err := svc.dev.GetBootstrapToken(ctx, udid)
if err != nil {
return nil, errors.Wrap(err, "fetching bootstrap token")
}
bt := &BootstrapToken{BootstrapToken: btBytes}
resp, err = plist.Marshal(bt)
if err != nil {
return nil, errors.Wrap(err, "marshal bootstrap token")
}
}
err = svc.pub.Publish(ctx, topic, msg)
return nil, errors.Wrapf(err, "publish checkin on topic: %s", topic)
return resp, errors.Wrapf(err, "publish checkin on topic: %s", topic)
}
func topicFromMessage(messageType string) (string, error) {
@@ -45,6 +69,10 @@ func topicFromMessage(messageType string) (string, error) {
return TokenUpdateTopic, nil
case "CheckOut":
return CheckoutTopic, nil
case "GetBootstrapToken":
return GetBootstrapTokenTopic, nil
case "SetBootstrapToken":
return SetBootstrapTokenTopic, nil
default:
return "", errors.Errorf("unknown checkin message type %s", messageType)
}

View File

@@ -19,14 +19,17 @@ type CheckinEvent struct {
// CheckinRequest represents an MDM checkin command struct.
type CheckinCommand struct {
// MessageType can be either Authenticate,
// TokenUpdate or CheckOut
// MessageType can be either
// Authenticate, CheckOut, TokenUpdate,
// GetBootstrapToken, or SetBootstrapToken
MessageType string
Topic string
UDID string
EnrollmentID string
auth
update
getBootstrap
setBootstrap
}
// Authenticate Message Type
@@ -60,6 +63,17 @@ type userTokenUpdate struct {
NotOnConsole bool `plist:",omitempty"`
}
// GetBootstrapToken Message Type
type getBootstrap struct {
GetAwaitingConfiguration bool
}
// SetBootstrapToken Message Type
type setBootstrap struct {
SetAwaitingConfiguration bool
BootstrapToken []byte
}
// data decodes to []byte,
// we can then attach a string method to the type
// Tokens are encoded as Hex Strings
@@ -102,6 +116,15 @@ func MarshalCheckinEvent(e *CheckinEvent) ([]byte, error) {
UserShortName: e.Command.UserShortName,
NotOnConsole: e.Command.NotOnConsole,
}
case "GetBootstrapToken":
command.GetBootstrapToken = &checkinproto.GetBootstrapToken{
GetAwaitingConfiguration: e.Command.GetAwaitingConfiguration,
}
case "SetBootstrapToken":
command.SetBootstrapToken = &checkinproto.SetBootstrapToken{
BootstrapToken: e.Command.BootstrapToken,
SetAwaitingConfiguration: e.Command.SetAwaitingConfiguration,
}
}
return proto.Marshal(&checkinproto.Event{
Id: e.ID,
@@ -151,6 +174,11 @@ func UnmarshalCheckinEvent(data []byte, e *CheckinEvent) error {
e.Command.UserLongName = pb.Command.TokenUpdate.UserLongName
e.Command.UserShortName = pb.Command.TokenUpdate.UserShortName
e.Command.NotOnConsole = pb.Command.TokenUpdate.NotOnConsole
case "GetBootstrapToken":
e.Command.GetAwaitingConfiguration = pb.Command.GetBootstrapToken.GetAwaitingConfiguration
case "SetBootstrapToken":
e.Command.BootstrapToken = pb.Command.SetBootstrapToken.BootstrapToken
e.Command.SetAwaitingConfiguration = pb.Command.SetBootstrapToken.SetAwaitingConfiguration
}
e.Raw = pb.GetRaw()
e.Params = pb.GetParams()

View File

@@ -165,6 +165,7 @@ func (svc *service) Enroll(ctx context.Context) (profile.Mobileconfig, error) {
}
const perUserConnections = "com.apple.mdm.per-user-connections"
const bootstrapToken = "com.apple.mdm.bootstraptoken"
func (svc *service) MakeEnrollmentProfile() (Profile, error) {
profile := NewProfile()
@@ -192,7 +193,7 @@ func (svc *service) MakeEnrollmentProfile() (Profile, error) {
ServerURL: svc.URL + "/mdm/connect",
Topic: topic,
SignMessage: true,
ServerCapabilities: []string{perUserConnections},
ServerCapabilities: []string{perUserConnections, bootstrapToken},
}
payloadContent := []interface{}{}

View File

@@ -3,9 +3,13 @@
package checkinproto
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
@@ -89,15 +93,17 @@ func (m *Event) GetParams() map[string]string {
}
type Command struct {
MessageType string `protobuf:"bytes,1,opt,name=message_type,json=messageType,proto3" json:"message_type,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
Udid string `protobuf:"bytes,3,opt,name=udid,proto3" json:"udid,omitempty"`
Authenticate *Authenticate `protobuf:"bytes,4,opt,name=authenticate,proto3" json:"authenticate,omitempty"`
TokenUpdate *TokenUpdate `protobuf:"bytes,5,opt,name=token_update,json=tokenUpdate,proto3" json:"token_update,omitempty"`
EnrollmentId string `protobuf:"bytes,6,opt,name=enrollment_id,json=enrollmentId,proto3" json:"enrollment_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
MessageType string `protobuf:"bytes,1,opt,name=message_type,json=messageType,proto3" json:"message_type,omitempty"`
Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
Udid string `protobuf:"bytes,3,opt,name=udid,proto3" json:"udid,omitempty"`
Authenticate *Authenticate `protobuf:"bytes,4,opt,name=authenticate,proto3" json:"authenticate,omitempty"`
TokenUpdate *TokenUpdate `protobuf:"bytes,5,opt,name=token_update,json=tokenUpdate,proto3" json:"token_update,omitempty"`
EnrollmentId string `protobuf:"bytes,6,opt,name=enrollment_id,json=enrollmentId,proto3" json:"enrollment_id,omitempty"`
GetBootstrapToken *GetBootstrapToken `protobuf:"bytes,7,opt,name=get_bootstrap_token,json=getBootstrapToken,proto3" json:"get_bootstrap_token,omitempty"`
SetBootstrapToken *SetBootstrapToken `protobuf:"bytes,8,opt,name=set_bootstrap_token,json=setBootstrapToken,proto3" json:"set_bootstrap_token,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Command) Reset() { *m = Command{} }
@@ -166,6 +172,20 @@ func (m *Command) GetEnrollmentId() string {
return ""
}
func (m *Command) GetGetBootstrapToken() *GetBootstrapToken {
if m != nil {
return m.GetBootstrapToken
}
return nil
}
func (m *Command) GetSetBootstrapToken() *SetBootstrapToken {
if m != nil {
return m.SetBootstrapToken
}
return nil
}
type Authenticate struct {
OsVersion string `protobuf:"bytes,1,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"`
BuildVersion string `protobuf:"bytes,2,opt,name=build_version,json=buildVersion,proto3" json:"build_version,omitempty"`
@@ -370,55 +390,148 @@ func (m *TokenUpdate) GetNotOnConsole() bool {
return false
}
type GetBootstrapToken struct {
GetAwaitingConfiguration bool `protobuf:"varint,1,opt,name=get_awaiting_configuration,json=getAwaitingConfiguration,proto3" json:"get_awaiting_configuration,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetBootstrapToken) Reset() { *m = GetBootstrapToken{} }
func (m *GetBootstrapToken) String() string { return proto.CompactTextString(m) }
func (*GetBootstrapToken) ProtoMessage() {}
func (*GetBootstrapToken) Descriptor() ([]byte, []int) {
return fileDescriptor_checkin_f106eb4ffaf2f7e3, []int{4}
}
func (m *GetBootstrapToken) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetBootstrapToken.Unmarshal(m, b)
}
func (m *GetBootstrapToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetBootstrapToken.Marshal(b, m, deterministic)
}
func (dst *GetBootstrapToken) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetBootstrapToken.Merge(dst, src)
}
func (m *GetBootstrapToken) XXX_Size() int {
return xxx_messageInfo_GetBootstrapToken.Size(m)
}
func (m *GetBootstrapToken) XXX_DiscardUnknown() {
xxx_messageInfo_GetBootstrapToken.DiscardUnknown(m)
}
var xxx_messageInfo_GetBootstrapToken proto.InternalMessageInfo
func (m *GetBootstrapToken) GetGetAwaitingConfiguration() bool {
if m != nil {
return m.GetAwaitingConfiguration
}
return false
}
type SetBootstrapToken struct {
BootstrapToken []byte `protobuf:"bytes,1,opt,name=bootstrap_token,json=bootstrapToken,proto3" json:"bootstrap_token,omitempty"`
SetAwaitingConfiguration bool `protobuf:"varint,2,opt,name=set_awaiting_configuration,json=setAwaitingConfiguration,proto3" json:"set_awaiting_configuration,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SetBootstrapToken) Reset() { *m = SetBootstrapToken{} }
func (m *SetBootstrapToken) String() string { return proto.CompactTextString(m) }
func (*SetBootstrapToken) ProtoMessage() {}
func (*SetBootstrapToken) Descriptor() ([]byte, []int) {
return fileDescriptor_checkin_f106eb4ffaf2f7e3, []int{5}
}
func (m *SetBootstrapToken) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetBootstrapToken.Unmarshal(m, b)
}
func (m *SetBootstrapToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SetBootstrapToken.Marshal(b, m, deterministic)
}
func (dst *SetBootstrapToken) XXX_Merge(src proto.Message) {
xxx_messageInfo_SetBootstrapToken.Merge(dst, src)
}
func (m *SetBootstrapToken) XXX_Size() int {
return xxx_messageInfo_SetBootstrapToken.Size(m)
}
func (m *SetBootstrapToken) XXX_DiscardUnknown() {
xxx_messageInfo_SetBootstrapToken.DiscardUnknown(m)
}
var xxx_messageInfo_SetBootstrapToken proto.InternalMessageInfo
func (m *SetBootstrapToken) GetBootstrapToken() []byte {
if m != nil {
return m.BootstrapToken
}
return nil
}
func (m *SetBootstrapToken) GetSetAwaitingConfiguration() bool {
if m != nil {
return m.SetAwaitingConfiguration
}
return false
}
func init() {
proto.RegisterType((*Event)(nil), "checkinproto.Event")
proto.RegisterMapType((map[string]string)(nil), "checkinproto.Event.ParamsEntry")
proto.RegisterType((*Command)(nil), "checkinproto.Command")
proto.RegisterType((*Authenticate)(nil), "checkinproto.Authenticate")
proto.RegisterType((*TokenUpdate)(nil), "checkinproto.TokenUpdate")
proto.RegisterType((*GetBootstrapToken)(nil), "checkinproto.GetBootstrapToken")
proto.RegisterType((*SetBootstrapToken)(nil), "checkinproto.SetBootstrapToken")
}
func init() { proto.RegisterFile("checkin.proto", fileDescriptor_checkin_f106eb4ffaf2f7e3) }
var fileDescriptor_checkin_f106eb4ffaf2f7e3 = []byte{
// 619 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x52, 0xdd, 0x6a, 0xdb, 0x4a,
0x10, 0x46, 0x76, 0x6c, 0x47, 0x23, 0x25, 0xe7, 0xb0, 0x9c, 0x9c, 0xa3, 0x13, 0x5a, 0xe2, 0xb8,
0xa1, 0xf8, 0xca, 0x85, 0x94, 0xd2, 0x1f, 0x4a, 0xa1, 0x84, 0x5c, 0x04, 0xda, 0xb4, 0x6c, 0xd3,
0xde, 0x8a, 0x8d, 0x34, 0x95, 0x17, 0x6b, 0x77, 0x85, 0xb4, 0x72, 0xf0, 0x23, 0xf5, 0x05, 0xfa,
0x40, 0x7d, 0x8b, 0xde, 0x95, 0x9d, 0x95, 0x13, 0xf9, 0x6e, 0xe6, 0x9b, 0x6f, 0xbe, 0x9d, 0xf9,
0x76, 0xe0, 0x20, 0x5b, 0x62, 0xb6, 0x92, 0x7a, 0x51, 0xd5, 0xc6, 0x1a, 0x16, 0x77, 0x29, 0x65,
0xb3, 0x5f, 0x01, 0x8c, 0x2e, 0xd7, 0xa8, 0x2d, 0x3b, 0x84, 0x81, 0xcc, 0x93, 0x60, 0x1a, 0xcc,
0x43, 0x3e, 0x90, 0x39, 0x63, 0xb0, 0x67, 0xa5, 0xc2, 0x64, 0x30, 0x0d, 0xe6, 0x43, 0x4e, 0x31,
0x7b, 0x06, 0x93, 0xcc, 0x28, 0x25, 0x74, 0x9e, 0x0c, 0xa7, 0xc1, 0x3c, 0x3a, 0x3f, 0x5a, 0xf4,
0xd5, 0x16, 0x17, 0xbe, 0xc8, 0xb7, 0x2c, 0xf6, 0x37, 0x0c, 0x6b, 0x71, 0x97, 0xec, 0x4d, 0x83,
0x79, 0xcc, 0x5d, 0xc8, 0x5e, 0xc2, 0xb8, 0x12, 0xb5, 0x50, 0x4d, 0x32, 0x9a, 0x0e, 0xe7, 0xd1,
0xf9, 0xc9, 0xae, 0x02, 0xcd, 0xb2, 0xf8, 0x4c, 0x8c, 0x4b, 0x6d, 0xeb, 0x0d, 0xef, 0xe8, 0xc7,
0xaf, 0x21, 0xea, 0xc1, 0x4e, 0x79, 0x85, 0x9b, 0x6e, 0x5e, 0x17, 0xb2, 0x7f, 0x60, 0xb4, 0x16,
0x65, 0xeb, 0x27, 0x0e, 0xb9, 0x4f, 0xde, 0x0c, 0x5e, 0x05, 0xb3, 0xdf, 0x01, 0x4c, 0xba, 0xd1,
0xd8, 0x29, 0xc4, 0x0a, 0x9b, 0x46, 0x14, 0x98, 0xda, 0x4d, 0x85, 0x9d, 0x40, 0xd4, 0x61, 0x37,
0x9b, 0x0a, 0x9d, 0x90, 0x35, 0x95, 0xcc, 0xb6, 0x42, 0x94, 0x38, 0x3f, 0xda, 0x5c, 0xfa, 0xc5,
0x43, 0x4e, 0x31, 0x7b, 0x07, 0xb1, 0x68, 0xed, 0x12, 0xb5, 0x95, 0x99, 0xb0, 0x48, 0x7b, 0x46,
0xe7, 0xc7, 0xbb, 0x2b, 0xbd, 0xef, 0x31, 0xf8, 0x0e, 0x9f, 0xbd, 0x85, 0xd8, 0x9a, 0x15, 0xea,
0xb4, 0xad, 0x72, 0xd7, 0x3f, 0xa2, 0xfe, 0xff, 0x77, 0xfb, 0x6f, 0x1c, 0xe3, 0x2b, 0x11, 0x78,
0x64, 0x1f, 0x12, 0xf6, 0x04, 0x0e, 0x50, 0xd7, 0xa6, 0x2c, 0x15, 0x6a, 0x9b, 0xca, 0x3c, 0x19,
0xd3, 0x68, 0xf1, 0x03, 0x78, 0x95, 0xcf, 0x7e, 0x0e, 0x20, 0xee, 0x4f, 0xc0, 0x1e, 0x03, 0x98,
0x26, 0x5d, 0x63, 0xdd, 0x48, 0xa3, 0xbb, 0xf5, 0x43, 0xd3, 0x7c, 0xf3, 0x80, 0x13, 0xbd, 0x6d,
0x65, 0x99, 0xdf, 0x33, 0xbc, 0x09, 0x31, 0x81, 0x5b, 0xd2, 0x29, 0xc4, 0x55, 0x6d, 0xf2, 0x36,
0xb3, 0xa9, 0x16, 0x0a, 0x3b, 0x4f, 0xa2, 0x0e, 0xbb, 0x16, 0x8a, 0x86, 0x6b, 0xb0, 0x96, 0xa2,
0x4c, 0x75, 0xab, 0x6e, 0xb1, 0x26, 0x6f, 0x42, 0x1e, 0x7b, 0xf0, 0x9a, 0x30, 0xe7, 0xa9, 0x54,
0x28, 0x69, 0xef, 0x90, 0x53, 0xec, 0x30, 0x85, 0xf7, 0xcb, 0x50, 0xcc, 0x4e, 0x20, 0xca, 0x71,
0x2d, 0x33, 0xf4, 0xcf, 0x4d, 0xa8, 0x04, 0x1e, 0xa2, 0xd7, 0x1e, 0x41, 0x98, 0x2d, 0x45, 0x59,
0xa2, 0x2e, 0x30, 0xd9, 0xa7, 0x6b, 0x7b, 0x00, 0xdc, 0x87, 0x2a, 0x93, 0x63, 0x99, 0x84, 0xfe,
0x43, 0x29, 0x71, 0x46, 0x50, 0xe0, 0x35, 0xc1, 0x1b, 0x41, 0x88, 0x93, 0x9c, 0xfd, 0x18, 0x40,
0xd4, 0xb3, 0xde, 0x5f, 0xc5, 0x0a, 0xbd, 0x65, 0x31, 0xf7, 0x89, 0x13, 0xa9, 0xda, 0x66, 0x99,
0x2a, 0x51, 0xdc, 0x1f, 0x4c, 0xe8, 0x90, 0x8f, 0x0e, 0x70, 0x46, 0xb5, 0xba, 0x34, 0xd9, 0x2a,
0xf5, 0xbd, 0x43, 0xea, 0x8d, 0x3c, 0x46, 0xea, 0xec, 0x05, 0xfc, 0x2b, 0xee, 0x84, 0xb4, 0x52,
0x17, 0x69, 0x66, 0xf4, 0x77, 0x59, 0xb4, 0xb5, 0xb0, 0xce, 0x79, 0xe7, 0xd8, 0x3e, 0x3f, 0xda,
0x56, 0x2f, 0xfa, 0x45, 0xf6, 0x1f, 0x4c, 0xda, 0x06, 0x6b, 0xf7, 0xed, 0xde, 0xbd, 0xb1, 0x4b,
0xaf, 0x72, 0x76, 0x06, 0x87, 0x54, 0x28, 0x8d, 0x2e, 0xfc, 0x6a, 0xdd, 0x59, 0x38, 0xf4, 0x83,
0xd1, 0x05, 0x19, 0xf6, 0x14, 0xfe, 0x22, 0x56, 0xb3, 0x34, 0xb5, 0xed, 0xbb, 0x7a, 0xe0, 0xe0,
0x2f, 0x0e, 0x25, 0xde, 0x19, 0x1c, 0x6a, 0x63, 0x53, 0xa3, 0xdd, 0x6c, 0x8d, 0x29, 0xbd, 0xbb,
0xfb, 0x3c, 0xd6, 0xc6, 0x7e, 0xd2, 0x17, 0x1e, 0xbb, 0x1d, 0xd3, 0xa5, 0x3e, 0xff, 0x13, 0x00,
0x00, 0xff, 0xff, 0x5a, 0x90, 0x46, 0x6c, 0x6b, 0x04, 0x00, 0x00,
// 722 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0x6d, 0x6e, 0xdb, 0x38,
0x10, 0x85, 0xec, 0xd8, 0x8e, 0x46, 0x8a, 0xb3, 0xe1, 0x6e, 0x76, 0xb5, 0xc1, 0x2e, 0xe2, 0xb8,
0x41, 0xeb, 0x5f, 0x2e, 0x90, 0xa2, 0xe8, 0x07, 0x82, 0x02, 0x69, 0x10, 0x14, 0x01, 0xda, 0xa4,
0x55, 0xd2, 0xfe, 0x15, 0x68, 0x89, 0x95, 0x09, 0x4b, 0xa4, 0x20, 0x52, 0x0e, 0xdc, 0xab, 0xf4,
0x04, 0xbd, 0x40, 0x0f, 0xd4, 0x93, 0x14, 0x1c, 0xca, 0x89, 0x3f, 0x92, 0x7f, 0x33, 0x8f, 0x8f,
0x6f, 0x38, 0x6f, 0x86, 0xb0, 0x15, 0x8f, 0x59, 0x3c, 0xe1, 0x62, 0x58, 0x94, 0x52, 0x4b, 0xe2,
0xd7, 0x29, 0x66, 0xfd, 0x5f, 0x0e, 0xb4, 0xce, 0xa6, 0x4c, 0x68, 0xd2, 0x85, 0x06, 0x4f, 0x02,
0xa7, 0xe7, 0x0c, 0xdc, 0xb0, 0xc1, 0x13, 0x42, 0x60, 0x43, 0xf3, 0x9c, 0x05, 0x8d, 0x9e, 0x33,
0x68, 0x86, 0x18, 0x93, 0xa7, 0xd0, 0x89, 0x65, 0x9e, 0x53, 0x91, 0x04, 0xcd, 0x9e, 0x33, 0xf0,
0x8e, 0x76, 0x87, 0x8b, 0x6a, 0xc3, 0x53, 0x7b, 0x18, 0xce, 0x59, 0xe4, 0x0f, 0x68, 0x96, 0xf4,
0x26, 0xd8, 0xe8, 0x39, 0x03, 0x3f, 0x34, 0x21, 0x79, 0x01, 0xed, 0x82, 0x96, 0x34, 0x57, 0x41,
0xab, 0xd7, 0x1c, 0x78, 0x47, 0xfb, 0xcb, 0x0a, 0xf8, 0x96, 0xe1, 0x47, 0x64, 0x9c, 0x09, 0x5d,
0xce, 0xc2, 0x9a, 0xbe, 0xf7, 0x0a, 0xbc, 0x05, 0xd8, 0x28, 0x4f, 0xd8, 0xac, 0x7e, 0xaf, 0x09,
0xc9, 0x5f, 0xd0, 0x9a, 0xd2, 0xac, 0xb2, 0x2f, 0x76, 0x43, 0x9b, 0xbc, 0x6e, 0xbc, 0x74, 0xfa,
0xdf, 0x9b, 0xd0, 0xa9, 0x9f, 0x46, 0x0e, 0xc0, 0xcf, 0x99, 0x52, 0x34, 0x65, 0x91, 0x9e, 0x15,
0xac, 0x16, 0xf0, 0x6a, 0xec, 0x7a, 0x56, 0x30, 0x23, 0xa4, 0x65, 0xc1, 0xe3, 0xb9, 0x10, 0x26,
0xc6, 0x8f, 0x2a, 0xe1, 0xb6, 0x71, 0x37, 0xc4, 0x98, 0xbc, 0x01, 0x9f, 0x56, 0x7a, 0xcc, 0x84,
0xe6, 0x31, 0xd5, 0x0c, 0xfb, 0xf4, 0x8e, 0xf6, 0x96, 0x5b, 0x3a, 0x59, 0x60, 0x84, 0x4b, 0x7c,
0x72, 0x0c, 0xbe, 0x96, 0x13, 0x26, 0xa2, 0xaa, 0x48, 0xcc, 0xfd, 0x16, 0xde, 0xff, 0x77, 0xf9,
0xfe, 0xb5, 0x61, 0x7c, 0x46, 0x42, 0xe8, 0xe9, 0xbb, 0x84, 0x3c, 0x82, 0x2d, 0x26, 0x4a, 0x99,
0x65, 0x39, 0x13, 0x3a, 0xe2, 0x49, 0xd0, 0xc6, 0xa7, 0xf9, 0x77, 0xe0, 0x79, 0x42, 0x2e, 0xe1,
0xcf, 0x94, 0xe9, 0x68, 0x24, 0xa5, 0x56, 0xba, 0xa4, 0x45, 0x84, 0x0a, 0x41, 0x07, 0x2b, 0xad,
0x98, 0xff, 0x8e, 0xe9, 0xb7, 0x73, 0x1e, 0x56, 0x0d, 0x77, 0xd2, 0x55, 0xc8, 0x08, 0xaa, 0x7b,
0x04, 0x37, 0xef, 0x13, 0xbc, 0x5a, 0x17, 0x54, 0xab, 0x50, 0xff, 0x67, 0x03, 0xfc, 0x45, 0x8f,
0xc8, 0xff, 0x00, 0x52, 0x45, 0x53, 0x56, 0x2a, 0x2e, 0x45, 0x3d, 0x20, 0x57, 0xaa, 0x2f, 0x16,
0x30, 0x6d, 0x8f, 0x2a, 0x9e, 0x25, 0xb7, 0x0c, 0x3b, 0x26, 0x1f, 0xc1, 0x39, 0xe9, 0x00, 0xfc,
0xa2, 0x94, 0x49, 0x15, 0xeb, 0x48, 0xd0, 0x9c, 0xd5, 0x53, 0xf3, 0x6a, 0xec, 0x82, 0xe6, 0x68,
0x9f, 0x62, 0x25, 0xa7, 0x59, 0x24, 0xaa, 0x7c, 0xc4, 0x4a, 0x9c, 0x9e, 0x1b, 0xfa, 0x16, 0xbc,
0x40, 0xcc, 0x4c, 0x9d, 0xe7, 0x8c, 0xe3, 0x64, 0xdc, 0x10, 0x63, 0x83, 0xe5, 0xec, 0xd6, 0x6e,
0x8c, 0xc9, 0x3e, 0x78, 0x09, 0x9b, 0xf2, 0x98, 0xd9, 0x72, 0x1d, 0x3c, 0x02, 0x0b, 0x61, 0xb5,
0xff, 0xc0, 0x8d, 0xc7, 0x34, 0xcb, 0x98, 0x48, 0x19, 0x9a, 0xe5, 0x87, 0x77, 0x80, 0x59, 0xb9,
0x5c, 0x26, 0x2c, 0x0b, 0x5c, 0xbb, 0x72, 0x98, 0x18, 0x23, 0x30, 0xb0, 0x9a, 0x60, 0x8d, 0x40,
0xc4, 0x48, 0xf6, 0x7f, 0x34, 0xc0, 0x5b, 0x58, 0x0e, 0xbb, 0xb7, 0x66, 0x16, 0x0e, 0xca, 0xdb,
0xc4, 0x88, 0x14, 0x95, 0x1a, 0x47, 0x39, 0x4d, 0x6f, 0x57, 0xda, 0x35, 0xc8, 0x07, 0x03, 0x18,
0xa3, 0x2a, 0x91, 0xc9, 0x78, 0x52, 0xcf, 0xb1, 0x89, 0x77, 0x3d, 0x8b, 0xd9, 0x89, 0x3f, 0x87,
0xbf, 0xe9, 0x0d, 0xe5, 0x9a, 0x8b, 0x34, 0x8a, 0xa5, 0xf8, 0xca, 0xd3, 0xaa, 0xa4, 0xda, 0x38,
0x6f, 0x1c, 0xdb, 0x0c, 0x77, 0xe7, 0xa7, 0xa7, 0x8b, 0x87, 0xe4, 0x1f, 0xe8, 0x54, 0x8a, 0x95,
0x66, 0x31, 0xad, 0x7b, 0x6d, 0x93, 0x9e, 0x27, 0xe4, 0x10, 0xba, 0x78, 0x90, 0x49, 0x91, 0xda,
0xd6, 0xea, 0xc5, 0x35, 0xe8, 0x7b, 0x29, 0x52, 0x34, 0xec, 0x31, 0x6c, 0x23, 0x4b, 0x8d, 0x65,
0xa9, 0x17, 0x5d, 0xdd, 0x32, 0xf0, 0x95, 0x41, 0x91, 0x77, 0x08, 0x5d, 0x21, 0x75, 0x24, 0x85,
0x79, 0x9b, 0x92, 0x99, 0x75, 0x77, 0x33, 0xf4, 0x85, 0xd4, 0x97, 0xe2, 0xd4, 0x62, 0xfd, 0x4f,
0xb0, 0xb3, 0xb6, 0xdd, 0xe4, 0x18, 0xf6, 0xcc, 0xdf, 0x78, 0xa0, 0x39, 0x07, 0x65, 0x82, 0x94,
0xe9, 0x93, 0xfb, 0xfa, 0xeb, 0x7f, 0x83, 0x9d, 0xb5, 0xfd, 0x26, 0x4f, 0x60, 0x7b, 0xf5, 0x67,
0xd8, 0x69, 0x74, 0x47, 0x6b, 0xb5, 0xd5, 0xc3, 0xb5, 0x1b, 0xb6, 0xb6, 0x7a, 0xa0, 0xf6, 0xa8,
0x8d, 0xff, 0xeb, 0xd9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x47, 0xe2, 0x94, 0x6e, 0xdc, 0x05,
0x00, 0x00,
}

View File

@@ -17,6 +17,8 @@ message Command {
Authenticate authenticate = 4;
TokenUpdate token_update = 5;
string enrollment_id = 6;
GetBootstrapToken get_bootstrap_token = 7;
SetBootstrapToken set_bootstrap_token = 8;
}
message Authenticate {
@@ -42,3 +44,12 @@ message TokenUpdate {
string user_short_name = 7;
bool not_on_console = 8;
}
message GetBootstrapToken {
bool get_awaiting_configuration = 1;
}
message SetBootstrapToken {
bytes bootstrap_token = 1;
bool set_awaiting_configuration = 2;
}

View File

@@ -68,7 +68,6 @@ type Command struct {
ScheduleOSUpdateScan *ScheduleOSUpdateScan
ActiveNSExtensions *ActiveNSExtensions
RotateFileVaultKey *RotateFileVaultKey
SetBootstrapToken *SetBootstrapToken
}
// InstallProfile is an InstallProfile MDM Command
@@ -276,10 +275,6 @@ type SetAutoAdminPassword struct {
PasswordHash []byte `plist:"passwordHash" json:"password_hash"`
}
type SetBootstrapToken struct {
BootstrapToken string `plist:",omitempty" json:"bootstrap_token,omitempty"`
}
type OSUpdate struct {
ProductKey string `json:"product_key"`
InstallAction string `json:"install_action"`

View File

@@ -3428,10 +3428,12 @@ func (m *MDMOptionsSetting) GetMdmOptions() *MDMOptions {
}
type MDMOptions struct {
ActivationLockAllowedWhileSupervised bool `protobuf:"varint,1,opt,name=activation_lock_allowed_while_supervised,json=activationLockAllowedWhileSupervised,proto3" json:"activation_lock_allowed_while_supervised,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
ActivationLockAllowedWhileSupervised bool `protobuf:"varint,1,opt,name=activation_lock_allowed_while_supervised,json=activationLockAllowedWhileSupervised,proto3" json:"activation_lock_allowed_while_supervised,omitempty"`
BootstrapTokenAllowed bool `protobuf:"varint,2,opt,name=bootstrap_token_allowed,json=bootstrapTokenAllowed,proto3" json:"bootstrap_token_allowed,omitempty"`
PromptUserToAllowBootstrapTokenForAuthentication bool `protobuf:"varint,3,opt,name=prompt_user_to_allow_bootstrap_token_for_authentication,json=promptUserToAllowBootstrapTokenForAuthentication,proto3" json:"prompt_user_to_allow_bootstrap_token_for_authentication,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MDMOptions) Reset() { *m = MDMOptions{} }
@@ -3474,6 +3476,20 @@ func (m *MDMOptions) GetActivationLockAllowedWhileSupervised() bool {
return false
}
func (m *MDMOptions) GetBootstrapTokenAllowed() bool {
if m != nil {
return m.BootstrapTokenAllowed
}
return false
}
func (m *MDMOptions) GetPromptUserToAllowBootstrapTokenForAuthentication() bool {
if m != nil {
return m.PromptUserToAllowBootstrapTokenForAuthentication
}
return false
}
type PasscodeLockGracePeriodSetting struct {
PasscodeLockGracePeriod int64 `protobuf:"varint,1,opt,name=passcode_lock_grace_period,json=passcodeLockGracePeriod,proto3" json:"passcode_lock_grace_period,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -4702,253 +4718,257 @@ func init() {
func init() { proto.RegisterFile("mdm.proto", fileDescriptor_fd1fa389f704dbf7) }
var fileDescriptor_fd1fa389f704dbf7 = []byte{
// 3936 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0x4f, 0x73, 0x1b, 0x47,
0x76, 0x27, 0x44, 0x89, 0x04, 0x1e, 0x40, 0x02, 0x6c, 0xfe, 0xd1, 0x90, 0x94, 0x48, 0x69, 0x64,
0x5b, 0xb2, 0xd7, 0x96, 0x36, 0xb2, 0xe5, 0xf5, 0xee, 0xda, 0x89, 0x29, 0x52, 0x5a, 0x72, 0x2d,
0x8a, 0xac, 0x81, 0x24, 0x57, 0xad, 0xb3, 0x99, 0x1d, 0xce, 0x34, 0x81, 0x2e, 0xce, 0xbf, 0xed,
0xee, 0x01, 0x0d, 0xdf, 0x53, 0x39, 0xe7, 0x92, 0xa4, 0x72, 0xc9, 0x3d, 0xdf, 0x20, 0xf9, 0x02,
0x9b, 0xaa, 0x5c, 0x52, 0xf9, 0x04, 0x5b, 0xce, 0x57, 0xc8, 0x65, 0x6f, 0xa9, 0xfe, 0x37, 0x33,
0x18, 0x0c, 0x21, 0x5d, 0x72, 0xd8, 0x1b, 0xfa, 0xbd, 0x5f, 0xbf, 0xee, 0x79, 0xdd, 0xef, 0xf5,
0xfb, 0x03, 0x68, 0x45, 0x41, 0xf4, 0x30, 0xa5, 0x09, 0x4f, 0x50, 0x33, 0x0a, 0x22, 0xf9, 0xcb,
0xfe, 0x1d, 0x2c, 0xef, 0x27, 0x51, 0xe4, 0xc5, 0xc1, 0xa9, 0x37, 0x0e, 0x13, 0x2f, 0x40, 0x77,
0xa1, 0xe3, 0x2b, 0x8a, 0x9b, 0x65, 0x24, 0xb0, 0x1a, 0x77, 0x1a, 0x0f, 0x5a, 0x4e, 0x5b, 0xd3,
0x5e, 0x67, 0x24, 0x40, 0x3f, 0x81, 0x45, 0x3d, 0xb4, 0xae, 0xdd, 0x69, 0x3c, 0x68, 0x3f, 0x5e,
0x79, 0x68, 0x04, 0x3e, 0xd4, 0xd2, 0x1c, 0x83, 0xb0, 0xff, 0x60, 0xc1, 0xa2, 0x26, 0x0a, 0xd9,
0x14, 0xff, 0x3e, 0xc3, 0x8c, 0xbb, 0x7c, 0x9c, 0x62, 0x23, 0x5b, 0xd3, 0x5e, 0x8d, 0x53, 0x8c,
0xf6, 0xa1, 0x4b, 0x62, 0xc6, 0xbd, 0x30, 0x74, 0x53, 0x9a, 0x9c, 0x93, 0x10, 0xeb, 0x35, 0xac,
0x62, 0x8d, 0x23, 0x05, 0x38, 0x55, 0xfc, 0xc3, 0x39, 0x67, 0x99, 0x4c, 0x50, 0xd0, 0xd7, 0xb0,
0x4c, 0x71, 0x94, 0x8c, 0x70, 0x2e, 0x63, 0x5e, 0xca, 0xb8, 0x59, 0xc8, 0x70, 0x24, 0xbf, 0x10,
0xb1, 0x44, 0xcb, 0x04, 0x34, 0x84, 0x5b, 0xa5, 0x6d, 0x8c, 0x08, 0x23, 0x49, 0x4c, 0xe2, 0x41,
0x2e, 0xef, 0xba, 0x94, 0xf7, 0x5e, 0xdd, 0x9e, 0x72, 0x70, 0x21, 0x7c, 0x8b, 0x5c, 0xc9, 0x45,
0x18, 0xb6, 0xcb, 0x7b, 0xad, 0x2e, 0x74, 0x43, 0x2e, 0x74, 0xaf, 0x66, 0xe3, 0x35, 0xeb, 0x6c,
0x96, 0x3e, 0xa2, 0xb2, 0xcc, 0x19, 0x98, 0x4d, 0xe0, 0xc0, 0xf5, 0xd2, 0x34, 0x24, 0xbe, 0xc7,
0x49, 0x12, 0xbb, 0x21, 0x61, 0xdc, 0x5a, 0x90, 0xab, 0xd8, 0x53, 0x9f, 0x83, 0x83, 0xbd, 0x02,
0xfa, 0x82, 0x30, 0x7e, 0x38, 0xe7, 0x58, 0xe4, 0x0a, 0x1e, 0x7a, 0x01, 0x28, 0xc0, 0x23, 0xe2,
0x63, 0x97, 0xc4, 0xe7, 0x09, 0x8d, 0x24, 0xc7, 0x5a, 0x94, 0xb2, 0xb7, 0x0b, 0xd9, 0x07, 0x12,
0x73, 0x54, 0x40, 0x0e, 0xe7, 0x9c, 0x95, 0xa0, 0x4a, 0x44, 0x3f, 0x83, 0xb6, 0x96, 0x16, 0x26,
0xfe, 0x85, 0xd5, 0x94, 0x62, 0xd6, 0xaa, 0x62, 0x5e, 0x24, 0xfe, 0xc5, 0xe1, 0x9c, 0x03, 0x41,
0x3e, 0x12, 0xa7, 0xef, 0x87, 0xd8, 0xa3, 0x6e, 0xea, 0x31, 0xe6, 0x27, 0x01, 0xb6, 0x5a, 0xd5,
0xd3, 0xdf, 0x17, 0xfc, 0x53, 0xcd, 0x16, 0xa7, 0xef, 0x97, 0x09, 0xe8, 0x17, 0xd0, 0xc1, 0xd4,
0x63, 0xd8, 0x55, 0x52, 0x2d, 0x90, 0xf3, 0xd7, 0x8b, 0xf9, 0xcf, 0x04, 0x57, 0x6d, 0xe0, 0x70,
0xce, 0x69, 0xe3, 0x62, 0x88, 0x8e, 0x60, 0xc5, 0xdc, 0xf1, 0x88, 0x50, 0x9a, 0x50, 0x12, 0x0f,
0xac, 0xb6, 0x14, 0xb0, 0x55, 0x3e, 0x45, 0x09, 0x39, 0x36, 0x88, 0xc3, 0x39, 0xa7, 0x47, 0x2b,
0x34, 0xf4, 0xa5, 0x30, 0x17, 0xc6, 0x29, 0xf1, 0x85, 0x42, 0x98, 0xd5, 0x91, 0x52, 0x36, 0xca,
0x52, 0x0a, 0xee, 0xe1, 0x9c, 0x33, 0x81, 0x46, 0xc7, 0xb0, 0x9a, 0xc5, 0x42, 0x75, 0x6e, 0xc6,
0x30, 0x75, 0x3d, 0xdf, 0x4f, 0xb2, 0x98, 0x5b, 0x4b, 0xd5, 0xe3, 0x78, 0x2d, 0x41, 0xaf, 0x19,
0xa6, 0x7b, 0x0a, 0x22, 0x8e, 0x23, 0xab, 0x12, 0xd5, 0x71, 0x84, 0x98, 0x63, 0x29, 0xce, 0x5a,
0x9e, 0x3e, 0x0e, 0xc1, 0x14, 0x33, 0xd4, 0x71, 0x98, 0x11, 0x3a, 0x80, 0x1e, 0x8e, 0xbd, 0xb3,
0x50, 0x9c, 0xa3, 0x50, 0x8a, 0x38, 0x90, 0x6e, 0xd5, 0xa4, 0x9f, 0x49, 0xc4, 0x8b, 0x84, 0xf1,
0x63, 0x75, 0x22, 0xcb, 0x78, 0x82, 0x82, 0x4e, 0x60, 0xd5, 0x18, 0x64, 0xe9, 0xf6, 0x5a, 0x3d,
0x29, 0xe8, 0xd6, 0xd4, 0xc5, 0x2d, 0x5d, 0xcd, 0xc3, 0x39, 0x07, 0x91, 0x29, 0x2a, 0x7a, 0x0d,
0xeb, 0x5a, 0x25, 0xae, 0x9f, 0xc4, 0xe7, 0x64, 0x90, 0x51, 0x25, 0x72, 0x45, 0x8a, 0xdc, 0x29,
0x44, 0x6a, 0x0d, 0xec, 0x97, 0x51, 0x87, 0x73, 0xce, 0x9a, 0x57, 0x43, 0x47, 0x7d, 0x58, 0x17,
0xfb, 0x1b, 0xbb, 0x14, 0x07, 0x38, 0x4a, 0xa5, 0x89, 0xc9, 0x3b, 0x88, 0xa4, 0xd8, 0xdb, 0x25,
0xb1, 0x02, 0xe6, 0xe4, 0xa8, 0x7d, 0xf5, 0xdd, 0xab, 0xde, 0x34, 0x19, 0xfd, 0x35, 0x58, 0x91,
0x17, 0x7b, 0x83, 0x3a, 0xd3, 0x5d, 0x95, 0x72, 0xef, 0x14, 0x72, 0x8f, 0x15, 0x72, 0xda, 0x70,
0x37, 0xa2, 0x5a, 0x8e, 0x30, 0x5b, 0xed, 0x81, 0xca, 0x9a, 0x5d, 0xab, 0xde, 0x13, 0xe5, 0x78,
0x26, 0x15, 0xbb, 0x42, 0xab, 0x44, 0xf4, 0x2b, 0x58, 0x21, 0xf1, 0x88, 0x70, 0xec, 0xf2, 0x44,
0x78, 0xb1, 0x01, 0xf5, 0x22, 0x6b, 0x5d, 0x0a, 0xdb, 0x2c, 0x1f, 0x93, 0x80, 0xbc, 0x4a, 0x4e,
0x15, 0xe0, 0x70, 0xce, 0xe9, 0x92, 0x49, 0x92, 0x38, 0xa0, 0x91, 0x17, 0x92, 0xc0, 0xe3, 0x5e,
0x79, 0x63, 0xcc, 0xda, 0xa8, 0x1e, 0xd0, 0x1b, 0x05, 0x2b, 0x6f, 0x43, 0x98, 0xc3, 0x9a, 0x99,
0x5e, 0xa6, 0xa3, 0xaf, 0x60, 0xc9, 0x5c, 0xa4, 0x08, 0x07, 0xc4, 0xb3, 0x6e, 0x56, 0xad, 0x4a,
0x5f, 0xa1, 0x63, 0xc1, 0x15, 0x56, 0x45, 0x4a, 0x63, 0xe1, 0x1a, 0xb4, 0xb2, 0xd4, 0x6c, 0xab,
0xea, 0x1a, 0x94, 0x9a, 0xcc, 0xe4, 0x36, 0x2d, 0x86, 0xe8, 0xa7, 0xd0, 0x64, 0x98, 0x73, 0x12,
0x0f, 0x98, 0xb5, 0x29, 0xe7, 0xa1, 0x62, 0x5e, 0x5f, 0x73, 0x0e, 0xe7, 0x9c, 0x1c, 0x85, 0x2e,
0xe1, 0x6e, 0xdd, 0xc1, 0x4f, 0x5e, 0xd8, 0x2d, 0x29, 0xea, 0xc3, 0x59, 0x37, 0xa0, 0x7a, 0x77,
0x77, 0xa3, 0xd9, 0x10, 0x14, 0xc3, 0x4e, 0xdd, 0xc2, 0x1e, 0xe7, 0x94, 0x9c, 0x65, 0x1c, 0x33,
0x6b, 0x5b, 0xae, 0xfa, 0xc1, 0xac, 0x55, 0xf7, 0x72, 0xf4, 0xe1, 0x9c, 0x73, 0x2b, 0x9a, 0xc1,
0x17, 0xef, 0x6d, 0xdd, 0x7a, 0xe7, 0x18, 0x07, 0x67, 0x9e, 0x7f, 0x61, 0xdd, 0xaa, 0xbe, 0xb7,
0xd3, 0xab, 0x3d, 0xd7, 0x58, 0xf1, 0xde, 0x46, 0x57, 0x72, 0x85, 0x81, 0x32, 0xcc, 0xdd, 0x73,
0x42, 0xa3, 0x4b, 0x8f, 0x62, 0xf9, 0x48, 0x5c, 0x26, 0x34, 0xb0, 0x6e, 0x57, 0x0d, 0xb4, 0x8f,
0xf9, 0x73, 0x8d, 0x3a, 0xd5, 0x20, 0x61, 0xa0, 0x6c, 0x9a, 0x2c, 0x0c, 0x74, 0x84, 0x29, 0x39,
0x1f, 0xd7, 0xc8, 0xdd, 0xa9, 0x1a, 0xe8, 0x1b, 0x89, 0xac, 0x11, 0xbd, 0x31, 0xaa, 0xe5, 0xa0,
0x6f, 0xe1, 0xa6, 0xd8, 0xb2, 0x97, 0xf1, 0xc4, 0xf5, 0x82, 0x88, 0xc4, 0x85, 0xf0, 0xdd, 0xaa,
0x2d, 0xf4, 0x31, 0xdf, 0xcb, 0x78, 0xb2, 0x27, 0x60, 0x25, 0xd1, 0x6b, 0xac, 0x86, 0x8e, 0x7e,
0x0d, 0x88, 0xf9, 0x43, 0x1c, 0x64, 0x21, 0x76, 0x13, 0xe6, 0x66, 0xa9, 0xb0, 0x22, 0xeb, 0x4e,
0xf5, 0xb1, 0xea, 0x6b, 0xcc, 0x49, 0xff, 0xb5, 0x44, 0x88, 0xc7, 0xca, 0xcc, 0x3b, 0x61, 0x8a,
0x26, 0x37, 0x39, 0x25, 0xcb, 0x65, 0xbe, 0x17, 0x5b, 0x77, 0xa7, 0x36, 0x59, 0x11, 0xd8, 0xf7,
0x3d, 0xe9, 0x51, 0xab, 0x42, 0x05, 0x1d, 0x9d, 0xc2, 0x9a, 0xe7, 0x73, 0x32, 0xc2, 0x6e, 0xcc,
0x5c, 0xfc, 0x3d, 0xc7, 0x31, 0x93, 0x6e, 0xc0, 0xae, 0xba, 0xfe, 0x3d, 0x89, 0x7a, 0xd9, 0x7f,
0x96, 0x63, 0x84, 0xeb, 0x57, 0x73, 0x5f, 0xb2, 0x82, 0x2a, 0x24, 0xd2, 0x84, 0x8b, 0xed, 0x89,
0xd0, 0x68, 0xe4, 0x65, 0x21, 0x77, 0x2f, 0xf0, 0xd8, 0xba, 0x57, 0x95, 0xe8, 0x48, 0xd4, 0x73,
0x12, 0xe2, 0x37, 0x02, 0xf4, 0x0d, 0x1e, 0x0b, 0x89, 0x34, 0xa7, 0x8e, 0x34, 0x55, 0x98, 0x8b,
0x71, 0x2a, 0x38, 0xe6, 0x98, 0xa6, 0x94, 0xb0, 0x49, 0x77, 0xfa, 0x5e, 0xd5, 0x5c, 0xb4, 0x97,
0x79, 0x96, 0xc3, 0x27, 0x3d, 0xab, 0x09, 0x3f, 0x6b, 0xf9, 0xe2, 0x6d, 0x17, 0x37, 0xe2, 0x2c,
0x49, 0x38, 0xe3, 0xd4, 0x4b, 0x5d, 0x9e, 0x5c, 0xe0, 0xd8, 0x7a, 0xbf, 0xea, 0xb3, 0xfb, 0x98,
0x3f, 0x35, 0x98, 0x57, 0x02, 0x22, 0x7c, 0x36, 0xab, 0x12, 0x85, 0xcf, 0x16, 0xe2, 0x28, 0xf6,
0x93, 0x11, 0xa6, 0x63, 0x15, 0x70, 0x7d, 0x50, 0xf5, 0xd9, 0x7d, 0xcc, 0x1d, 0x8d, 0xd0, 0x51,
0x57, 0x97, 0x4d, 0x92, 0x84, 0x66, 0xb5, 0x1d, 0x4c, 0xca, 0xba, 0x5f, 0xd5, 0xac, 0xb2, 0x81,
0x8a, 0x38, 0x34, 0x9a, 0xa2, 0x3e, 0x6d, 0xc1, 0xa2, 0x8e, 0x8b, 0xec, 0x8f, 0x60, 0x79, 0x32,
0xf2, 0x47, 0x16, 0x2c, 0xa6, 0x2a, 0x6d, 0x91, 0xa9, 0x44, 0xc7, 0x31, 0x43, 0xfb, 0x11, 0x2c,
0x4d, 0x44, 0xf8, 0x68, 0x07, 0x80, 0x04, 0x38, 0xe6, 0xe4, 0x9c, 0x60, 0xaa, 0x13, 0x8f, 0x12,
0xc5, 0x3e, 0x81, 0xad, 0xab, 0x43, 0x78, 0xf4, 0x17, 0xb0, 0x56, 0x9b, 0x06, 0xa8, 0x55, 0x57,
0xd3, 0xe9, 0x29, 0xf6, 0x23, 0xd8, 0xbc, 0x32, 0x54, 0x47, 0x08, 0xae, 0x97, 0x92, 0x2b, 0xf9,
0xdb, 0x1e, 0x82, 0x75, 0x55, 0xd4, 0x8d, 0xee, 0x40, 0xbb, 0xd8, 0x2b, 0xb3, 0x1a, 0x77, 0xe6,
0x45, 0xde, 0x54, 0x22, 0xa1, 0x8f, 0x60, 0xa5, 0xe4, 0x40, 0x99, 0x9b, 0xc4, 0xe1, 0x58, 0x66,
0x4e, 0x4d, 0xa7, 0x5b, 0x78, 0x43, 0x76, 0x12, 0x87, 0x63, 0xfb, 0x13, 0x58, 0x99, 0x8a, 0xc1,
0x85, 0x2e, 0x7f, 0x9f, 0x61, 0x4a, 0xb0, 0x11, 0x6f, 0x86, 0xf6, 0x63, 0x58, 0x9a, 0x88, 0x97,
0x45, 0x1a, 0xa7, 0x23, 0x4b, 0x75, 0xed, 0x94, 0x16, 0xda, 0x8a, 0x26, 0x6f, 0x94, 0xfd, 0x1d,
0x40, 0x11, 0x9f, 0xa3, 0x1e, 0xcc, 0xa7, 0x24, 0xd6, 0x5f, 0x2b, 0x7e, 0x8a, 0xd5, 0x22, 0xcc,
0x98, 0x37, 0x50, 0xe9, 0x5d, 0xcb, 0x31, 0x43, 0x21, 0x3c, 0x1d, 0x26, 0x31, 0x76, 0xe3, 0x2c,
0x3a, 0xc3, 0x54, 0x66, 0x6e, 0x2d, 0xa7, 0x2d, 0x69, 0x2f, 0x25, 0xc9, 0xfe, 0xbb, 0x06, 0xb4,
0x4b, 0x11, 0x78, 0x8d, 0xf8, 0x8f, 0x01, 0xa5, 0x14, 0x33, 0x4c, 0x47, 0xd8, 0x95, 0x01, 0x44,
0x1a, 0x7a, 0xb1, 0x56, 0x47, 0xcf, 0x70, 0x0e, 0x3c, 0xee, 0x9d, 0x86, 0x5e, 0x8c, 0xbe, 0x00,
0x2b, 0x20, 0xcc, 0x0b, 0xc3, 0xe4, 0x52, 0x9c, 0xec, 0xf7, 0x24, 0x22, 0x7c, 0xec, 0x32, 0xcc,
0xb3, 0x54, 0x2e, 0xdf, 0x74, 0x36, 0x0c, 0xff, 0xd4, 0xb0, 0xfb, 0x82, 0x6b, 0xff, 0x6b, 0x03,
0x7a, 0xd5, 0x50, 0x1e, 0x7d, 0x08, 0xbd, 0x00, 0x33, 0x4e, 0x62, 0xf5, 0x86, 0xc5, 0x5e, 0x64,
0x32, 0xdd, 0x6e, 0x89, 0xfe, 0xd2, 0x8b, 0x30, 0x7a, 0x0c, 0xeb, 0x65, 0xa8, 0xc9, 0x9e, 0x02,
0xad, 0x94, 0xd5, 0x12, 0x53, 0x9f, 0x58, 0x80, 0xb6, 0xa1, 0x25, 0xbc, 0xaa, 0xcb, 0x49, 0x84,
0xb5, 0x76, 0x9a, 0x82, 0xf0, 0x8a, 0x44, 0x18, 0x6d, 0x41, 0x33, 0x7f, 0x1b, 0xae, 0x2b, 0x9e,
0x19, 0xdb, 0x7b, 0xd0, 0x29, 0x27, 0x0c, 0xfa, 0x52, 0x8b, 0xfb, 0xe8, 0x4e, 0xa4, 0x19, 0x0d,
0xf9, 0xc9, 0xab, 0x9a, 0x57, 0x9e, 0x62, 0x3f, 0x82, 0x95, 0xa9, 0x74, 0x41, 0xac, 0x29, 0x52,
0x82, 0xd2, 0x77, 0xe6, 0x63, 0xfb, 0x44, 0xdc, 0x83, 0x3c, 0x15, 0x98, 0x81, 0x44, 0xef, 0xc3,
0xf2, 0x79, 0x42, 0x7d, 0x91, 0x73, 0x85, 0x58, 0xba, 0x4c, 0x75, 0x5c, 0x4b, 0x92, 0x7a, 0xa0,
0x89, 0x36, 0x81, 0xe5, 0xc9, 0x5c, 0xa1, 0x7c, 0x95, 0x1a, 0xb3, 0xaf, 0xd2, 0xb5, 0xa9, 0xab,
0x24, 0x76, 0x74, 0x9e, 0x24, 0x3c, 0x4e, 0x78, 0xae, 0x4b, 0x33, 0xb6, 0xff, 0x7d, 0x1e, 0xd0,
0x74, 0x3a, 0x81, 0x3e, 0x80, 0x2e, 0xe1, 0x59, 0x8c, 0x99, 0xcb, 0x78, 0x42, 0xe5, 0x69, 0x89,
0x75, 0xe7, 0x9d, 0x25, 0x45, 0xee, 0x0b, 0xea, 0x51, 0x50, 0xf1, 0x38, 0xd7, 0xaa, 0x1e, 0x07,
0x7d, 0x05, 0x8b, 0x49, 0xaa, 0x34, 0x3e, 0x5f, 0x4d, 0xf2, 0xa7, 0x97, 0x3d, 0x51, 0x50, 0xc7,
0xcc, 0x11, 0x1f, 0x17, 0x79, 0x31, 0x39, 0x17, 0x89, 0x66, 0x46, 0x43, 0x7d, 0xda, 0x6d, 0x43,
0x7b, 0x4d, 0x43, 0x71, 0x11, 0x95, 0xe9, 0x47, 0x38, 0xe6, 0xee, 0x79, 0xe8, 0x0d, 0x98, 0xac,
0x27, 0xcc, 0x1b, 0x97, 0x20, 0xe8, 0xcf, 0x05, 0x19, 0x9d, 0xc0, 0xd2, 0x64, 0x50, 0xb9, 0x50,
0x0d, 0x2a, 0xa7, 0xb7, 0x34, 0x11, 0x31, 0x3a, 0x93, 0xf3, 0xd1, 0x73, 0x80, 0x52, 0xb0, 0xb8,
0x78, 0xc5, 0xeb, 0x57, 0x1b, 0x0c, 0x3a, 0xa5, 0x99, 0xe8, 0x73, 0xb8, 0xe9, 0x0f, 0xbd, 0x78,
0x80, 0xdd, 0xd2, 0xa7, 0x30, 0xf1, 0x00, 0xcb, 0x8a, 0x40, 0xcb, 0x59, 0x57, 0xec, 0xe3, 0x9c,
0xdb, 0x17, 0x4c, 0xfb, 0x00, 0x36, 0xaf, 0x54, 0x22, 0xba, 0x0f, 0xdd, 0x34, 0xa3, 0xfe, 0x50,
0xa4, 0xf8, 0x11, 0xe6, 0xc3, 0xc4, 0x1c, 0xe1, 0xb2, 0x21, 0x1f, 0x4b, 0xaa, 0x7d, 0x17, 0x76,
0xdf, 0xf2, 0xdd, 0xf6, 0x0e, 0xdc, 0x9a, 0xf5, 0x31, 0xf6, 0x9f, 0x1a, 0x39, 0xa0, 0xfe, 0x2d,
0x7f, 0x08, 0x4d, 0x73, 0x68, 0x72, 0x17, 0x13, 0x59, 0xc1, 0xb1, 0xe6, 0x38, 0x39, 0x66, 0xea,
0xe0, 0xaf, 0x4d, 0x1f, 0xfc, 0x2f, 0x61, 0xab, 0x0c, 0x71, 0x53, 0x12, 0xcb, 0x67, 0xcb, 0xc7,
0x94, 0x8b, 0xdb, 0x36, 0xff, 0xa0, 0xe3, 0xdc, 0x2c, 0x4d, 0x38, 0x55, 0xfc, 0x7d, 0xc1, 0x46,
0x47, 0x70, 0xd7, 0xe0, 0x29, 0x1e, 0x25, 0x26, 0xe5, 0x18, 0x62, 0xff, 0xc2, 0x15, 0x4f, 0x31,
0xa1, 0x58, 0xf9, 0x96, 0xa6, 0xb3, 0xa3, 0x81, 0x4e, 0x8e, 0xdb, 0x17, 0x30, 0x47, 0xa3, 0xec,
0x23, 0x68, 0x9a, 0x0f, 0x40, 0x5f, 0xc1, 0x72, 0xbe, 0x27, 0xc2, 0x71, 0xa4, 0x9e, 0x99, 0x89,
0xc4, 0xcb, 0x60, 0x8f, 0x38, 0x8e, 0x9c, 0xa5, 0xa8, 0x34, 0x62, 0xf6, 0x00, 0x3a, 0x65, 0x36,
0xba, 0x0f, 0x0b, 0x1e, 0x63, 0x98, 0x1b, 0x31, 0xdd, 0x52, 0x1c, 0x28, 0xe8, 0x8e, 0x66, 0x4b,
0xf5, 0x62, 0xee, 0x89, 0x57, 0x40, 0x57, 0x12, 0xcb, 0xea, 0xd5, 0x1c, 0x27, 0xc7, 0xd8, 0xff,
0xd8, 0x80, 0x1b, 0x52, 0x82, 0x78, 0xa4, 0x2f, 0x48, 0x9c, 0x3f, 0xd2, 0xe2, 0x37, 0xda, 0x84,
0x66, 0x14, 0x3c, 0x71, 0x19, 0xf9, 0x41, 0x3d, 0x5c, 0xf3, 0xce, 0x62, 0x14, 0x3c, 0xe9, 0x93,
0x1f, 0xe4, 0x9b, 0x1e, 0x05, 0x4f, 0x94, 0x7a, 0x5b, 0x8e, 0xfc, 0x2d, 0x5e, 0xa6, 0xc2, 0x36,
0xc5, 0x4f, 0xb4, 0x0b, 0x6d, 0x36, 0xf4, 0x1e, 0x3f, 0xf9, 0x5c, 0xc9, 0x50, 0xe6, 0x08, 0x8a,
0x24, 0xc5, 0x58, 0xb0, 0xa8, 0x46, 0xcc, 0x5a, 0x50, 0xef, 0xb0, 0x1e, 0xda, 0xff, 0xdb, 0x80,
0xa6, 0xd9, 0x30, 0xfa, 0x09, 0xac, 0x9c, 0x65, 0x71, 0x10, 0x0a, 0xff, 0x53, 0x09, 0x6b, 0x7a,
0x8a, 0x71, 0x54, 0xb8, 0x9a, 0xf7, 0x61, 0x59, 0x83, 0x47, 0x98, 0x32, 0xe3, 0x5b, 0x5b, 0xce,
0x92, 0xa2, 0xbe, 0x51, 0x44, 0xf4, 0x11, 0xdc, 0x50, 0x27, 0x33, 0x2f, 0x55, 0x5a, 0x2a, 0xee,
0x3c, 0x55, 0x12, 0xe3, 0xf3, 0xc4, 0x51, 0x90, 0x5c, 0x39, 0xd7, 0x4b, 0xca, 0xd9, 0x82, 0x26,
0xcb, 0xce, 0x38, 0xe1, 0xba, 0x6e, 0x29, 0x1e, 0x26, 0x3d, 0x46, 0x6b, 0x70, 0x43, 0x31, 0x16,
0x24, 0x43, 0x0d, 0x90, 0x0d, 0x4b, 0x42, 0x0d, 0x2e, 0x89, 0xdd, 0xb3, 0xb1, 0x71, 0x14, 0xf3,
0x4e, 0x5b, 0x10, 0x8f, 0xe2, 0xa7, 0x82, 0x64, 0xff, 0x0e, 0xa0, 0x58, 0xfe, 0xff, 0xe3, 0xbb,
0xed, 0xbf, 0x81, 0xd5, 0x9a, 0x62, 0xcc, 0xdb, 0x42, 0x46, 0xe1, 0x45, 0xaa, 0x45, 0x1e, 0x25,
0x7e, 0x99, 0x4e, 0x08, 0xb2, 0x7f, 0x01, 0x1b, 0xf5, 0x45, 0x99, 0xb7, 0xc7, 0x75, 0xf6, 0xa7,
0xb0, 0x32, 0x55, 0x78, 0x79, 0x6b, 0x30, 0xfb, 0x2d, 0x74, 0x2b, 0x05, 0x16, 0x74, 0x1b, 0x40,
0x17, 0x63, 0xdc, 0x3c, 0xee, 0x6c, 0x69, 0xca, 0x51, 0x20, 0x34, 0x25, 0xeb, 0x2f, 0xca, 0xd8,
0x0b, 0xb7, 0xb2, 0x54, 0x50, 0x5f, 0xd3, 0xd0, 0xfe, 0x02, 0xd6, 0xea, 0x8a, 0x2d, 0xef, 0xf0,
0x1d, 0xff, 0x72, 0x1d, 0xd6, 0xea, 0x0a, 0x69, 0xe8, 0x05, 0xdc, 0x63, 0x17, 0x24, 0x75, 0x53,
0x4a, 0x22, 0x8f, 0xea, 0xb0, 0xcb, 0xcd, 0x4b, 0x73, 0x14, 0xab, 0xf7, 0x48, 0x05, 0x25, 0xbb,
0x02, 0x7a, 0xaa, 0x90, 0x32, 0x02, 0x33, 0x22, 0x35, 0x0c, 0xbd, 0x81, 0x0f, 0x45, 0x26, 0x53,
0x2f, 0xcc, 0x63, 0x2e, 0xc5, 0x83, 0x2c, 0xf4, 0xa8, 0xaa, 0x61, 0xaa, 0x00, 0xe3, 0x1e, 0xc3,
0xbc, 0x46, 0xe4, 0x1e, 0x73, 0x14, 0x56, 0x46, 0x2e, 0x7d, 0xb8, 0x1f, 0x24, 0xb1, 0xce, 0xc1,
0xd3, 0x24, 0xcd, 0x42, 0x91, 0x3e, 0x9a, 0x65, 0xcc, 0x02, 0x24, 0x3e, 0x4f, 0xb4, 0x6b, 0xb4,
0x05, 0x5c, 0x64, 0xdc, 0xa7, 0x1a, 0xac, 0x97, 0xd0, 0xd2, 0xe5, 0x5d, 0xfe, 0x39, 0x6c, 0xca,
0x28, 0xba, 0x56, 0xcc, 0x0d, 0x15, 0x78, 0x0a, 0x40, 0xfd, 0xd4, 0xea, 0xac, 0xf3, 0x2c, 0x0c,
0x55, 0xb0, 0xa9, 0x4c, 0x6c, 0x23, 0x9d, 0x98, 0xf6, 0x3c, 0x0b, 0x43, 0x19, 0x73, 0xd6, 0x4c,
0x95, 0x05, 0x62, 0x39, 0x75, 0xb1, 0x6e, 0xaa, 0xd0, 0x80, 0x9c, 0xfa, 0x1d, 0x6c, 0x4a, 0x05,
0x68, 0xb5, 0xca, 0x52, 0x84, 0x96, 0x61, 0x9c, 0x46, 0xa9, 0xce, 0x21, 0xbe, 0x5e, 0x69, 0x54,
0x00, 0xb5, 0x2c, 0xe6, 0x6c, 0x78, 0xb5, 0x74, 0xfb, 0xef, 0x1b, 0xb0, 0x51, 0x3f, 0x45, 0x5c,
0x5e, 0x36, 0x4c, 0x28, 0x2f, 0xc7, 0xd2, 0x2d, 0x49, 0x91, 0xdb, 0xda, 0x86, 0x56, 0xf1, 0xf1,
0xd7, 0x74, 0x14, 0x67, 0x3e, 0xf7, 0x1e, 0x2c, 0x99, 0x08, 0xd8, 0x1d, 0x7a, 0x6c, 0x28, 0x83,
0xad, 0x8e, 0xd3, 0x31, 0xc4, 0x43, 0x8f, 0x0d, 0xd1, 0x06, 0x2c, 0x0c, 0x49, 0x10, 0xe0, 0x58,
0x9f, 0x9e, 0x1e, 0xd9, 0x14, 0x3a, 0xe5, 0x6a, 0xe0, 0x3b, 0xc7, 0x7e, 0xdb, 0xd0, 0x92, 0xe5,
0xc1, 0x92, 0x25, 0x35, 0x25, 0x41, 0xbc, 0xce, 0xb7, 0x01, 0x14, 0x53, 0xf6, 0xc0, 0x54, 0xd4,
0xa9, 0xe0, 0xaf, 0xc6, 0x29, 0xb6, 0xc7, 0xd0, 0x2e, 0xd5, 0x10, 0x2b, 0xe8, 0x46, 0x05, 0x5d,
0xb7, 0xa3, 0x6b, 0x75, 0x3b, 0x12, 0x6a, 0x10, 0xee, 0x8e, 0x71, 0x11, 0x40, 0x91, 0x40, 0xaf,
0xdb, 0x29, 0x88, 0x47, 0x81, 0xfd, 0x73, 0x68, 0x9a, 0x32, 0x24, 0xfa, 0xa4, 0x54, 0xac, 0x54,
0x4f, 0xec, 0xca, 0x54, 0xb1, 0xb2, 0xa8, 0x54, 0xda, 0x7f, 0x6a, 0xc2, 0xa2, 0xa6, 0x8a, 0xb7,
0x41, 0x3c, 0x12, 0xe6, 0xe1, 0x14, 0xbf, 0xd1, 0x97, 0x79, 0x37, 0x27, 0x3f, 0xa5, 0x9a, 0xa6,
0x90, 0x38, 0x31, 0x23, 0x5b, 0xb7, 0x74, 0xe4, 0x21, 0x3e, 0x81, 0xe6, 0x30, 0x61, 0x5c, 0x4e,
0x9d, 0xaf, 0xd6, 0x25, 0x0e, 0x35, 0x27, 0xdf, 0x94, 0x81, 0xa2, 0xa7, 0xb0, 0x34, 0x4a, 0xc4,
0x9a, 0x34, 0xf1, 0x22, 0x12, 0x0f, 0x74, 0xdb, 0xae, 0x54, 0xe3, 0x7b, 0x23, 0xd8, 0x8e, 0xe2,
0x9a, 0xf9, 0x9d, 0x51, 0x89, 0x88, 0xbe, 0x81, 0x9e, 0xd0, 0x51, 0x12, 0x7b, 0xa1, 0x3b, 0x4c,
0x38, 0x4b, 0x13, 0xae, 0x9b, 0x72, 0xa5, 0xab, 0x7e, 0xaa, 0x11, 0x87, 0x0a, 0x60, 0x24, 0x75,
0xd3, 0x49, 0x3a, 0xfa, 0x02, 0x5a, 0x97, 0x5e, 0x18, 0xa6, 0x5e, 0x8a, 0xa9, 0x0e, 0xb1, 0x4b,
0x75, 0xb6, 0x6f, 0x0d, 0xcb, 0xcc, 0x2f, 0xc0, 0xe8, 0xaf, 0xa0, 0x23, 0x13, 0x59, 0xf3, 0x25,
0x8b, 0xd5, 0x8a, 0x8a, 0xc8, 0x66, 0x2b, 0x1f, 0xd2, 0x0e, 0x0a, 0x9a, 0x58, 0xfa, 0x2c, 0xcc,
0x30, 0x4f, 0x12, 0x3e, 0xd4, 0xcd, 0xb4, 0xd2, 0xd2, 0x4f, 0x0d, 0x2b, 0x5f, 0x3a, 0x07, 0xa3,
0xdf, 0xc2, 0xc6, 0x15, 0x35, 0xe0, 0x56, 0x35, 0xac, 0xaf, 0x0d, 0x81, 0x8d, 0xc8, 0x75, 0xaf,
0xb6, 0xf4, 0xfb, 0x25, 0xb4, 0xa3, 0x20, 0x72, 0x4d, 0x2e, 0x04, 0xd5, 0x9b, 0x71, 0x7c, 0x70,
0xac, 0xe3, 0xf6, 0xfc, 0x66, 0x44, 0x41, 0x64, 0x42, 0x79, 0x0c, 0x5b, 0xa6, 0xcd, 0x27, 0x4b,
0x4d, 0xee, 0x80, 0x7a, 0x3e, 0x76, 0x53, 0x4c, 0x49, 0x12, 0xe8, 0xbe, 0xdb, 0x83, 0xd2, 0x41,
0x69, 0xec, 0x8b, 0xc4, 0xbf, 0xf8, 0x95, 0x40, 0x9e, 0x4a, 0xa0, 0x91, 0x7c, 0x33, 0xad, 0xe7,
0xa3, 0xef, 0x60, 0x23, 0xf2, 0xbe, 0x27, 0x51, 0x16, 0x89, 0x5c, 0x59, 0x3e, 0x6c, 0xd2, 0x6b,
0x9a, 0xa6, 0xdc, 0xfb, 0xe5, 0x28, 0x56, 0xe2, 0x1c, 0x0d, 0x13, 0xce, 0x33, 0xdf, 0xf9, 0x5a,
0x54, 0xc3, 0x44, 0xbf, 0x81, 0xf5, 0x80, 0x78, 0x83, 0x38, 0x61, 0x9c, 0xf8, 0x2e, 0xcb, 0xce,
0x22, 0xc2, 0x64, 0xb4, 0xb2, 0x54, 0x95, 0x7d, 0x90, 0xc3, 0xfa, 0x39, 0x2a, 0x97, 0x1d, 0xd4,
0x30, 0x85, 0x09, 0x78, 0x69, 0xea, 0x7a, 0xb1, 0x17, 0x8e, 0x39, 0xf1, 0x99, 0x6e, 0xdc, 0x4d,
0xf6, 0xa1, 0xf6, 0x0c, 0x37, 0x37, 0x01, 0xaf, 0x44, 0x44, 0xe7, 0xb0, 0x79, 0x75, 0xf7, 0xa1,
0x5b, 0x4d, 0x14, 0xaf, 0xca, 0x94, 0x8c, 0x6c, 0xcb, 0xbb, 0xaa, 0xe9, 0xf0, 0x39, 0xb4, 0x38,
0x89, 0xb0, 0xfb, 0x43, 0x12, 0x63, 0xdd, 0xd9, 0x2b, 0x99, 0xf9, 0x2b, 0x12, 0xe1, 0xdf, 0x24,
0x71, 0x61, 0xe6, 0x5c, 0x13, 0xec, 0x47, 0xb0, 0x5a, 0x63, 0xc7, 0x22, 0x92, 0x56, 0x4d, 0xc4,
0x40, 0x47, 0x0f, 0x66, 0x68, 0x3f, 0x86, 0x8d, 0x7a, 0x8b, 0x9d, 0x31, 0xe7, 0x2f, 0xa1, 0x57,
0xb5, 0x4f, 0x11, 0xd4, 0x92, 0xc8, 0x14, 0x1e, 0x3a, 0x8e, 0x1a, 0x08, 0xea, 0xe5, 0x10, 0x53,
0x93, 0x20, 0xa8, 0x81, 0xfd, 0x10, 0xd0, 0xb4, 0x89, 0xce, 0x58, 0xef, 0x63, 0xe8, 0x55, 0x8d,
0x72, 0x06, 0xfa, 0x1f, 0x1a, 0x70, 0x6b, 0x96, 0xf1, 0xbd, 0x35, 0x98, 0x7d, 0x73, 0xa5, 0x91,
0x2b, 0x57, 0xbd, 0xfb, 0x16, 0x23, 0xbf, 0xc2, 0xba, 0xed, 0xbf, 0x6d, 0xc0, 0xee, 0x5b, 0x6e,
0xc4, 0x5b, 0xf7, 0xf6, 0x14, 0x6e, 0x4f, 0xdc, 0x39, 0x37, 0x50, 0xf5, 0x28, 0x11, 0xc2, 0xe4,
0x79, 0x5d, 0xc7, 0xd9, 0x9e, 0x00, 0x1d, 0xe4, 0x18, 0xa1, 0x76, 0xfb, 0x31, 0xac, 0xd7, 0x77,
0x9e, 0x36, 0xa1, 0x39, 0x4a, 0xe3, 0xf2, 0x7f, 0x5d, 0x16, 0x47, 0x69, 0xfc, 0x3a, 0x23, 0x81,
0xfd, 0x99, 0xa9, 0x93, 0x96, 0x9e, 0x25, 0x91, 0xc0, 0x95, 0x1f, 0x32, 0xbd, 0xdb, 0xe2, 0xad,
0xb2, 0x1f, 0x42, 0xb7, 0x72, 0x55, 0x45, 0x38, 0x50, 0x5c, 0x6c, 0x5d, 0xf8, 0xca, 0x6f, 0xef,
0x27, 0xd0, 0xad, 0xbc, 0x60, 0x22, 0x91, 0xca, 0x9f, 0x3b, 0x0d, 0x37, 0x63, 0xfb, 0xd7, 0xb0,
0x32, 0xe5, 0x11, 0xd1, 0x93, 0x49, 0x1f, 0xda, 0xa8, 0x36, 0xe7, 0x8b, 0x19, 0x65, 0xe7, 0x69,
0x07, 0x00, 0x05, 0x07, 0xbd, 0x81, 0x07, 0xb2, 0x59, 0xa2, 0x9b, 0xcb, 0xc2, 0x99, 0xca, 0x9a,
0x27, 0x0e, 0xdc, 0xcb, 0x21, 0x09, 0xb1, 0xcb, 0xb2, 0x14, 0xd3, 0x11, 0x61, 0xf9, 0xf5, 0x7b,
0xaf, 0xc0, 0x0b, 0x87, 0xb9, 0xa7, 0xd0, 0xdf, 0x0a, 0x70, 0x3f, 0xc7, 0xda, 0xbf, 0x85, 0x9d,
0xd9, 0x6e, 0x17, 0xfd, 0x72, 0xa6, 0x13, 0x57, 0x11, 0xd6, 0x55, 0xae, 0xd9, 0xee, 0xc3, 0xf6,
0x0c, 0x97, 0x8b, 0x3e, 0xbb, 0xd2, 0x73, 0x2b, 0xb9, 0xb5, 0x2e, 0xd9, 0xfe, 0x19, 0x6c, 0xcf,
0xf0, 0xb5, 0x33, 0x0c, 0xf1, 0x91, 0xcc, 0x25, 0xab, 0x0e, 0x75, 0xc6, 0x84, 0x7d, 0xd8, 0x7d,
0x4b, 0xbf, 0xf6, 0x1d, 0xb2, 0xab, 0xaf, 0xe1, 0xd6, 0xac, 0xf6, 0xeb, 0x3b, 0x48, 0x18, 0xc0,
0xd6, 0xd5, 0x2d, 0xd5, 0x77, 0xe8, 0x3f, 0xdc, 0x87, 0xae, 0xfe, 0x7b, 0x48, 0xde, 0xb3, 0x55,
0xe9, 0xd5, 0xb2, 0x22, 0x1b, 0x51, 0xf6, 0x7f, 0x36, 0x60, 0xb5, 0xa6, 0xb3, 0x8a, 0x3e, 0x84,
0x9e, 0x9f, 0x51, 0x2a, 0x8e, 0x27, 0xaf, 0x60, 0xeb, 0xaa, 0xb9, 0xa6, 0xe7, 0xd0, 0xbb, 0xd0,
0x89, 0xf1, 0x65, 0x01, 0xd3, 0x15, 0xb0, 0x18, 0x5f, 0xe6, 0x90, 0x5d, 0x68, 0xab, 0x7a, 0x7e,
0x42, 0x93, 0x88, 0xe9, 0x2a, 0x3e, 0x48, 0xd2, 0x89, 0xa0, 0xa0, 0x67, 0xb0, 0x6b, 0xfe, 0xa6,
0xa3, 0x8b, 0x5a, 0xcc, 0x8d, 0x31, 0xbf, 0x4c, 0xe8, 0x85, 0xcb, 0x31, 0x1f, 0x62, 0xaa, 0x53,
0x81, 0x5b, 0x1a, 0xa6, 0x8b, 0x5a, 0xec, 0xa5, 0x02, 0xbd, 0x92, 0x18, 0xfb, 0x33, 0xd8, 0xa8,
0x6f, 0xe7, 0x4e, 0x54, 0xe2, 0x1b, 0x95, 0x4a, 0xfc, 0x1f, 0x1a, 0xd0, 0xad, 0x74, 0xd3, 0xfe,
0x4c, 0xbf, 0xff, 0xa7, 0x80, 0xa6, 0x5b, 0x79, 0x33, 0xbf, 0xfd, 0x04, 0xd6, 0xea, 0x7a, 0xd4,
0x22, 0x69, 0x18, 0x94, 0x5a, 0x62, 0xe2, 0xf7, 0x74, 0xee, 0x76, 0x6d, 0x3a, 0x77, 0x13, 0x0f,
0x73, 0xb5, 0x9f, 0x8c, 0x3e, 0x82, 0x45, 0xd5, 0x80, 0x36, 0xb9, 0x4b, 0xaf, 0xf4, 0x7f, 0x27,
0xc9, 0x70, 0x0c, 0xc0, 0x1e, 0xc3, 0x82, 0x9e, 0xb5, 0x0b, 0xed, 0x94, 0x26, 0x41, 0xe6, 0xab,
0x76, 0xb0, 0x76, 0xed, 0x9a, 0xf4, 0x0d, 0x1e, 0xcb, 0xba, 0xb1, 0x06, 0x4c, 0x16, 0x94, 0x96,
0x35, 0xd9, 0x54, 0xd2, 0x64, 0x39, 0x45, 0xff, 0x5b, 0x49, 0x3e, 0x43, 0x3a, 0xdd, 0x32, 0x7f,
0x3d, 0xd9, 0x93, 0x44, 0xfb, 0x63, 0x58, 0xab, 0x6b, 0x85, 0x8b, 0x08, 0x42, 0x76, 0x3d, 0xb4,
0xaf, 0x50, 0x03, 0xfb, 0x05, 0xa0, 0xe9, 0x16, 0x37, 0xfa, 0x1c, 0x6e, 0x9e, 0x93, 0x90, 0x63,
0x5a, 0xf4, 0xc6, 0xdd, 0x34, 0x21, 0x31, 0x37, 0x66, 0xba, 0xae, 0xd8, 0xf9, 0x94, 0x53, 0xc9,
0xb4, 0xff, 0xd8, 0x00, 0x34, 0xdd, 0xdf, 0x16, 0xcf, 0xe1, 0x05, 0x1e, 0x97, 0x93, 0xcd, 0xc5,
0x0b, 0x3c, 0x96, 0xa9, 0xe6, 0x01, 0xf4, 0x8a, 0x7e, 0xb9, 0x6a, 0xf6, 0xe9, 0xe0, 0xa0, 0x14,
0xa5, 0xe5, 0xc2, 0x54, 0x9f, 0xc8, 0xe9, 0xe6, 0x53, 0x14, 0x41, 0xe8, 0x50, 0x5c, 0x5e, 0x1f,
0x53, 0xe1, 0x3a, 0x7c, 0x4f, 0x37, 0x5e, 0x3a, 0xce, 0x72, 0x8c, 0x2f, 0xf7, 0x0b, 0x2a, 0xfa,
0x1a, 0x6e, 0x51, 0x9c, 0x86, 0x63, 0x17, 0xc7, 0x3e, 0x1d, 0xeb, 0x22, 0x5b, 0x69, 0xd6, 0x75,
0x39, 0x6b, 0x4b, 0x62, 0x9e, 0xe5, 0x90, 0x92, 0x04, 0xfb, 0x9f, 0x1b, 0xd0, 0xad, 0xec, 0x67,
0xd6, 0xd5, 0x54, 0x5d, 0x43, 0xf1, 0x9e, 0x61, 0x71, 0xfe, 0x2e, 0xfe, 0x3e, 0x4d, 0x28, 0xd7,
0x77, 0xae, 0xa7, 0x39, 0xdf, 0xe0, 0xf1, 0x33, 0x49, 0x47, 0x5f, 0xc1, 0xf6, 0x34, 0xba, 0x30,
0x4a, 0x75, 0xe0, 0x56, 0x75, 0x9a, 0xb9, 0xef, 0xf6, 0x97, 0xb0, 0x32, 0xd5, 0x9d, 0x17, 0xca,
0xa9, 0xf6, 0xf4, 0xd5, 0x26, 0x97, 0xcf, 0x26, 0x80, 0xf6, 0x7f, 0x37, 0x60, 0xc9, 0xc1, 0x2c,
0x0b, 0xb9, 0xf9, 0xdf, 0x2e, 0x82, 0xeb, 0x59, 0x50, 0x6a, 0x29, 0x07, 0x64, 0xfa, 0xbf, 0xbc,
0xd7, 0xa6, 0xff, 0xcb, 0xfb, 0x04, 0xda, 0x98, 0xd2, 0x84, 0xba, 0xfe, 0xd0, 0x23, 0xf1, 0x74,
0xe5, 0xf7, 0x99, 0x60, 0xee, 0x0b, 0x9e, 0x03, 0x38, 0xff, 0x6d, 0xf7, 0x61, 0xa1, 0xcf, 0x3d,
0x9e, 0x31, 0xd4, 0x83, 0xce, 0x9e, 0x7f, 0x11, 0x27, 0x97, 0x21, 0x0e, 0x06, 0x38, 0xe8, 0xcd,
0xa1, 0x16, 0xdc, 0x90, 0xb3, 0x7a, 0x0d, 0xb4, 0x01, 0x48, 0xff, 0xf7, 0xf7, 0xb9, 0x6c, 0x34,
0x2b, 0xfa, 0x35, 0xd4, 0x84, 0xeb, 0x47, 0x41, 0x88, 0x7b, 0xf3, 0x08, 0x60, 0xe1, 0x65, 0xc2,
0x5f, 0x26, 0x97, 0xbd, 0xeb, 0xf6, 0xbf, 0x35, 0x00, 0x8a, 0xf5, 0xd0, 0xa7, 0xb0, 0x1e, 0x26,
0xbe, 0x17, 0x92, 0x1f, 0x70, 0xe0, 0x06, 0x98, 0xf9, 0x94, 0xa4, 0x79, 0x2d, 0xb0, 0xe5, 0xac,
0xe5, 0xcc, 0x83, 0x82, 0x27, 0x9e, 0xfb, 0x8c, 0xb9, 0x38, 0x1e, 0x84, 0x84, 0x0d, 0x27, 0x66,
0xa9, 0x8f, 0x5f, 0xcb, 0xd8, 0x33, 0xc5, 0x2c, 0xcf, 0xba, 0x0b, 0x1d, 0xa5, 0x85, 0x20, 0x89,
0x94, 0x1a, 0xa4, 0xa2, 0x24, 0xed, 0x40, 0x92, 0xd0, 0x6d, 0x00, 0xad, 0xa8, 0x24, 0x50, 0x97,
0xef, 0x86, 0xd3, 0x52, 0x1a, 0x49, 0x02, 0xfc, 0xb4, 0xf7, 0x1f, 0x3f, 0xee, 0x34, 0xfe, 0xeb,
0xc7, 0x9d, 0xc6, 0x1f, 0x7f, 0xdc, 0x69, 0xfc, 0xd3, 0xff, 0xec, 0xcc, 0x9d, 0x2d, 0x48, 0x05,
0x7e, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x8b, 0x23, 0xaa, 0x78, 0x2d, 0x00, 0x00,
// 3999 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0x4f, 0x73, 0xdc, 0x46,
0x76, 0xe7, 0x90, 0x12, 0xc9, 0x79, 0x33, 0x24, 0x87, 0xcd, 0x3f, 0x1a, 0x92, 0x12, 0x29, 0x41,
0xb6, 0x25, 0x7b, 0x6d, 0xc9, 0x91, 0x2d, 0xdb, 0xbb, 0x6b, 0x27, 0xa6, 0x48, 0x69, 0xc9, 0xb5,
0x28, 0xb2, 0x30, 0x92, 0x5c, 0xb5, 0xce, 0x06, 0x0b, 0x02, 0x4d, 0x4e, 0x17, 0x01, 0x34, 0xdc,
0xdd, 0x18, 0x7a, 0x7c, 0x4f, 0xe5, 0x98, 0xca, 0x25, 0x49, 0xe5, 0x92, 0x7b, 0xbe, 0x41, 0xf2,
0x05, 0x36, 0x55, 0xb9, 0xa4, 0xf2, 0x09, 0xb6, 0x9c, 0xaf, 0x90, 0x8b, 0x6f, 0xa9, 0xfe, 0x07,
0x60, 0x30, 0xe0, 0x48, 0x97, 0x1c, 0x72, 0x9b, 0x7e, 0xef, 0xd7, 0xaf, 0x1b, 0xdd, 0xfd, 0xfe,
0x0f, 0x34, 0xe3, 0x30, 0x7e, 0x90, 0x32, 0x2a, 0x28, 0x9a, 0x8f, 0xc3, 0x58, 0xfd, 0x72, 0xfe,
0x00, 0x8b, 0x7b, 0x34, 0x8e, 0xfd, 0x24, 0x3c, 0xf1, 0x87, 0x11, 0xf5, 0x43, 0x74, 0x07, 0xda,
0x81, 0xa6, 0x78, 0x59, 0x46, 0xc2, 0x6e, 0xe3, 0x76, 0xe3, 0x7e, 0xd3, 0x6d, 0x19, 0xda, 0xab,
0x8c, 0x84, 0xe8, 0x17, 0x30, 0x67, 0x86, 0xdd, 0xe9, 0xdb, 0x8d, 0xfb, 0xad, 0x47, 0xcb, 0x0f,
0xac, 0xc0, 0x07, 0x46, 0x9a, 0x6b, 0x11, 0xce, 0x1f, 0xbb, 0x30, 0x67, 0x88, 0x52, 0x36, 0xc3,
0xdf, 0x67, 0x98, 0x0b, 0x4f, 0x0c, 0x53, 0x6c, 0x65, 0x1b, 0xda, 0xcb, 0x61, 0x8a, 0xd1, 0x1e,
0x2c, 0x91, 0x84, 0x0b, 0x3f, 0x8a, 0xbc, 0x94, 0xd1, 0x33, 0x12, 0x61, 0xb3, 0x46, 0xb7, 0x58,
0xe3, 0x50, 0x03, 0x4e, 0x34, 0xff, 0x60, 0xca, 0x5d, 0x24, 0x23, 0x14, 0xf4, 0x35, 0x2c, 0x32,
0x1c, 0xd3, 0x01, 0xce, 0x65, 0xcc, 0x28, 0x19, 0x37, 0x0a, 0x19, 0xae, 0xe2, 0x17, 0x22, 0x16,
0x58, 0x99, 0x80, 0xfa, 0x70, 0xb3, 0xb4, 0x8d, 0x01, 0xe1, 0x84, 0x26, 0x24, 0x39, 0xcf, 0xe5,
0x5d, 0x53, 0xf2, 0xde, 0xa9, 0xdb, 0x53, 0x0e, 0x2e, 0x84, 0x6f, 0x92, 0x2b, 0xb9, 0x08, 0xc3,
0x56, 0x79, 0xaf, 0xd5, 0x85, 0xae, 0xab, 0x85, 0xee, 0xd6, 0x6c, 0xbc, 0x66, 0x9d, 0x8d, 0xd2,
0x47, 0x54, 0x96, 0x39, 0x05, 0xbb, 0x09, 0x1c, 0x7a, 0x7e, 0x9a, 0x46, 0x24, 0xf0, 0x05, 0xa1,
0x89, 0x17, 0x11, 0x2e, 0xba, 0xb3, 0x6a, 0x15, 0x67, 0xec, 0x73, 0x70, 0xb8, 0x5b, 0x40, 0x9f,
0x13, 0x2e, 0x0e, 0xa6, 0xdc, 0x2e, 0xb9, 0x82, 0x87, 0x9e, 0x03, 0x0a, 0xf1, 0x80, 0x04, 0xd8,
0x23, 0xc9, 0x19, 0x65, 0xb1, 0xe2, 0x74, 0xe7, 0x94, 0xec, 0xad, 0x42, 0xf6, 0xbe, 0xc2, 0x1c,
0x16, 0x90, 0x83, 0x29, 0x77, 0x39, 0xac, 0x12, 0xd1, 0xe7, 0xd0, 0x32, 0xd2, 0x22, 0x1a, 0x5c,
0x74, 0xe7, 0x95, 0x98, 0xd5, 0xaa, 0x98, 0xe7, 0x34, 0xb8, 0x38, 0x98, 0x72, 0x21, 0xcc, 0x47,
0xf2, 0xf6, 0x83, 0x08, 0xfb, 0xcc, 0x4b, 0x7d, 0xce, 0x03, 0x1a, 0xe2, 0x6e, 0xb3, 0x7a, 0xfb,
0x7b, 0x92, 0x7f, 0x62, 0xd8, 0xf2, 0xf6, 0x83, 0x32, 0x01, 0xfd, 0x0a, 0xda, 0x98, 0xf9, 0x1c,
0x7b, 0x5a, 0x6a, 0x17, 0xd4, 0xfc, 0xb5, 0x62, 0xfe, 0x53, 0xc9, 0xd5, 0x1b, 0x38, 0x98, 0x72,
0x5b, 0xb8, 0x18, 0xa2, 0x43, 0x58, 0xb6, 0x6f, 0x3c, 0x26, 0x8c, 0x51, 0x46, 0x92, 0xf3, 0x6e,
0x4b, 0x09, 0xd8, 0x2c, 0xdf, 0xa2, 0x82, 0x1c, 0x59, 0xc4, 0xc1, 0x94, 0xdb, 0x61, 0x15, 0x1a,
0xfa, 0x52, 0xaa, 0x0b, 0x17, 0x8c, 0x04, 0xf2, 0x40, 0x78, 0xb7, 0xad, 0xa4, 0xac, 0x97, 0xa5,
0x14, 0xdc, 0x83, 0x29, 0x77, 0x04, 0x8d, 0x8e, 0x60, 0x25, 0x4b, 0xe4, 0xd1, 0x79, 0x19, 0xc7,
0xcc, 0xf3, 0x83, 0x80, 0x66, 0x89, 0xe8, 0x2e, 0x54, 0xaf, 0xe3, 0x95, 0x02, 0xbd, 0xe2, 0x98,
0xed, 0x6a, 0x88, 0xbc, 0x8e, 0xac, 0x4a, 0xd4, 0xd7, 0x11, 0x61, 0x81, 0x95, 0xb8, 0xee, 0xe2,
0xf8, 0x75, 0x48, 0xa6, 0x9c, 0xa1, 0xaf, 0xc3, 0x8e, 0xd0, 0x3e, 0x74, 0x70, 0xe2, 0x9f, 0x46,
0xf2, 0x1e, 0xe5, 0xa1, 0xc8, 0x0b, 0x59, 0xaa, 0xaa, 0xf4, 0x53, 0x85, 0x78, 0x4e, 0xb9, 0x38,
0xd2, 0x37, 0xb2, 0x88, 0x47, 0x28, 0xe8, 0x18, 0x56, 0xac, 0x42, 0x96, 0x5e, 0x6f, 0xb7, 0xa3,
0x04, 0xdd, 0x1c, 0x7b, 0xb8, 0xa5, 0xa7, 0x79, 0x30, 0xe5, 0x22, 0x32, 0x46, 0x45, 0xaf, 0x60,
0xcd, 0x1c, 0x89, 0x17, 0xd0, 0xe4, 0x8c, 0x9c, 0x67, 0x4c, 0x8b, 0x5c, 0x56, 0x22, 0xb7, 0x0b,
0x91, 0xe6, 0x04, 0xf6, 0xca, 0xa8, 0x83, 0x29, 0x77, 0xd5, 0xaf, 0xa1, 0xa3, 0x1e, 0xac, 0xc9,
0xfd, 0x0d, 0x3d, 0x86, 0x43, 0x1c, 0xa7, 0x4a, 0xc5, 0xd4, 0x1b, 0x44, 0x4a, 0xec, 0xad, 0x92,
0x58, 0x09, 0x73, 0x73, 0xd4, 0x9e, 0xfe, 0xee, 0x15, 0x7f, 0x9c, 0x8c, 0xfe, 0x12, 0xba, 0xb1,
0x9f, 0xf8, 0xe7, 0x75, 0xaa, 0xbb, 0xa2, 0xe4, 0xde, 0x2e, 0xe4, 0x1e, 0x69, 0xe4, 0xb8, 0xe2,
0xae, 0xc7, 0xb5, 0x1c, 0xa9, 0xb6, 0xc6, 0x02, 0x95, 0x4f, 0x76, 0xb5, 0xfa, 0x4e, 0xb4, 0xe1,
0x19, 0x3d, 0xd8, 0x65, 0x56, 0x25, 0xa2, 0xdf, 0xc0, 0x32, 0x49, 0x06, 0x44, 0x60, 0x4f, 0x50,
0x69, 0xc5, 0xce, 0x99, 0x1f, 0x77, 0xd7, 0x94, 0xb0, 0x8d, 0xf2, 0x35, 0x49, 0xc8, 0x4b, 0x7a,
0xa2, 0x01, 0x07, 0x53, 0xee, 0x12, 0x19, 0x25, 0xc9, 0x0b, 0x1a, 0xf8, 0x11, 0x09, 0x7d, 0xe1,
0x97, 0x37, 0xc6, 0xbb, 0xeb, 0xd5, 0x0b, 0x7a, 0xad, 0x61, 0xe5, 0x6d, 0x48, 0x75, 0x58, 0xb5,
0xd3, 0xcb, 0x74, 0xf4, 0x15, 0x2c, 0xd8, 0x87, 0x14, 0xe3, 0x90, 0xf8, 0xdd, 0x1b, 0x55, 0xad,
0x32, 0x4f, 0xe8, 0x48, 0x72, 0xa5, 0x56, 0x91, 0xd2, 0x58, 0x9a, 0x06, 0x73, 0x58, 0x7a, 0x76,
0xb7, 0x6a, 0x1a, 0xf4, 0x31, 0xd9, 0xc9, 0x2d, 0x56, 0x0c, 0xd1, 0xc7, 0x30, 0xcf, 0xb1, 0x10,
0x24, 0x39, 0xe7, 0xdd, 0x0d, 0x35, 0x0f, 0x15, 0xf3, 0x7a, 0x86, 0x73, 0x30, 0xe5, 0xe6, 0x28,
0x74, 0x09, 0x77, 0xea, 0x2e, 0x7e, 0xf4, 0xc1, 0x6e, 0x2a, 0x51, 0xef, 0x4f, 0x7a, 0x01, 0xd5,
0xb7, 0xbb, 0x13, 0x4f, 0x86, 0xa0, 0x04, 0xb6, 0xeb, 0x16, 0xf6, 0x85, 0x60, 0xe4, 0x34, 0x13,
0x98, 0x77, 0xb7, 0xd4, 0xaa, 0xef, 0x4d, 0x5a, 0x75, 0x37, 0x47, 0x1f, 0x4c, 0xb9, 0x37, 0xe3,
0x09, 0x7c, 0xe9, 0x6f, 0xeb, 0xd6, 0x3b, 0xc3, 0x38, 0x3c, 0xf5, 0x83, 0x8b, 0xee, 0xcd, 0xaa,
0xbf, 0x1d, 0x5f, 0xed, 0x99, 0xc1, 0x4a, 0x7f, 0x1b, 0x5f, 0xc9, 0x95, 0x0a, 0xca, 0xb1, 0xf0,
0xce, 0x08, 0x8b, 0x2f, 0x7d, 0x86, 0x95, 0x93, 0xb8, 0xa4, 0x2c, 0xec, 0xde, 0xaa, 0x2a, 0x68,
0x0f, 0x8b, 0x67, 0x06, 0x75, 0x62, 0x40, 0x52, 0x41, 0xf9, 0x38, 0x59, 0x2a, 0xe8, 0x00, 0x33,
0x72, 0x36, 0xac, 0x91, 0xbb, 0x5d, 0x55, 0xd0, 0xd7, 0x0a, 0x59, 0x23, 0x7a, 0x7d, 0x50, 0xcb,
0x41, 0xdf, 0xc2, 0x0d, 0xb9, 0x65, 0x3f, 0x13, 0xd4, 0xf3, 0xc3, 0x98, 0x24, 0x85, 0xf0, 0x9d,
0xaa, 0x2e, 0xf4, 0xb0, 0xd8, 0xcd, 0x04, 0xdd, 0x95, 0xb0, 0x92, 0xe8, 0x55, 0x5e, 0x43, 0x47,
0xbf, 0x05, 0xc4, 0x83, 0x3e, 0x0e, 0xb3, 0x08, 0x7b, 0x94, 0x7b, 0x59, 0x2a, 0xb5, 0xa8, 0x7b,
0xbb, 0xea, 0xac, 0x7a, 0x06, 0x73, 0xdc, 0x7b, 0xa5, 0x10, 0xd2, 0x59, 0xd9, 0x79, 0xc7, 0x5c,
0xd3, 0xd4, 0x26, 0xc7, 0x64, 0x79, 0x3c, 0xf0, 0x93, 0xee, 0x9d, 0xb1, 0x4d, 0x56, 0x04, 0xf6,
0x02, 0x5f, 0x59, 0xd4, 0xaa, 0x50, 0x49, 0x47, 0x27, 0xb0, 0xea, 0x07, 0x82, 0x0c, 0xb0, 0x97,
0x70, 0x0f, 0xff, 0x20, 0x70, 0xc2, 0x95, 0x19, 0x70, 0xaa, 0xa6, 0x7f, 0x57, 0xa1, 0x5e, 0xf4,
0x9e, 0xe6, 0x18, 0x69, 0xfa, 0xf5, 0xdc, 0x17, 0xbc, 0xa0, 0x4a, 0x89, 0x8c, 0x0a, 0xb9, 0x3d,
0x19, 0x1a, 0x0d, 0xfc, 0x2c, 0x12, 0xde, 0x05, 0x1e, 0x76, 0xef, 0x56, 0x25, 0xba, 0x0a, 0xf5,
0x8c, 0x44, 0xf8, 0xb5, 0x04, 0x7d, 0x83, 0x87, 0x52, 0x22, 0xcb, 0xa9, 0x03, 0x43, 0x95, 0xea,
0x62, 0x8d, 0x0a, 0x4e, 0x04, 0x66, 0x29, 0x23, 0x7c, 0xd4, 0x9c, 0xbe, 0x53, 0x55, 0x17, 0x63,
0x65, 0x9e, 0xe6, 0xf0, 0x51, 0xcb, 0x6a, 0xc3, 0xcf, 0x5a, 0xbe, 0xf4, 0xed, 0xf2, 0x45, 0x9c,
0x52, 0x2a, 0xb8, 0x60, 0x7e, 0xea, 0x09, 0x7a, 0x81, 0x93, 0xee, 0xbb, 0x55, 0x9b, 0xdd, 0xc3,
0xe2, 0x89, 0xc5, 0xbc, 0x94, 0x10, 0x69, 0xb3, 0x79, 0x95, 0x28, 0x6d, 0xb6, 0x14, 0xc7, 0x70,
0x40, 0x07, 0x98, 0x0d, 0x75, 0xc0, 0xf5, 0x5e, 0xd5, 0x66, 0xf7, 0xb0, 0x70, 0x0d, 0xc2, 0x44,
0x5d, 0x4b, 0x7c, 0x94, 0x24, 0x4f, 0xd6, 0xe8, 0xc1, 0xa8, 0xac, 0x7b, 0xd5, 0x93, 0xd5, 0x3a,
0x50, 0x11, 0x87, 0x06, 0x63, 0xd4, 0x27, 0x4d, 0x98, 0x33, 0x71, 0x91, 0xf3, 0x01, 0x2c, 0x8e,
0x46, 0xfe, 0xa8, 0x0b, 0x73, 0xa9, 0x4e, 0x5b, 0x54, 0x2a, 0xd1, 0x76, 0xed, 0xd0, 0x79, 0x08,
0x0b, 0x23, 0x11, 0x3e, 0xda, 0x06, 0x20, 0x21, 0x4e, 0x04, 0x39, 0x23, 0x98, 0x99, 0xc4, 0xa3,
0x44, 0x71, 0x8e, 0x61, 0xf3, 0xea, 0x10, 0x1e, 0xfd, 0x19, 0xac, 0xd6, 0xa6, 0x01, 0x7a, 0xd5,
0x95, 0x74, 0x7c, 0x8a, 0xf3, 0x10, 0x36, 0xae, 0x0c, 0xd5, 0x11, 0x82, 0x6b, 0xa5, 0xe4, 0x4a,
0xfd, 0x76, 0xfa, 0xd0, 0xbd, 0x2a, 0xea, 0x46, 0xb7, 0xa1, 0x55, 0xec, 0x95, 0x77, 0x1b, 0xb7,
0x67, 0x64, 0xde, 0x54, 0x22, 0xa1, 0x0f, 0x60, 0xb9, 0x64, 0x40, 0xb9, 0x47, 0x93, 0x68, 0xa8,
0x32, 0xa7, 0x79, 0x77, 0xa9, 0xb0, 0x86, 0xfc, 0x38, 0x89, 0x86, 0xce, 0x47, 0xb0, 0x3c, 0x16,
0x83, 0xcb, 0xb3, 0xfc, 0x3e, 0xc3, 0x8c, 0x60, 0x2b, 0xde, 0x0e, 0x9d, 0x47, 0xb0, 0x30, 0x12,
0x2f, 0xcb, 0x34, 0xce, 0x44, 0x96, 0xfa, 0xd9, 0xe9, 0x53, 0x68, 0x69, 0x9a, 0x7a, 0x51, 0xce,
0x77, 0x00, 0x45, 0x7c, 0x8e, 0x3a, 0x30, 0x93, 0x92, 0xc4, 0x7c, 0xad, 0xfc, 0x29, 0x57, 0x8b,
0x31, 0xe7, 0xfe, 0xb9, 0x4e, 0xef, 0x9a, 0xae, 0x1d, 0x4a, 0xe1, 0x69, 0x9f, 0x26, 0xd8, 0x4b,
0xb2, 0xf8, 0x14, 0x33, 0x95, 0xb9, 0x35, 0xdd, 0x96, 0xa2, 0xbd, 0x50, 0x24, 0xe7, 0x6f, 0x1a,
0xd0, 0x2a, 0x45, 0xe0, 0x35, 0xe2, 0x3f, 0x04, 0x94, 0x32, 0xcc, 0x31, 0x1b, 0x60, 0x4f, 0x05,
0x10, 0x69, 0xe4, 0x27, 0xe6, 0x38, 0x3a, 0x96, 0xb3, 0xef, 0x0b, 0xff, 0x24, 0xf2, 0x13, 0xf4,
0x05, 0x74, 0x43, 0xc2, 0xfd, 0x28, 0xa2, 0x97, 0xf2, 0x66, 0x7f, 0x20, 0x31, 0x11, 0x43, 0x8f,
0x63, 0x91, 0xa5, 0x6a, 0xf9, 0x79, 0x77, 0xdd, 0xf2, 0x4f, 0x2c, 0xbb, 0x27, 0xb9, 0xce, 0xbf,
0x34, 0xa0, 0x53, 0x0d, 0xe5, 0xd1, 0xfb, 0xd0, 0x09, 0x31, 0x17, 0x24, 0xd1, 0x3e, 0x2c, 0xf1,
0x63, 0x9b, 0xe9, 0x2e, 0x95, 0xe8, 0x2f, 0xfc, 0x18, 0xa3, 0x47, 0xb0, 0x56, 0x86, 0xda, 0xec,
0x29, 0x34, 0x87, 0xb2, 0x52, 0x62, 0x9a, 0x1b, 0x0b, 0xd1, 0x16, 0x34, 0xa5, 0x55, 0xf5, 0x04,
0x89, 0xb1, 0x39, 0x9d, 0x79, 0x49, 0x78, 0x49, 0x62, 0x8c, 0x36, 0x61, 0x3e, 0xf7, 0x0d, 0xd7,
0x34, 0xcf, 0x8e, 0x9d, 0x5d, 0x68, 0x97, 0x13, 0x06, 0xf3, 0xa8, 0xe5, 0x7b, 0xf4, 0x46, 0xd2,
0x8c, 0x86, 0xfa, 0xe4, 0x15, 0xc3, 0x2b, 0x4f, 0x71, 0x1e, 0xc2, 0xf2, 0x58, 0xba, 0x20, 0xd7,
0x94, 0x29, 0x41, 0xe9, 0x3b, 0xf3, 0xb1, 0x73, 0x2c, 0xdf, 0x41, 0x9e, 0x0a, 0x4c, 0x40, 0xa2,
0x77, 0x61, 0xf1, 0x8c, 0xb2, 0x40, 0xe6, 0x5c, 0x11, 0x56, 0x26, 0x53, 0x5f, 0xd7, 0x82, 0xa2,
0xee, 0x1b, 0xa2, 0x43, 0x60, 0x71, 0x34, 0x57, 0x28, 0x3f, 0xa5, 0xc6, 0xe4, 0xa7, 0x34, 0x3d,
0xf6, 0x94, 0xe4, 0x8e, 0xce, 0x28, 0x15, 0x09, 0x15, 0xf9, 0x59, 0xda, 0xb1, 0xf3, 0x6f, 0x33,
0x80, 0xc6, 0xd3, 0x09, 0xf4, 0x1e, 0x2c, 0x11, 0x91, 0x25, 0x98, 0x7b, 0x5c, 0x50, 0xa6, 0x6e,
0x4b, 0xae, 0x3b, 0xe3, 0x2e, 0x68, 0x72, 0x4f, 0x52, 0x0f, 0xc3, 0x8a, 0xc5, 0x99, 0xae, 0x5a,
0x1c, 0xf4, 0x15, 0xcc, 0xd1, 0x54, 0x9f, 0xf8, 0x4c, 0x35, 0xc9, 0x1f, 0x5f, 0xf6, 0x58, 0x43,
0x5d, 0x3b, 0x47, 0x7e, 0x5c, 0xec, 0x27, 0xe4, 0x4c, 0x26, 0x9a, 0x19, 0x8b, 0xcc, 0x6d, 0xb7,
0x2c, 0xed, 0x15, 0x8b, 0xe4, 0x43, 0xd4, 0xaa, 0x1f, 0xe3, 0x44, 0x78, 0x67, 0x91, 0x7f, 0xce,
0x55, 0x3d, 0x61, 0xc6, 0x9a, 0x04, 0x49, 0x7f, 0x26, 0xc9, 0xe8, 0x18, 0x16, 0x46, 0x83, 0xca,
0xd9, 0x6a, 0x50, 0x39, 0xbe, 0xa5, 0x91, 0x88, 0xd1, 0x1d, 0x9d, 0x8f, 0x9e, 0x01, 0x94, 0x82,
0xc5, 0xb9, 0x2b, 0xbc, 0x5f, 0x6d, 0x30, 0xe8, 0x96, 0x66, 0xa2, 0xcf, 0xe0, 0x46, 0xd0, 0xf7,
0x93, 0x73, 0xec, 0x95, 0x3e, 0x85, 0x4b, 0x07, 0xac, 0x2a, 0x02, 0x4d, 0x77, 0x4d, 0xb3, 0x8f,
0x72, 0x6e, 0x4f, 0x32, 0x9d, 0x7d, 0xd8, 0xb8, 0xf2, 0x10, 0xd1, 0x3d, 0x58, 0x4a, 0x33, 0x16,
0xf4, 0x65, 0x8a, 0x1f, 0x63, 0xd1, 0xa7, 0xf6, 0x0a, 0x17, 0x2d, 0xf9, 0x48, 0x51, 0x9d, 0x3b,
0xb0, 0xf3, 0x86, 0xef, 0x76, 0xb6, 0xe1, 0xe6, 0xa4, 0x8f, 0x71, 0x7e, 0x6e, 0xe4, 0x80, 0x7a,
0x5f, 0xfe, 0x00, 0xe6, 0xed, 0xa5, 0xa9, 0x5d, 0x8c, 0x64, 0x05, 0x47, 0x86, 0xe3, 0xe6, 0x98,
0xb1, 0x8b, 0x9f, 0x1e, 0xbf, 0xf8, 0x5f, 0xc3, 0x66, 0x19, 0xe2, 0xa5, 0x24, 0x51, 0x6e, 0x2b,
0xc0, 0x4c, 0xc8, 0xd7, 0x36, 0x73, 0xbf, 0xed, 0xde, 0x28, 0x4d, 0x38, 0xd1, 0xfc, 0x3d, 0xc9,
0x46, 0x87, 0x70, 0xc7, 0xe2, 0x19, 0x1e, 0x50, 0x9b, 0x72, 0xf4, 0x71, 0x70, 0xe1, 0x49, 0x57,
0x4c, 0x18, 0xd6, 0xb6, 0x65, 0xde, 0xdd, 0x36, 0x40, 0x37, 0xc7, 0xed, 0x49, 0x98, 0x6b, 0x50,
0xce, 0x21, 0xcc, 0xdb, 0x0f, 0x40, 0x5f, 0xc1, 0x62, 0xbe, 0x27, 0x22, 0x70, 0xac, 0xdd, 0xcc,
0x48, 0xe2, 0x65, 0xb1, 0x87, 0x02, 0xc7, 0xee, 0x42, 0x5c, 0x1a, 0x71, 0xe7, 0x1c, 0xda, 0x65,
0x36, 0xba, 0x07, 0xb3, 0x3e, 0xe7, 0x58, 0x58, 0x31, 0x4b, 0xa5, 0x38, 0x50, 0xd2, 0x5d, 0xc3,
0x56, 0xc7, 0x8b, 0x85, 0x2f, 0xbd, 0x80, 0xa9, 0x24, 0x96, 0x8f, 0xd7, 0x70, 0xdc, 0x1c, 0xe3,
0xfc, 0x43, 0x03, 0xae, 0x2b, 0x09, 0xd2, 0x49, 0x5f, 0x90, 0x24, 0x77, 0xd2, 0xf2, 0x37, 0xda,
0x80, 0xf9, 0x38, 0x7c, 0xec, 0x71, 0xf2, 0xa3, 0x76, 0x5c, 0x33, 0xee, 0x5c, 0x1c, 0x3e, 0xee,
0x91, 0x1f, 0x95, 0x4f, 0x8f, 0xc3, 0xc7, 0xfa, 0x78, 0x9b, 0xae, 0xfa, 0x2d, 0x3d, 0x53, 0xa1,
0x9b, 0xf2, 0x27, 0xda, 0x81, 0x16, 0xef, 0xfb, 0x8f, 0x1e, 0x7f, 0xa6, 0x65, 0x68, 0x75, 0x04,
0x4d, 0x52, 0x62, 0xba, 0x30, 0xa7, 0x47, 0xbc, 0x3b, 0xab, 0xfd, 0xb0, 0x19, 0x3a, 0xff, 0xd3,
0x80, 0x79, 0xbb, 0x61, 0xf4, 0x0b, 0x58, 0x3e, 0xcd, 0x92, 0x30, 0x92, 0xf6, 0xa7, 0x12, 0xd6,
0x74, 0x34, 0xe3, 0xb0, 0x30, 0x35, 0xef, 0xc2, 0xa2, 0x01, 0x0f, 0x30, 0xe3, 0xd6, 0xb6, 0x36,
0xdd, 0x05, 0x4d, 0x7d, 0xad, 0x89, 0xe8, 0x03, 0xb8, 0xae, 0x6f, 0x66, 0x46, 0x1d, 0x69, 0xa9,
0xb8, 0xf3, 0x44, 0x4b, 0x4c, 0xce, 0xa8, 0xab, 0x21, 0xf9, 0xe1, 0x5c, 0x2b, 0x1d, 0xce, 0x26,
0xcc, 0xf3, 0xec, 0x54, 0x10, 0x61, 0xea, 0x96, 0xd2, 0x31, 0x99, 0x31, 0x5a, 0x85, 0xeb, 0x9a,
0x31, 0xab, 0x18, 0x7a, 0x80, 0x1c, 0x58, 0x90, 0xc7, 0xe0, 0x91, 0xc4, 0x3b, 0x1d, 0x5a, 0x43,
0x31, 0xe3, 0xb6, 0x24, 0xf1, 0x30, 0x79, 0x22, 0x49, 0xce, 0x1f, 0x00, 0x8a, 0xe5, 0xff, 0x2f,
0xbe, 0xdb, 0xf9, 0x2b, 0x58, 0xa9, 0x29, 0xc6, 0xbc, 0x29, 0x64, 0x94, 0x56, 0xa4, 0x5a, 0xe4,
0xd1, 0xe2, 0x17, 0xd9, 0x88, 0x20, 0xe7, 0x57, 0xb0, 0x5e, 0x5f, 0x94, 0x79, 0x73, 0x5c, 0xe7,
0x7c, 0x02, 0xcb, 0x63, 0x85, 0x97, 0x37, 0x06, 0xb3, 0xdf, 0xc2, 0x52, 0xa5, 0xc0, 0x82, 0x6e,
0x01, 0x98, 0x62, 0x8c, 0x97, 0xc7, 0x9d, 0x4d, 0x43, 0x39, 0x0c, 0xe5, 0x49, 0xa9, 0xfa, 0x8b,
0x56, 0xf6, 0xc2, 0xac, 0x2c, 0x14, 0xd4, 0x57, 0x2c, 0x72, 0xbe, 0x80, 0xd5, 0xba, 0x62, 0xcb,
0x5b, 0x7c, 0xc7, 0x3f, 0x5f, 0x83, 0xd5, 0xba, 0x42, 0x1a, 0x7a, 0x0e, 0x77, 0xf9, 0x05, 0x49,
0xbd, 0x94, 0x91, 0xd8, 0x67, 0x26, 0xec, 0xf2, 0xf2, 0xd2, 0x1c, 0xc3, 0xda, 0x1f, 0xe9, 0xa0,
0x64, 0x47, 0x42, 0x4f, 0x34, 0x52, 0x45, 0x60, 0x56, 0xa4, 0x81, 0xa1, 0xd7, 0xf0, 0xbe, 0xcc,
0x64, 0xea, 0x85, 0xf9, 0xdc, 0x63, 0xf8, 0x3c, 0x8b, 0x7c, 0xa6, 0x6b, 0x98, 0x3a, 0xc0, 0xb8,
0xcb, 0xb1, 0xa8, 0x11, 0xb9, 0xcb, 0x5d, 0x8d, 0x55, 0x91, 0x4b, 0x0f, 0xee, 0x85, 0x34, 0x31,
0x39, 0x78, 0x4a, 0xd3, 0x2c, 0x92, 0xe9, 0xa3, 0x5d, 0xc6, 0x2e, 0x40, 0x92, 0x33, 0x6a, 0x4c,
0xa3, 0x23, 0xe1, 0x32, 0xe3, 0x3e, 0x31, 0x60, 0xb3, 0x84, 0x91, 0xae, 0xde, 0xf2, 0x2f, 0x61,
0x43, 0x45, 0xd1, 0xb5, 0x62, 0xae, 0xeb, 0xc0, 0x53, 0x02, 0xea, 0xa7, 0x56, 0x67, 0x9d, 0x65,
0x51, 0xa4, 0x83, 0x4d, 0xad, 0x62, 0xeb, 0xe9, 0xc8, 0xb4, 0x67, 0x59, 0x14, 0xa9, 0x98, 0xb3,
0x66, 0xaa, 0x2a, 0x10, 0xab, 0xa9, 0x73, 0x75, 0x53, 0xe5, 0x09, 0xa8, 0xa9, 0xdf, 0xc1, 0x86,
0x3a, 0x00, 0x73, 0xac, 0xaa, 0x14, 0x61, 0x64, 0x58, 0xa3, 0x51, 0xaa, 0x73, 0xc8, 0xaf, 0xd7,
0x27, 0x2a, 0x81, 0x46, 0x16, 0x77, 0xd7, 0xfd, 0x5a, 0xba, 0xf3, 0x77, 0x0d, 0x58, 0xaf, 0x9f,
0x22, 0x1f, 0x2f, 0xef, 0x53, 0x26, 0xca, 0xb1, 0x74, 0x53, 0x51, 0xd4, 0xb6, 0xb6, 0xa0, 0x59,
0x7c, 0xfc, 0xb4, 0x89, 0xe2, 0xec, 0xe7, 0xde, 0x85, 0x05, 0x1b, 0x01, 0x7b, 0x7d, 0x9f, 0xf7,
0x55, 0xb0, 0xd5, 0x76, 0xdb, 0x96, 0x78, 0xe0, 0xf3, 0x3e, 0x5a, 0x87, 0xd9, 0x3e, 0x09, 0x43,
0x9c, 0x98, 0xdb, 0x33, 0x23, 0x87, 0x41, 0xbb, 0x5c, 0x0d, 0x7c, 0xeb, 0xd8, 0x6f, 0x0b, 0x9a,
0xaa, 0x3c, 0x58, 0xd2, 0xa4, 0x79, 0x45, 0x90, 0xde, 0xf9, 0x16, 0x80, 0x66, 0xaa, 0x1e, 0x98,
0x8e, 0x3a, 0x35, 0xfc, 0xe5, 0x30, 0xc5, 0xce, 0x10, 0x5a, 0xa5, 0x1a, 0x62, 0x05, 0xdd, 0xa8,
0xa0, 0xeb, 0x76, 0x34, 0x5d, 0xb7, 0x23, 0x79, 0x0c, 0xd2, 0xdc, 0x71, 0x21, 0x03, 0x28, 0x12,
0x9a, 0x75, 0xdb, 0x05, 0xf1, 0x30, 0x74, 0x7e, 0x09, 0xf3, 0xb6, 0x0c, 0x89, 0x3e, 0x2a, 0x15,
0x2b, 0xb5, 0x8b, 0x5d, 0x1e, 0x2b, 0x56, 0x16, 0x95, 0x4a, 0xe7, 0xe7, 0x79, 0x98, 0x33, 0x54,
0xe9, 0x1b, 0xa4, 0x93, 0xb0, 0x8e, 0x53, 0xfe, 0x46, 0x5f, 0xe6, 0xdd, 0x9c, 0xfc, 0x96, 0x6a,
0x9a, 0x42, 0xf2, 0xc6, 0xac, 0x6c, 0xd3, 0xd2, 0x51, 0x97, 0xf8, 0x18, 0xe6, 0xfb, 0x94, 0x0b,
0x35, 0x75, 0xa6, 0x5a, 0x97, 0x38, 0x30, 0x9c, 0x7c, 0x53, 0x16, 0x8a, 0x9e, 0xc0, 0xc2, 0x80,
0xca, 0x35, 0x19, 0xf5, 0x63, 0x92, 0x9c, 0x9b, 0xb6, 0x5d, 0xa9, 0xc6, 0xf7, 0x5a, 0xb2, 0x5d,
0xcd, 0xb5, 0xf3, 0xdb, 0x83, 0x12, 0x11, 0x7d, 0x03, 0x1d, 0x79, 0x46, 0x34, 0xf1, 0x23, 0xaf,
0x4f, 0x05, 0x4f, 0xa9, 0x30, 0x4d, 0xb9, 0xd2, 0x53, 0x3f, 0x31, 0x88, 0x03, 0x0d, 0xb0, 0x92,
0x96, 0xd2, 0x51, 0x3a, 0xfa, 0x02, 0x9a, 0x97, 0x7e, 0x14, 0xa5, 0x7e, 0x8a, 0x99, 0x09, 0xb1,
0x4b, 0x75, 0xb6, 0x6f, 0x2d, 0xcb, 0xce, 0x2f, 0xc0, 0xe8, 0x2f, 0xa0, 0xad, 0x12, 0x59, 0xfb,
0x25, 0x73, 0xd5, 0x8a, 0x8a, 0xcc, 0x66, 0x2b, 0x1f, 0xd2, 0x0a, 0x0b, 0x9a, 0x5c, 0xfa, 0x34,
0xca, 0xb0, 0xa0, 0x54, 0xf4, 0x4d, 0x33, 0xad, 0xb4, 0xf4, 0x13, 0xcb, 0xca, 0x97, 0xce, 0xc1,
0xe8, 0xf7, 0xb0, 0x7e, 0x45, 0x0d, 0xb8, 0x59, 0x0d, 0xeb, 0x6b, 0x43, 0x60, 0x2b, 0x72, 0xcd,
0xaf, 0x2d, 0xfd, 0x7e, 0x09, 0xad, 0x38, 0x8c, 0x3d, 0x9b, 0x0b, 0x41, 0xf5, 0x65, 0x1c, 0xed,
0x1f, 0x99, 0xb8, 0x3d, 0x7f, 0x19, 0x71, 0x18, 0xdb, 0x50, 0x1e, 0xc3, 0xa6, 0x6d, 0xf3, 0xa9,
0x52, 0x93, 0x77, 0xce, 0xfc, 0x00, 0x7b, 0x29, 0x66, 0x84, 0x86, 0xa6, 0xef, 0x76, 0xbf, 0x74,
0x51, 0x06, 0xfb, 0x9c, 0x06, 0x17, 0xbf, 0x91, 0xc8, 0x13, 0x05, 0xb4, 0x92, 0x6f, 0xa4, 0xf5,
0x7c, 0xf4, 0x1d, 0xac, 0xc7, 0xfe, 0x0f, 0x24, 0xce, 0x62, 0x99, 0x2b, 0x2b, 0xc7, 0xa6, 0xac,
0xa6, 0x6d, 0xca, 0xbd, 0x5b, 0x8e, 0x62, 0x15, 0xce, 0x35, 0x30, 0x69, 0x3c, 0xf3, 0x9d, 0xaf,
0xc6, 0x35, 0x4c, 0xf4, 0x3b, 0x58, 0x0b, 0x89, 0x7f, 0x9e, 0x50, 0x2e, 0x48, 0xe0, 0xf1, 0xec,
0x34, 0x26, 0x5c, 0x45, 0x2b, 0x0b, 0x55, 0xd9, 0xfb, 0x39, 0xac, 0x97, 0xa3, 0x72, 0xd9, 0x61,
0x0d, 0x53, 0xaa, 0x80, 0x9f, 0xa6, 0x9e, 0x9f, 0xf8, 0xd1, 0x50, 0x90, 0x80, 0x9b, 0xc6, 0xdd,
0x68, 0x1f, 0x6a, 0xd7, 0x72, 0x73, 0x15, 0xf0, 0x4b, 0x44, 0x74, 0x06, 0x1b, 0x57, 0x77, 0x1f,
0x96, 0xaa, 0x89, 0xe2, 0x55, 0x99, 0x92, 0x95, 0xdd, 0xf5, 0xaf, 0x6a, 0x3a, 0x7c, 0x06, 0x4d,
0x41, 0x62, 0xec, 0xfd, 0x48, 0x13, 0x6c, 0x3a, 0x7b, 0x25, 0x35, 0x7f, 0x49, 0x62, 0xfc, 0x3b,
0x9a, 0x14, 0x6a, 0x2e, 0x0c, 0xc1, 0x79, 0x08, 0x2b, 0x35, 0x7a, 0x2c, 0x23, 0x69, 0xdd, 0x44,
0x0c, 0x4d, 0xf4, 0x60, 0x87, 0xce, 0x23, 0x58, 0xaf, 0xd7, 0xd8, 0x09, 0x73, 0xfe, 0x1c, 0x3a,
0x55, 0xfd, 0x94, 0x41, 0x2d, 0x89, 0x6d, 0xe1, 0xa1, 0xed, 0xea, 0x81, 0xa4, 0x5e, 0xf6, 0x31,
0xb3, 0x09, 0x82, 0x1e, 0x38, 0x0f, 0x00, 0x8d, 0xab, 0xe8, 0x84, 0xf5, 0x3e, 0x84, 0x4e, 0x55,
0x29, 0x27, 0xa0, 0xff, 0xbe, 0x01, 0x37, 0x27, 0x29, 0xdf, 0x1b, 0x83, 0xd9, 0xd7, 0x57, 0x2a,
0xb9, 0x36, 0xd5, 0x3b, 0x6f, 0x50, 0xf2, 0x2b, 0xb4, 0xdb, 0xf9, 0xeb, 0x06, 0xec, 0xbc, 0xe1,
0x45, 0xbc, 0x71, 0x6f, 0x4f, 0xe0, 0xd6, 0xc8, 0x9b, 0xf3, 0x42, 0x5d, 0x8f, 0x92, 0x21, 0x4c,
0x9e, 0xd7, 0xb5, 0xdd, 0xad, 0x11, 0xd0, 0x7e, 0x8e, 0x91, 0xc7, 0xee, 0x3c, 0x82, 0xb5, 0xfa,
0xce, 0xd3, 0x06, 0xcc, 0x0f, 0xd2, 0xa4, 0xfc, 0x5f, 0x97, 0xb9, 0x41, 0x9a, 0xbc, 0xca, 0x48,
0xe8, 0x7c, 0x6a, 0xeb, 0xa4, 0x25, 0xb7, 0x24, 0x13, 0xb8, 0xb2, 0x23, 0x33, 0xbb, 0x2d, 0x7c,
0x95, 0xf3, 0x00, 0x96, 0x2a, 0x4f, 0x55, 0x86, 0x03, 0xc5, 0xc3, 0x36, 0x85, 0xaf, 0xfc, 0xf5,
0x7e, 0x04, 0x4b, 0x15, 0x0f, 0x26, 0x13, 0xa9, 0xdc, 0xdd, 0x19, 0xb8, 0x1d, 0x3b, 0xbf, 0x85,
0xe5, 0x31, 0x8b, 0x88, 0x1e, 0x8f, 0xda, 0xd0, 0x46, 0xb5, 0x39, 0x5f, 0xcc, 0x28, 0x1b, 0x4f,
0xe7, 0x6f, 0xa7, 0x01, 0x0a, 0x16, 0x7a, 0x0d, 0xf7, 0x55, 0xb7, 0xc4, 0x74, 0x97, 0xa5, 0x35,
0x55, 0x45, 0x4f, 0x1c, 0x7a, 0x97, 0x7d, 0x12, 0x61, 0x8f, 0x67, 0x29, 0x66, 0x03, 0xc2, 0xf3,
0xf7, 0xf7, 0x4e, 0x81, 0x97, 0x16, 0x73, 0x57, 0xa3, 0xbf, 0x95, 0xe0, 0x5e, 0x8e, 0x45, 0x9f,
0xc1, 0x8d, 0x4a, 0xa7, 0xc2, 0xca, 0x35, 0x21, 0xf8, 0xda, 0xe9, 0x48, 0x3f, 0xc2, 0x88, 0x41,
0xdf, 0xc3, 0xe7, 0x29, 0xa3, 0x71, 0x6a, 0x02, 0x54, 0x41, 0xf5, 0xb4, 0x6a, 0xdb, 0xc3, 0x3b,
0xa3, 0x4c, 0x06, 0xe6, 0x7d, 0xf9, 0x60, 0x4c, 0xbb, 0x45, 0x97, 0x6d, 0x3f, 0xd6, 0xd3, 0xa5,
0x95, 0x7d, 0x49, 0x95, 0xd4, 0xd1, 0xc6, 0xc7, 0x33, 0xca, 0x76, 0x47, 0xe6, 0x39, 0xbf, 0x87,
0xed, 0xc9, 0x2e, 0x02, 0xfd, 0x7a, 0xa2, 0xc3, 0xd1, 0xd1, 0xe0, 0x55, 0x6e, 0xc4, 0xe9, 0xc1,
0xd6, 0x04, 0xf7, 0x80, 0x3e, 0xbd, 0xd2, 0xcb, 0x68, 0xb9, 0xb5, 0xee, 0xc3, 0xf9, 0x1c, 0xb6,
0x26, 0xf8, 0x85, 0x09, 0x46, 0xe3, 0xa1, 0xca, 0x7b, 0xab, 0xc6, 0x7f, 0xc2, 0x84, 0x3d, 0xd8,
0x79, 0x43, 0x6f, 0xf9, 0x2d, 0x32, 0xc1, 0xaf, 0xe1, 0xe6, 0xa4, 0x56, 0xf1, 0x5b, 0x48, 0x38,
0x87, 0xcd, 0xab, 0xdb, 0xbf, 0x6f, 0xd1, 0x2b, 0xb9, 0x07, 0x4b, 0xe6, 0xaf, 0x2c, 0x79, 0x7f,
0x59, 0xbf, 0xc3, 0x45, 0x4d, 0xb6, 0xa2, 0x9c, 0xff, 0x68, 0xc0, 0x4a, 0x4d, 0x17, 0x18, 0xbd,
0x0f, 0x9d, 0x20, 0x63, 0x4c, 0x5e, 0x4f, 0x5e, 0x6d, 0x37, 0x15, 0x7e, 0x43, 0xcf, 0xa1, 0x77,
0xa0, 0x9d, 0xe0, 0xcb, 0x02, 0x66, 0xaa, 0x75, 0x09, 0xbe, 0xcc, 0x21, 0x3b, 0xd0, 0xd2, 0xef,
0x9a, 0x32, 0x1a, 0x73, 0xf3, 0x74, 0x41, 0x91, 0x8e, 0x25, 0x05, 0x3d, 0x85, 0x1d, 0xfb, 0x97,
0x22, 0x53, 0x80, 0xe3, 0x5e, 0x82, 0xc5, 0x25, 0x65, 0x17, 0x9e, 0xc0, 0xa2, 0x8f, 0x99, 0x49,
0x5b, 0x6e, 0x1a, 0x98, 0x29, 0xc0, 0xf1, 0x17, 0x1a, 0xf4, 0x52, 0x61, 0x9c, 0x4f, 0x61, 0xbd,
0xbe, 0xf5, 0x3c, 0xd2, 0x35, 0x68, 0x54, 0xba, 0x06, 0x7f, 0x6c, 0xc0, 0x52, 0xa5, 0xf3, 0xf7,
0xff, 0xf4, 0xfb, 0x3f, 0x06, 0x34, 0xde, 0x76, 0x9c, 0xf8, 0xed, 0xc7, 0xb0, 0x5a, 0xd7, 0x4f,
0x97, 0x09, 0xce, 0x79, 0xa9, 0x7d, 0x27, 0x7f, 0x8f, 0xe7, 0x99, 0xd3, 0xe3, 0x79, 0xa6, 0x0c,
0x22, 0xaa, 0xbd, 0x6f, 0xf4, 0x01, 0xcc, 0xe9, 0x66, 0xb9, 0xcd, 0xb3, 0x3a, 0xa5, 0xff, 0x66,
0x29, 0x86, 0x6b, 0x01, 0xce, 0x10, 0x66, 0xcd, 0xac, 0x1d, 0x68, 0xa5, 0x8c, 0x86, 0x59, 0xa0,
0x5b, 0xd7, 0xc6, 0x0d, 0x19, 0xd2, 0x37, 0x78, 0xa8, 0x6a, 0xdc, 0x06, 0x30, 0x5a, 0xfc, 0x5a,
0x34, 0x64, 0x5b, 0xf5, 0x53, 0xa5, 0x1f, 0xf3, 0xcf, 0xaa, 0x20, 0x37, 0x9e, 0xaa, 0xf4, 0xa3,
0xcb, 0xda, 0x8a, 0xe8, 0x7c, 0x08, 0xab, 0x75, 0x6d, 0x7b, 0x19, 0xed, 0xa8, 0x0e, 0x8d, 0xb1,
0x15, 0x7a, 0xe0, 0x3c, 0x07, 0x34, 0xde, 0x8e, 0x97, 0x8e, 0xe0, 0x8c, 0x44, 0x02, 0xb3, 0xa2,
0x8f, 0xef, 0xa5, 0x94, 0x24, 0xc2, 0xaa, 0xe9, 0x9a, 0x66, 0xe7, 0x53, 0x4e, 0x14, 0xd3, 0xf9,
0x53, 0x03, 0xd0, 0x78, 0x2f, 0x5e, 0xba, 0xee, 0x0b, 0x3c, 0x2c, 0x27, 0xc6, 0x73, 0x17, 0x78,
0xa8, 0xd2, 0xe2, 0x7d, 0xe8, 0x14, 0xbd, 0x7d, 0xdd, 0x98, 0x34, 0x81, 0x4c, 0x29, 0xa2, 0xcc,
0x85, 0xe9, 0x9e, 0x96, 0xbb, 0x94, 0x4f, 0xd1, 0x04, 0x79, 0x86, 0xf2, 0xf1, 0x06, 0x98, 0x49,
0xd3, 0x11, 0xf8, 0xa6, 0x49, 0xd4, 0x76, 0x17, 0x13, 0x7c, 0xb9, 0x57, 0x50, 0xd1, 0xd7, 0x70,
0x93, 0xe1, 0x34, 0x1a, 0x7a, 0x38, 0x09, 0xd8, 0xd0, 0x14, 0x04, 0x4b, 0xb3, 0xae, 0xa9, 0x59,
0x9b, 0x0a, 0xf3, 0x34, 0x87, 0x94, 0x24, 0x38, 0xff, 0xd4, 0x80, 0xa5, 0xca, 0x7e, 0x26, 0x3d,
0x4d, 0xdd, 0xe1, 0x94, 0xae, 0x17, 0xcb, 0xfb, 0xf7, 0xf0, 0x0f, 0x29, 0x65, 0xc2, 0xbc, 0xb9,
0x8e, 0xe1, 0x7c, 0x83, 0x87, 0x4f, 0x15, 0x1d, 0x7d, 0x05, 0x5b, 0xe3, 0xe8, 0x42, 0x29, 0xf5,
0x85, 0x77, 0xab, 0xd3, 0xec, 0x7b, 0x77, 0xbe, 0x84, 0xe5, 0xb1, 0x7f, 0x12, 0xc8, 0xc3, 0xa9,
0xfe, 0xff, 0x40, 0x6f, 0x72, 0x71, 0xd4, 0x9b, 0x3b, 0xff, 0xd5, 0x80, 0x05, 0x17, 0xf3, 0x2c,
0x12, 0xf6, 0x3f, 0xc6, 0x08, 0xae, 0x65, 0x61, 0xa9, 0xfd, 0x1d, 0x92, 0xf1, 0xff, 0x1d, 0x4f,
0x8f, 0xff, 0xef, 0xf8, 0x31, 0xb4, 0x30, 0x63, 0x94, 0x79, 0x41, 0xdf, 0x27, 0xc9, 0x78, 0x95,
0xfa, 0xa9, 0x64, 0xee, 0x49, 0x9e, 0x0b, 0x38, 0xff, 0xed, 0xf4, 0x60, 0xb6, 0x27, 0x7c, 0x91,
0x71, 0xd4, 0x81, 0xf6, 0x6e, 0x70, 0x91, 0xd0, 0xcb, 0x08, 0x87, 0xe7, 0x38, 0xec, 0x4c, 0xa1,
0x26, 0x5c, 0x57, 0xb3, 0x3a, 0x0d, 0xb4, 0x0e, 0xc8, 0xfc, 0x4f, 0xf9, 0x99, 0x6a, 0x8a, 0x6b,
0xfa, 0x34, 0x9a, 0x87, 0x6b, 0x87, 0x61, 0x84, 0x3b, 0x33, 0x08, 0x60, 0xf6, 0x05, 0x15, 0x2f,
0xe8, 0x65, 0xe7, 0x9a, 0xf3, 0xaf, 0x0d, 0x80, 0x62, 0x3d, 0xf4, 0x09, 0xac, 0x45, 0x34, 0xf0,
0x23, 0xf2, 0x23, 0x0e, 0xbd, 0x10, 0xf3, 0x80, 0x91, 0x34, 0xaf, 0x5b, 0x36, 0xdd, 0xd5, 0x9c,
0xb9, 0x5f, 0xf0, 0xa4, 0xbb, 0xcf, 0xb8, 0x87, 0x93, 0xf3, 0x88, 0xf0, 0xfe, 0xc8, 0x2c, 0xfd,
0xf1, 0xab, 0x19, 0x7f, 0xaa, 0x99, 0xe5, 0x59, 0x77, 0xa0, 0xad, 0x4f, 0x21, 0xa4, 0xb1, 0x3e,
0x06, 0x75, 0x50, 0x8a, 0xb6, 0xaf, 0x48, 0xe8, 0x16, 0x80, 0x39, 0x28, 0x1a, 0xea, 0xc7, 0x77,
0xdd, 0x6d, 0xea, 0x13, 0xa1, 0x21, 0x7e, 0xd2, 0xf9, 0xf7, 0x9f, 0xb6, 0x1b, 0xff, 0xf9, 0xd3,
0x76, 0xe3, 0x4f, 0x3f, 0x6d, 0x37, 0xfe, 0xf1, 0xbf, 0xb7, 0xa7, 0x4e, 0x67, 0xd5, 0x01, 0x7e,
0xf2, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x86, 0xd1, 0xeb, 0x2d, 0x24, 0x2e, 0x00, 0x00,
}
func (m *CommandPayload) Marshal() (dAtA []byte, err error) {
@@ -8151,6 +8171,26 @@ func (m *MDMOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.PromptUserToAllowBootstrapTokenForAuthentication {
i--
if m.PromptUserToAllowBootstrapTokenForAuthentication {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x18
}
if m.BootstrapTokenAllowed {
i--
if m.BootstrapTokenAllowed {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x10
}
if m.ActivationLockAllowedWhileSupervised {
i--
if m.ActivationLockAllowedWhileSupervised {
@@ -10590,6 +10630,12 @@ func (m *MDMOptions) Size() (n int) {
if m.ActivationLockAllowedWhileSupervised {
n += 2
}
if m.BootstrapTokenAllowed {
n += 2
}
if m.PromptUserToAllowBootstrapTokenForAuthentication {
n += 2
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -18394,6 +18440,46 @@ func (m *MDMOptions) Unmarshal(dAtA []byte) error {
}
}
m.ActivationLockAllowedWhileSupervised = bool(v != 0)
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field BootstrapTokenAllowed", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowMdm
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.BootstrapTokenAllowed = bool(v != 0)
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field PromptUserToAllowBootstrapTokenForAuthentication", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowMdm
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.PromptUserToAllowBootstrapTokenForAuthentication = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipMdm(dAtA[iNdEx:])

View File

@@ -329,6 +329,8 @@ message MDMOptionsSetting {
message MDMOptions {
bool activation_lock_allowed_while_supervised = 1;
bool bootstrap_token_allowed = 2;
bool prompt_user_to_allow_bootstrap_token_for_authentication = 3;
}
message PasscodeLockGracePeriodSetting {
@@ -422,7 +424,6 @@ message SetBootstrapToken {
string bootstrap_token = 1;
}
message ResultPayload {
enum Status {
Acknowledged = 0;

View File

@@ -367,15 +367,6 @@ func (c *Command) MarshalJSON() ([]byte, error) {
RotateFileVaultKey: c.RotateFileVaultKey,
}
return json.Marshal(&x)
case "SetBootstrapToken":
var x = struct {
RequestType string `json:"request_type"`
*SetBootstrapToken
}{
RequestType: c.RequestType,
SetBootstrapToken: c.SetBootstrapToken,
}
return json.Marshal(&x)
default:
return nil, fmt.Errorf("mdm: unknown RequestType: %s", c.RequestType)
}

View File

@@ -343,14 +343,6 @@ func (c *Command) MarshalPlist() (interface{}, error) {
RequestType: c.RequestType,
RotateFileVaultKey: c.RotateFileVaultKey,
}, nil
case "SetBootstrapToken":
return &struct {
RequestType string
*SetBootstrapToken
}{
RequestType: c.RequestType,
SetBootstrapToken: c.SetBootstrapToken,
}, nil
default:
return nil, fmt.Errorf("mdm: unknown command RequestType, %s", c.RequestType)
}

View File

@@ -341,12 +341,6 @@ func commandToProto(cmd *Command) (*mdmproto.Command, error) {
RequestRequiresNetworkTether: cmd.SetRecoveryLock.RequestRequiresNetworkTether,
},
}
case "SetBootstrapToken":
cmdproto.Request = &mdmproto.Command_SetBootstrapToken{
SetBootstrapToken: &mdmproto.SetBootstrapToken{
BootstrapToken: cmd.SetBootstrapToken.BootstrapToken,
},
}
case "VerifyFirmwarePassword":
cmdproto.Request = &mdmproto.Command_VerifyFirmwarePassword{
VerifyFirmwarePassword: &mdmproto.VerifyFirmwarePassword{
@@ -466,6 +460,12 @@ func settingToProto(s Setting) *mdmproto.Setting {
if v, ok := s.MDMOptions["ActivationLockAllowedWhileSupervised"]; ok {
options.ActivationLockAllowedWhileSupervised = v.(bool)
}
if v, ok := s.MDMOptions["BootstrapTokenAllowed"]; ok {
options.BootstrapTokenAllowed = v.(bool)
}
if v, ok := s.MDMOptions["PromptUserToAllowBootstrapTokenForAuthentication"]; ok {
options.PromptUserToAllowBootstrapTokenForAuthentication = v.(bool)
}
pbs.MdmOptions = &mdmproto.MDMOptionsSetting{
MdmOptions: options,
}

View File

@@ -313,13 +313,6 @@ func (c *Command) UnmarshalJSON(data []byte) error {
}
c.RotateFileVaultKey = &payload
return nil
case "SetBootstrapToken":
var payload SetBootstrapToken
if err := json.Unmarshal(data, &payload); err != nil {
return errors.Wrapf(err, "mdm: unmarshal %s command json", c.RequestType)
}
c.SetBootstrapToken = &payload
return nil
default:
return fmt.Errorf("mdm: unknown RequestType: %s", c.RequestType)
}

View File

@@ -297,13 +297,6 @@ func (c *Command) UnmarshalPlist(unmarshal func(i interface{}) error) error {
}
c.RotateFileVaultKey = &payload
return nil
case "SetBootstrapToken":
var payload SetBootstrapToken
if err := unmarshal(&payload); err != nil {
return errors.Wrapf(err, "mdm: unmarshal %s command plist", requestType.RequestType)
}
c.SetBootstrapToken = &payload
return nil
default:
return fmt.Errorf("mdm: unknown RequestType: %s", requestType.RequestType)
}

View File

@@ -301,11 +301,6 @@ func protoToCommand(pb *mdmproto.Command) *Command {
AllowOroms: pbc.GetAllowOroms(),
RequestRequiresNetworkTether: pbc.GetRequestRequiresNetworkTether(),
}
case "SetBootstrapToken":
pbc := pb.GetSetBootstrapToken()
cmd.SetBootstrapToken = &SetBootstrapToken{
BootstrapToken: pbc.GetBootstrapToken(),
}
case "SetRecoveryLock":
pbc := pb.GetSetRecoveryLock()
cmd.SetRecoveryLock = &SetRecoveryLock{
@@ -415,9 +410,13 @@ func protoToSetting(s *mdmproto.Setting) Setting {
case "MDMOptions":
pbs := s.GetMdmOptions()
activationLockAllowed := pbs.GetMdmOptions().GetActivationLockAllowedWhileSupervised()
bootstrapTokenAllowed := pbs.GetMdmOptions().GetBootstrapTokenAllowed()
promptUserToAllowBootstrapToken := pbs.GetMdmOptions().GetPromptUserToAllowBootstrapTokenForAuthentication()
setting.MDMOptions = map[string]interface {
}{
"ActivationLockAllowedWhileSupervised": activationLockAllowed,
"ActivationLockAllowedWhileSupervised": activationLockAllowed,
"BootstrapTokenAllowed": bootstrapTokenAllowed,
"PromptUserToAllowBootstrapTokenForAuthentication": promptUserToAllowBootstrapToken,
}
case "PasscodeLockGracePeriod":
pbs := s.GetPasscodeLockGracePeriod()

View File

@@ -21,12 +21,20 @@ type Service interface {
type Middleware func(Service) Service
const (
ConnectTopic = "mdm.Connect"
AuthenticateTopic = "mdm.Authenticate"
TokenUpdateTopic = "mdm.TokenUpdate"
CheckoutTopic = "mdm.CheckOut"
ConnectTopic = "mdm.Connect"
AuthenticateTopic = "mdm.Authenticate"
TokenUpdateTopic = "mdm.TokenUpdate"
CheckoutTopic = "mdm.CheckOut"
GetBootstrapTokenTopic = "mdm.GetBootstrapToken"
SetBootstrapTokenTopic = "mdm.SetBootstrapToken"
)
// BootBootstrapTokenRetriever retrieves BootStrap Tokens for devices
type BootstrapTokenRetriever interface {
// GetBootstrapToken returns the Bootstrap Token for the device by udid
GetBootstrapToken(ctx context.Context, udid string) ([]byte, error)
}
// Queue is an MDM Command Queue.
type Queue interface {
Next(context.Context, Response) ([]byte, error)
@@ -34,12 +42,14 @@ type Queue interface {
}
type MDMService struct {
dev BootstrapTokenRetriever
pub pubsub.Publisher
queue Queue
}
func NewService(pub pubsub.Publisher, queue Queue) *MDMService {
func NewService(pub pubsub.Publisher, queue Queue, dev BootstrapTokenRetriever) *MDMService {
return &MDMService{
dev: dev,
pub: pub,
queue: queue,
}

View File

@@ -46,6 +46,15 @@ func NewDB(db *bolt.DB) (*DB, error) {
return datastore, nil
}
// GetBootstrapToken returns the Bootstrap Token for the device by udid
func (db *DB) GetBootstrapToken(ctx context.Context, udid string) ([]byte, error) {
d, err := db.DeviceByUDID(ctx, udid)
if err != nil {
return nil, errors.Wrap(err, "lookup device by uuid")
}
return []byte(d.BootstrapToken), nil
}
func (db *DB) List(ctx context.Context, opt device.ListDevicesOption) ([]device.Device, error) {
var devices []device.Device
err := db.View(func(tx *bolt.Tx) error {

View File

@@ -66,6 +66,29 @@ func TestSave(t *testing.T) {
}
func TestGetBootstrapToken(t *testing.T) {
db := setupDB(t)
dev := &device.Device{
UUID: "a-b-c-d",
UDID: "UDID-FOO-BAR-BAZ",
BootstrapToken: "bootstrap",
}
ctx := context.Background()
if err := db.Save(ctx, dev); err != nil {
t.Fatalf("saving device in datastore: %s", err)
}
haveDev, err := db.DeviceByUDID(ctx, dev.UDID)
if err != nil {
t.Fatalf("getting device by UDID: %s", err)
}
if have, want := haveDev.BootstrapToken, dev.BootstrapToken; have != want {
t.Errorf("have %s, want %s", have, want)
}
}
func TestDeleteByUDID(t *testing.T) {
db := setupDB(t)
dev := &device.Device{

View File

@@ -38,6 +38,7 @@ type Device struct {
DEPProfileAssignedDate time.Time `db:"dep_profile_assigned_date"`
DEPProfileAssignedBy string `db:"dep_profile_assigned_by"`
LastSeen time.Time `db:"last_seen"`
BootstrapToken string `db:"bootstrap_token"`
}
// DEPProfileStatus is the status of the DEP Profile
@@ -80,6 +81,7 @@ func MarshalDevice(dev *Device) ([]byte, error) {
DepProfileAssignedDate: timeToNano(dev.DEPProfileAssignedDate),
DepProfileAssignedBy: dev.DEPProfileAssignedBy,
LastSeen: timeToNano(dev.LastSeen),
BootstrapToken: dev.BootstrapToken,
}
return proto.Marshal(&protodev)
}
@@ -115,6 +117,7 @@ func UnmarshalDevice(data []byte, dev *Device) error {
dev.DEPProfileAssignedDate = timeFromNano(pb.GetDepProfileAssignedDate())
dev.DEPProfileAssignedBy = pb.GetDepProfileAssignedBy()
dev.LastSeen = timeFromNano(pb.GetLastSeen())
dev.BootstrapToken = pb.GetBootstrapToken()
return nil
}

View File

@@ -1,6 +1,5 @@
// Code generated by protoc-gen-go.
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: device.proto
// DO NOT EDIT!
/*
Package deviceproto is a generated protocol buffer package.
@@ -58,6 +57,7 @@ type Device struct {
DepProfileAssignedBy string `protobuf:"bytes,27,opt,name=dep_profile_assigned_by,json=depProfileAssignedBy" json:"dep_profile_assigned_by,omitempty"`
LastSeen int64 `protobuf:"varint,28,opt,name=last_seen,json=lastSeen" json:"last_seen,omitempty"`
LastQueryResponse []byte `protobuf:"bytes,29,opt,name=last_query_response,json=lastQueryResponse,proto3" json:"last_query_response,omitempty"`
BootstrapToken string `protobuf:"bytes,30,opt,name=bootstrap_token,json=bootstrapToken" json:"bootstrap_token,omitempty"`
}
func (m *Device) Reset() { *m = Device{} }
@@ -268,6 +268,13 @@ func (m *Device) GetLastQueryResponse() []byte {
return nil
}
func (m *Device) GetBootstrapToken() string {
if m != nil {
return m.BootstrapToken
}
return ""
}
func init() {
proto.RegisterType((*Device)(nil), "deviceproto.Device")
}
@@ -275,40 +282,41 @@ func init() {
func init() { proto.RegisterFile("device.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 557 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x94, 0x41, 0x4f, 0x1b, 0x31,
0x10, 0x85, 0x95, 0x02, 0x21, 0x71, 0x02, 0x0d, 0x26, 0x09, 0x03, 0x14, 0x35, 0x6d, 0x2f, 0x39,
0x54, 0x48, 0x55, 0xc5, 0xa1, 0xc7, 0xb6, 0x5c, 0x8b, 0x68, 0x48, 0x7b, 0xb5, 0x9c, 0xf5, 0xb0,
0x58, 0xac, 0xed, 0xad, 0xed, 0xa5, 0xca, 0x2f, 0xef, 0xb5, 0xf2, 0x38, 0x90, 0xa8, 0xf4, 0xe6,
0xf9, 0xde, 0xbc, 0xf1, 0xcc, 0xac, 0xb5, 0xac, 0xaf, 0xf0, 0x41, 0x17, 0x78, 0x5e, 0x7b, 0x17,
0x1d, 0xef, 0xe5, 0x88, 0x82, 0xb7, 0x7f, 0x76, 0x59, 0xfb, 0x92, 0x62, 0xce, 0xd9, 0x76, 0xd3,
0x68, 0x05, 0xad, 0x49, 0x6b, 0xda, 0x9d, 0xd1, 0x99, 0x98, 0xd2, 0x0a, 0x5e, 0xac, 0x98, 0xd2,
0x8a, 0xbf, 0x63, 0x7b, 0x01, 0xbd, 0x96, 0x95, 0xb0, 0x8d, 0x59, 0xa0, 0x87, 0x2d, 0x12, 0xfb,
0x19, 0x5e, 0x11, 0xe3, 0x67, 0x8c, 0xb9, 0x20, 0x1e, 0xd0, 0x07, 0xed, 0x2c, 0x6c, 0x53, 0x46,
0xd7, 0x85, 0x9f, 0x19, 0xa4, 0x1a, 0x8b, 0x46, 0x57, 0xea, 0x29, 0x63, 0x27, 0xd7, 0x20, 0xf8,
0x98, 0xf4, 0x86, 0xf5, 0x6b, 0xef, 0x54, 0x53, 0x44, 0x61, 0xa5, 0x41, 0x68, 0x53, 0x4e, 0x6f,
0xc5, 0xae, 0xa4, 0xa1, 0x9e, 0xb5, 0x41, 0x0d, 0xbb, 0xb9, 0xbf, 0x74, 0x4e, 0xcc, 0xa0, 0x56,
0xd0, 0xc9, 0x2c, 0x9d, 0xf9, 0x90, 0xed, 0x44, 0x77, 0x8f, 0x16, 0xba, 0x04, 0x73, 0x90, 0x9a,
0xac, 0x9b, 0x70, 0x27, 0x8c, 0x2c, 0x75, 0x01, 0x2c, 0x37, 0x99, 0xc8, 0xb7, 0x04, 0xf8, 0x29,
0xeb, 0x1a, 0x65, 0x44, 0x74, 0xb5, 0x2e, 0xa0, 0x47, 0x6a, 0xc7, 0x28, 0x33, 0x4f, 0x71, 0x6a,
0xae, 0xb1, 0x95, 0x2b, 0xee, 0x45, 0x2e, 0xdc, 0xcf, 0xcd, 0x65, 0x36, 0xa7, 0xf2, 0x27, 0xac,
0x83, 0xd6, 0xbb, 0xaa, 0x42, 0x05, 0x7b, 0x93, 0xd6, 0xb4, 0x33, 0x7b, 0x8a, 0xf9, 0x05, 0x1b,
0xcb, 0xdf, 0x52, 0x47, 0x6d, 0x4b, 0x51, 0x38, 0x7b, 0xab, 0xcb, 0xc6, 0xcb, 0x98, 0x36, 0xb1,
0x4f, 0x99, 0xa3, 0x47, 0xf5, 0xeb, 0xa6, 0xc8, 0x5f, 0xb3, 0xd5, 0xd7, 0xcb, 0x1b, 0x79, 0x49,
0x97, 0xb2, 0x8c, 0x68, 0x21, 0x43, 0xb6, 0x63, 0x9c, 0xc2, 0x0a, 0x06, 0x79, 0x50, 0x0a, 0xd2,
0xa0, 0x74, 0xc8, 0xae, 0x83, 0x3c, 0x28, 0x11, 0x32, 0x4d, 0x52, 0xd5, 0x50, 0x78, 0x5d, 0x53,
0x07, 0x3c, 0x8f, 0xb2, 0x81, 0x52, 0xd9, 0xc2, 0x55, 0xce, 0xc3, 0x61, 0x2e, 0x4b, 0x41, 0x5a,
0x90, 0x0c, 0x01, 0xa3, 0x88, 0xb2, 0x84, 0x61, 0x5e, 0x10, 0x81, 0xb9, 0x2c, 0xd3, 0x9d, 0x0a,
0x6b, 0x91, 0x7b, 0x83, 0x11, 0x4d, 0xd5, 0x55, 0x58, 0xaf, 0x5e, 0xdb, 0x7b, 0xc6, 0x93, 0x5c,
0x7b, 0x77, 0xab, 0x2b, 0x14, 0x21, 0xca, 0xd8, 0x04, 0x18, 0x53, 0x91, 0x81, 0xc2, 0xfa, 0x3a,
0x0b, 0x37, 0xc4, 0xf9, 0x94, 0x0d, 0x36, 0xb3, 0xe9, 0x9d, 0x1e, 0x51, 0xee, 0xfe, 0x3a, 0xf7,
0x47, 0x7a, 0xb1, 0x17, 0xec, 0x68, 0x33, 0x53, 0x86, 0xa0, 0x4b, 0x2b, 0xa2, 0x36, 0x08, 0x30,
0x69, 0x4d, 0xb7, 0x66, 0xc3, 0xb5, 0xe1, 0x33, 0x89, 0x73, 0x6d, 0x90, 0x7f, 0x60, 0xa3, 0x4d,
0x1b, 0x3d, 0x0b, 0x32, 0x1d, 0x93, 0x89, 0xaf, 0x4d, 0xd7, 0x4d, 0xb8, 0x23, 0xcb, 0x27, 0x76,
0xfc, 0xfc, 0x26, 0x54, 0x42, 0xc9, 0x88, 0x70, 0x42, 0xb6, 0xf1, 0xbf, 0x77, 0xa1, 0xba, 0x94,
0x11, 0xff, 0xdf, 0x24, 0x2a, 0xb1, 0x58, 0xc2, 0x29, 0x4d, 0x35, 0x7c, 0x6e, 0xfc, 0xb2, 0x4c,
0xfb, 0xae, 0x64, 0x88, 0x22, 0x20, 0x5a, 0x78, 0x45, 0x37, 0x74, 0x12, 0xb8, 0x41, 0xb4, 0xfc,
0x9c, 0x1d, 0x92, 0xf8, 0xab, 0x41, 0xbf, 0x14, 0x1e, 0x43, 0xed, 0x6c, 0x40, 0x38, 0x9b, 0xb4,
0xa6, 0xfd, 0xd9, 0x41, 0x92, 0xbe, 0x27, 0x65, 0xb6, 0x12, 0x16, 0x6d, 0xfa, 0x01, 0x7c, 0xfc,
0x1b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0x06, 0xcd, 0x66, 0x1d, 0x04, 0x00, 0x00,
// 575 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x94, 0x4b, 0x6f, 0x13, 0x31,
0x10, 0xc7, 0x15, 0xfa, 0x60, 0xe3, 0xa6, 0x6d, 0xea, 0x26, 0xa9, 0xdb, 0x52, 0x08, 0x70, 0x20,
0x07, 0x54, 0x09, 0xa1, 0x1e, 0x38, 0x02, 0xbd, 0x52, 0x95, 0x34, 0x70, 0xb5, 0x9c, 0xf5, 0x74,
0x6b, 0x75, 0x6d, 0x2f, 0x7e, 0x14, 0xe5, 0xdb, 0xf0, 0x51, 0x91, 0xc7, 0xdb, 0x24, 0xa2, 0xdc,
0x3c, 0xbf, 0xff, 0xbc, 0x77, 0xb4, 0xa4, 0x27, 0xe1, 0x41, 0x95, 0x70, 0xde, 0x38, 0x1b, 0x2c,
0xdd, 0xc9, 0x16, 0x1a, 0x6f, 0xfe, 0x14, 0x64, 0xfb, 0x12, 0x6d, 0x4a, 0xc9, 0x66, 0x8c, 0x4a,
0xb2, 0xce, 0xb8, 0x33, 0xe9, 0x4e, 0xf1, 0x8d, 0x4c, 0x2a, 0xc9, 0x9e, 0xb5, 0x4c, 0x2a, 0x49,
0xdf, 0x92, 0x5d, 0x0f, 0x4e, 0x89, 0x9a, 0x9b, 0xa8, 0xe7, 0xe0, 0xd8, 0x06, 0x8a, 0xbd, 0x0c,
0xaf, 0x90, 0xd1, 0x33, 0x42, 0xac, 0xe7, 0x0f, 0xe0, 0xbc, 0xb2, 0x86, 0x6d, 0xa2, 0x47, 0xd7,
0xfa, 0x9f, 0x19, 0xa4, 0x1c, 0xf3, 0xa8, 0x6a, 0xb9, 0xf4, 0xd8, 0xca, 0x39, 0x10, 0x3e, 0x3a,
0xbd, 0x26, 0xbd, 0xc6, 0x59, 0x19, 0xcb, 0xc0, 0x8d, 0xd0, 0xc0, 0xb6, 0xd1, 0x67, 0xa7, 0x65,
0x57, 0x42, 0x63, 0xcf, 0x4a, 0x83, 0x62, 0xcf, 0x73, 0x7f, 0xe9, 0x9d, 0x98, 0x06, 0x25, 0x59,
0x91, 0x59, 0x7a, 0xd3, 0x01, 0xd9, 0x0a, 0xf6, 0x1e, 0x0c, 0xeb, 0x22, 0xcc, 0x46, 0x6a, 0xb2,
0x89, 0xfe, 0x8e, 0x6b, 0x51, 0xa9, 0x92, 0x91, 0xdc, 0x64, 0x22, 0xdf, 0x12, 0xa0, 0xa7, 0xa4,
0xab, 0xa5, 0xe6, 0xc1, 0x36, 0xaa, 0x64, 0x3b, 0xa8, 0x16, 0x5a, 0xea, 0x59, 0xb2, 0x53, 0x73,
0xd1, 0xd4, 0xb6, 0xbc, 0xe7, 0x39, 0x71, 0x2f, 0x37, 0x97, 0xd9, 0x0c, 0xd3, 0x9f, 0x90, 0x02,
0x8c, 0xb3, 0x75, 0x0d, 0x92, 0xed, 0x8e, 0x3b, 0x93, 0x62, 0xba, 0xb4, 0xe9, 0x05, 0x19, 0x89,
0xdf, 0x42, 0x05, 0x65, 0x2a, 0x5e, 0x5a, 0x73, 0xab, 0xaa, 0xe8, 0x44, 0x48, 0x9b, 0xd8, 0x43,
0xcf, 0xe1, 0xa3, 0xfa, 0x75, 0x5d, 0xa4, 0xaf, 0x48, 0xfb, 0xf5, 0xf2, 0x46, 0xf6, 0xb1, 0x28,
0xc9, 0x08, 0x17, 0x32, 0x20, 0x5b, 0xda, 0x4a, 0xa8, 0x59, 0x3f, 0x0f, 0x8a, 0x46, 0x1a, 0x14,
0x1f, 0x39, 0xea, 0x20, 0x0f, 0x8a, 0x04, 0x83, 0xc6, 0x29, 0xab, 0x2f, 0x9d, 0x6a, 0xb0, 0x03,
0x9a, 0x47, 0x59, 0x43, 0x29, 0x6d, 0x69, 0x6b, 0xeb, 0xd8, 0x61, 0x4e, 0x8b, 0x46, 0x5a, 0x90,
0xf0, 0x1e, 0x02, 0x0f, 0xa2, 0x62, 0x83, 0xbc, 0x20, 0x04, 0x33, 0x51, 0xa5, 0x9a, 0x12, 0x1a,
0x9e, 0x7b, 0x63, 0x43, 0x9c, 0xaa, 0x2b, 0xa1, 0x69, 0xaf, 0xed, 0x3d, 0xa1, 0x49, 0x6e, 0x9c,
0xbd, 0x55, 0x35, 0x70, 0x1f, 0x44, 0x88, 0x9e, 0x8d, 0x30, 0x49, 0x5f, 0x42, 0x73, 0x9d, 0x85,
0x1b, 0xe4, 0x74, 0x42, 0xfa, 0xeb, 0xde, 0x78, 0xa7, 0x47, 0xe8, 0xbb, 0xb7, 0xf2, 0xfd, 0x91,
0x2e, 0xf6, 0x82, 0x1c, 0xad, 0x7b, 0x0a, 0xef, 0x55, 0x65, 0x78, 0x50, 0x1a, 0x18, 0x1b, 0x77,
0x26, 0x1b, 0xd3, 0xc1, 0x2a, 0xe0, 0x33, 0x8a, 0x33, 0xa5, 0x81, 0x7e, 0x20, 0xc3, 0xf5, 0x30,
0x3c, 0x0b, 0x0c, 0x3a, 0xc6, 0x20, 0xba, 0x0a, 0xba, 0x8e, 0xfe, 0x0e, 0x43, 0x3e, 0x91, 0xe3,
0xa7, 0x95, 0x40, 0x72, 0x29, 0x02, 0xb0, 0x13, 0x0c, 0x1b, 0xfd, 0x5b, 0x0b, 0xe4, 0xa5, 0x08,
0xf0, 0xff, 0x26, 0x41, 0xf2, 0xf9, 0x82, 0x9d, 0xe2, 0x54, 0x83, 0xa7, 0x81, 0x5f, 0x16, 0x69,
0xdf, 0xb5, 0xf0, 0x81, 0x7b, 0x00, 0xc3, 0x5e, 0x60, 0x85, 0x22, 0x81, 0x1b, 0x00, 0x43, 0xcf,
0xc9, 0x21, 0x8a, 0xbf, 0x22, 0xb8, 0x05, 0x77, 0xe0, 0x1b, 0x6b, 0x3c, 0xb0, 0xb3, 0x71, 0x67,
0xd2, 0x9b, 0x1e, 0x24, 0xe9, 0x7b, 0x52, 0xa6, 0xad, 0x40, 0xdf, 0x91, 0xfd, 0xb9, 0xb5, 0xc1,
0x07, 0x27, 0x9a, 0xf6, 0x86, 0x5f, 0xe6, 0x8d, 0x2e, 0x31, 0x9e, 0xf1, 0x7c, 0x1b, 0xff, 0x14,
0x1f, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x95, 0x24, 0x1c, 0x5e, 0x46, 0x04, 0x00, 0x00,
}

View File

@@ -33,5 +33,6 @@ message Device {
string dep_profile_assigned_by =27;
int64 last_seen =28;
bytes last_query_response =29;
string bootstrap_token =30;
}

View File

@@ -101,7 +101,7 @@ func (mw *udidCertAuthMiddleware) Checkin(ctx context.Context, req mdm.CheckinEv
return nil, err
}
return mw.next.Checkin(ctx, req)
case "TokenUpdate", "CheckOut":
case "TokenUpdate", "CheckOut", "GetBootstrapToken", "SetBootstrapToken":
matched, err := mw.validateUDIDCertAuth([]byte(req.Command.UDID), hashCertRaw(devcert.Raw))
if err != nil {
return nil, err

View File

@@ -44,6 +44,14 @@ func (w *Worker) Run(ctx context.Context) error {
if err != nil {
return errors.Wrapf(err, "subscribing %s to %s", subscription, mdm.TokenUpdateTopic)
}
getBootstrapTokenEvents, err := w.ps.Subscribe(ctx, subscription, mdm.GetBootstrapTokenTopic)
if err != nil {
return errors.Wrapf(err, "subscribing %s to %s", subscription, mdm.GetBootstrapTokenTopic)
}
setBootstrapTokenEvents, err := w.ps.Subscribe(ctx, subscription, mdm.SetBootstrapTokenTopic)
if err != nil {
return errors.Wrapf(err, "subscribing %s to %s", subscription, mdm.SetBootstrapTokenTopic)
}
checkoutEvents, err := w.ps.Subscribe(ctx, subscription, mdm.CheckoutTopic)
if err != nil {
return errors.Wrapf(err, "subscribing %s to %s", subscription, mdm.CheckoutTopic)
@@ -66,6 +74,10 @@ func (w *Worker) Run(ctx context.Context) error {
err = w.updateFromAuthenticate(ctx, ev.Message)
case ev := <-tokenUpdateEvents:
err = w.updateFromTokenUpdate(ctx, ev.Message)
case ev := <-getBootstrapTokenEvents:
err = w.updateFromGetBootstrapToken(ctx, ev.Message)
case ev := <-setBootstrapTokenEvents:
err = w.updateFromSetBootstrapToken(ctx, ev.Message)
case ev := <-checkoutEvents:
err = w.updateFromCheckout(ctx, ev.Message)
case ev := <-depSyncEvents:
@@ -179,6 +191,45 @@ func (w *Worker) updateFromCheckout(ctx context.Context, message []byte) error {
}
func (w *Worker) updateFromGetBootstrapToken(ctx context.Context, message []byte) error {
var ev mdm.CheckinEvent
if err := mdm.UnmarshalCheckinEvent(message, &ev); err != nil {
return errors.Wrap(err, "unmarshal checkin event")
}
dev, err := w.db.DeviceByUDID(ctx, ev.Command.UDID)
if err != nil {
return errors.Wrapf(err, "retrieve device with udid %s", ev.Command.UDID)
}
dev.AwaitingConfiguration = ev.Command.AwaitingConfiguration
dev.LastSeen = time.Now()
err = w.db.Save(ctx, dev)
return errors.Wrapf(err, "saving updated device for GetBootstrapToken event")
}
func (w *Worker) updateFromSetBootstrapToken(ctx context.Context, message []byte) error {
var ev mdm.CheckinEvent
if err := mdm.UnmarshalCheckinEvent(message, &ev); err != nil {
return errors.Wrap(err, "unmarshal checkin event")
}
dev, err := w.db.DeviceByUDID(ctx, ev.Command.UDID)
if err != nil {
return errors.Wrapf(err, "retrieve device with udid %s", ev.Command.UDID)
}
dev.BootstrapToken = string(ev.Command.BootstrapToken)
dev.AwaitingConfiguration = ev.Command.AwaitingConfiguration
dev.LastSeen = time.Now()
err = w.db.Save(ctx, dev)
return errors.Wrapf(err, "saving updated device for SetBootstrapToken event")
}
func (w *Worker) updateFromTokenUpdate(ctx context.Context, message []byte) error {
var ev mdm.CheckinEvent
if err := mdm.UnmarshalCheckinEvent(message, &ev); err != nil {

View File

@@ -183,7 +183,7 @@ func (c *Server) setupCommandQueue(logger log.Logger) error {
var mdmService mdm.Service
{
svc := mdm.NewService(c.PubClient, q)
svc := mdm.NewService(c.PubClient, q, devDB)
mdmService = svc
mdmService = block.RemoveMiddleware(c.RemoveDB)(mdmService)

View File

@@ -1,12 +0,0 @@
#!/bin/bash
source $MICROMDM_ENV_PATH
endpoint="v1/commands"
jq -n \
--arg request_type "SetBootstrapToken" \
--arg udid "$1" \
--arg token "$2" \
'.udid = $udid
|.request_type = $request_type
|.bootstrap_token = $token
'|\
curl $CURL_OPTS -K <(cat <<< "-u micromdm:$API_TOKEN") "$SERVER_URL/$endpoint" -d@-

View File

@@ -81,6 +81,16 @@ func (w *Worker) Run(ctx context.Context) error {
return errors.Wrapf(err, "subscribe %s to %s", subscription, mdm.CheckoutTopic)
}
getBootstrapTokenEvents, err := w.sub.Subscribe(ctx, subscription, mdm.GetBootstrapTokenTopic)
if err != nil {
return errors.Wrapf(err, "subscribe %s to %s", subscription, mdm.GetBootstrapTokenTopic)
}
setBootstrapTokenEvents, err := w.sub.Subscribe(ctx, subscription, mdm.SetBootstrapTokenTopic)
if err != nil {
return errors.Wrapf(err, "subscribe %s to %s", subscription, mdm.SetBootstrapTokenTopic)
}
for {
var (
event *Event
@@ -97,6 +107,10 @@ func (w *Worker) Run(ctx context.Context) error {
event, err = checkinEvent(ev.Topic, ev.Message)
case ev := <-checkoutEvents:
event, err = checkinEvent(ev.Topic, ev.Message)
case ev := <-getBootstrapTokenEvents:
event, err = checkinEvent(ev.Topic, ev.Message)
case ev := <-setBootstrapTokenEvents:
event, err = checkinEvent(ev.Topic, ev.Message)
}
if err != nil {