From 8d9cede4a0938068563739830bf32f80261da771 Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Fri, 16 Aug 2024 09:58:21 -0700 Subject: [PATCH 01/51] Add app session recordings to `tsh recordings ls`, `tctl recordings ls`, and the WebUI (#45535) * Add app session recordings to 'tsh recordings ls' and 'tctl recordigns ls'. * humanize timestamps, add test case. * Support non-interactive app session recordings in the WebUI. * Fix test. --- lib/events/api.go | 1 + lib/events/athena/querier_test.go | 4 ++-- tool/common/common.go | 16 +++++++++---- tool/tsh/common/tsh_test.go | 24 +++++++++++++++++++ .../src/Recordings/RecordingsList.tsx | 2 ++ .../src/services/recordings/makeRecording.ts | 20 ++++++++++++++++ .../teleport/src/services/recordings/types.ts | 2 +- 7 files changed, 61 insertions(+), 8 deletions(-) diff --git a/lib/events/api.go b/lib/events/api.go index b827856da3c08..2fef72b86e365 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -828,6 +828,7 @@ var ( // recorings. SessionRecordingEvents = []string{ SessionEndEvent, + AppSessionEndEvent, WindowsDesktopSessionEndEvent, DatabaseSessionEndEvent, } diff --git a/lib/events/athena/querier_test.go b/lib/events/athena/querier_test.go index 0a52a66cef7d2..e254ed3ef8785 100644 --- a/lib/events/athena/querier_test.go +++ b/lib/events/athena/querier_test.go @@ -191,8 +191,8 @@ func TestSearchEvents(t *testing.T) { check: func(t *testing.T, mock *mockAthenaExecutor, paginationKey string) { wantSingleCallToAthena(t, mock) wantQuery(t, mock, selectFromPrefix+whereTimeRange+ - ` AND session_id = ? AND event_type IN (?,?,?) ORDER BY event_time ASC, uid ASC LIMIT 100;`) - wantQueryParams(t, mock, append(timeRangeParams, "'9762a4fe-ac4b-47b5-ba4f-5f70d065849a'", "'session.end'", "'windows.desktop.session.end'", "'db.session.end'")...) + ` AND session_id = ? AND event_type IN (?,?,?,?) ORDER BY event_time ASC, uid ASC LIMIT 100;`) + wantQueryParams(t, mock, append(timeRangeParams, "'9762a4fe-ac4b-47b5-ba4f-5f70d065849a'", "'session.end'", "'app.session.end'", "'windows.desktop.session.end'", "'db.session.end'")...) }, }, { diff --git a/tool/common/common.go b/tool/common/common.go index 885101d4fd01d..96b9509b597d0 100644 --- a/tool/common/common.go +++ b/tool/common/common.go @@ -26,11 +26,11 @@ import ( "sort" "strings" + "github.com/dustin/go-humanize" "github.com/gravitational/trace" log "github.com/sirupsen/logrus" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/asciitable" @@ -65,21 +65,27 @@ func (e *SessionsCollection) WriteText(w io.Writer) error { typ = session.Protocol participants = strings.Join(session.Participants, ", ") hostname = session.ServerAddr - timestamp = session.GetTime().Format(constants.HumanDateFormatSeconds) + timestamp = humanize.Time(session.GetTime()) case *events.WindowsDesktopSessionEnd: id = session.GetSessionID() typ = "windows" participants = strings.Join(session.Participants, ", ") hostname = session.DesktopName - timestamp = session.GetTime().Format(constants.HumanDateFormatSeconds) + timestamp = humanize.Time(session.GetTime()) case *events.DatabaseSessionEnd: id = session.GetSessionID() typ = session.DatabaseProtocol participants = session.GetUser() hostname = session.DatabaseService - timestamp = session.GetTime().Format(constants.HumanDateFormatSeconds) + timestamp = humanize.Time(session.GetTime()) + case *events.AppSessionEnd: + id = session.GetSessionID() + typ = "app" + participants = session.User + hostname = session.AppName + timestamp = humanize.Time(session.GetTime()) default: - log.Warn(trace.BadParameter("unsupported event type: expected SessionEnd, WindowsDesktopSessionEnd or DatabaseSessionEnd: got: %T", event)) + log.Warn(trace.BadParameter("unsupported event type: expected SessionEnd, WindowsDesktopSessionEnd, DatabaseSessionEnd, or AppSessionEnd: got: %T", event)) continue } diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index d0b508cc716ac..6f5cd9d7f1822 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -5102,8 +5102,19 @@ func TestShowSessions(t *testing.T) { "sid": "", "db_protocol": "postgres", "db_uri": "", + "db_name": "db-name", "session_start": "0001-01-01T00:00:00Z", "session_stop": "0001-01-01T00:00:00Z" + }, + { + "ei": 0, + "event": "", + "uid": "someID5", + "time": "0001-01-01T00:00:00Z", + "user": "someUser", + "sid": "", + "server_id": "", + "app_name": "app-name" } ]` sessions := []events.AuditEvent{ @@ -5139,11 +5150,24 @@ func TestShowSessions(t *testing.T) { User: "someUser", }, DatabaseMetadata: events.DatabaseMetadata{ + DatabaseName: "db-name", DatabaseProtocol: "postgres", }, StartTime: time.Time{}, EndTime: time.Time{}, }, + &events.AppSessionEnd{ + Metadata: events.Metadata{ + ID: "someID5", + Time: time.Time{}, + }, + UserMetadata: events.UserMetadata{ + User: "someUser", + }, + AppMetadata: events.AppMetadata{ + AppName: "app-name", + }, + }, } var buf bytes.Buffer err := common.ShowSessions(sessions, teleport.JSON, &buf) diff --git a/web/packages/teleport/src/Recordings/RecordingsList.tsx b/web/packages/teleport/src/Recordings/RecordingsList.tsx index b7bd2be09d233..245e1762e9555 100644 --- a/web/packages/teleport/src/Recordings/RecordingsList.tsx +++ b/web/packages/teleport/src/Recordings/RecordingsList.tsx @@ -111,6 +111,8 @@ const renderIconCell = (type: RecordingType) => { Icon = Icons.Kubernetes; } else if (type === 'database') { Icon = Icons.Database; + } else if (type === 'app') { + Icon = Icons.Application; } return ( diff --git a/web/packages/teleport/src/services/recordings/makeRecording.ts b/web/packages/teleport/src/services/recordings/makeRecording.ts index 0f47a15068988..4806aa1294678 100644 --- a/web/packages/teleport/src/services/recordings/makeRecording.ts +++ b/web/packages/teleport/src/services/recordings/makeRecording.ts @@ -30,6 +30,8 @@ export function makeRecording(event: any): Recording { return makeDesktopRecording(event); } else if (event.code === eventCodes.DATABASE_SESSION_ENDED) { return makeDatabaseRecording(event); + } else if (event.code === eventCodes.APP_SESSION_END) { + return makeAppRecording(event); } else { return makeSshOrKubeRecording(event); } @@ -160,4 +162,22 @@ function makeDatabaseRecording({ } as Recording; } +function makeAppRecording({ time, user, sid, app_name }) { + // App recordings all not playable from the webUI, but we still want to display + // them as they can be viewed through `tsh play --format=json`. + const description = 'non-interactive'; + + return { + duration: 0, + durationText: '-', + sid, + createdDate: time, + users: user, + hostname: app_name, + description, + recordingType: 'app', + playable: false, + } as Recording; +} + const disabledDescription = 'recording disabled'; diff --git a/web/packages/teleport/src/services/recordings/types.ts b/web/packages/teleport/src/services/recordings/types.ts index 81ddf938da07a..37d58e3990bff 100644 --- a/web/packages/teleport/src/services/recordings/types.ts +++ b/web/packages/teleport/src/services/recordings/types.ts @@ -28,7 +28,7 @@ export type RecordingsResponse = { startKey: string; }; -export type RecordingType = 'ssh' | 'desktop' | 'k8s' | 'database'; +export type RecordingType = 'ssh' | 'desktop' | 'k8s' | 'database' | 'app'; export type Recording = { duration: number; From 57fd913f66ddba9ea90c41732f1b5f808b07a066 Mon Sep 17 00:00:00 2001 From: matheus Date: Fri, 16 Aug 2024 14:03:02 -0300 Subject: [PATCH 02/51] Fix Passwordless default Cloud on first user signup (#41956) * Update condition to set passwordless to acount for preset users * Improve method * Add test * Improve comment Co-authored-by: Alan Parra * Apply code review comments - Add comment back - Fix test require.Empty condition - Remove unnecessary test * Update getPresetUsers implementation to mimic getPresetRole pattern * Remvoe unnecessary rules on test roles * Update arg name in slices.DeleteFunc Co-authored-by: Alan Parra * Assert expected values in TestGetPresetUsers * Apply suggestions from code review - Improve tests Co-authored-by: Alan Parra * TestCloudDefaultPasswordless: use gRPC client * Remove blank UpdateUser and unnecessary MFA setup * Update existing role instead of creating a new one * Make sure test server has preset users * Remove unnecessary user upsert after role change. Co-authored-by: Alan Parra * Improve `getPresetUsers` godoc Co-authored-by: Sakshyam Shah --------- Co-authored-by: Alan Parra Co-authored-by: Sakshyam Shah --- lib/auth/auth_with_roles.go | 33 +++++++- lib/auth/auth_with_roles_test.go | 134 +++++++++++++++++++++++++++++++ lib/auth/init.go | 17 +++- lib/auth/init_test.go | 16 ++++ 4 files changed, 196 insertions(+), 4 deletions(-) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 6241b698c3768..5a0a47df67e82 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -3480,7 +3480,7 @@ func (a *ServerWithRoles) trySettingConnectorNameToPasswordless(ctx context.Cont } // Only set the connector name on the first user registration. - if len(users) != 1 { + if !hasOneNonPresetUser(users) { return nil } @@ -3499,6 +3499,37 @@ func (a *ServerWithRoles) trySettingConnectorNameToPasswordless(ctx context.Cont return trace.Wrap(err) } +// hasOneNonPresetUser returns true only if there is exactly one non-preset user in the provided list of users. +// This method always compare with the original preset users, and take into account that some preset users may +// have been removed. +func hasOneNonPresetUser(users []types.User) bool { + presets := getPresetUsers() + + // Exit early if the number of users is greater than the number of presets + 1. + if len(users) > len(presets)+1 { + return false + } + + // We can't simply compare the number of existing users to presets because presets may have been deleted. + // Hence, we need to check each user to determine if they are a preset user. + presetMap := make(map[string]struct{}, len(presets)) + for _, preset := range presets { + presetMap[preset.GetName()] = struct{}{} + } + + qtyNonPreset := 0 + for _, user := range users { + if _, isPreset := presetMap[user.GetName()]; !isPreset { + qtyNonPreset++ + } + if qtyNonPreset > 1 { + return false + } + } + + return qtyNonPreset == 1 +} + // UpdateUser updates an existing user in a backend. // Captures the auth user who modified the user record. // TODO(tross): DELETE IN 17.0.0 diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 12f01e5dcc77a..60b560b871c3a 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -8398,3 +8398,137 @@ func TestIsMFARequired_AdminAction(t *testing.T) { }) } } + +func TestCloudDefaultPasswordless(t *testing.T) { + tt := []struct { + name string + cloud bool + withPresetUsers bool + qtyPreexistingUsers int + expectedDefaultConnector string + }{ + { + name: "First Cloud user should set cluster to passwordless when presets exist", + cloud: true, + withPresetUsers: true, + qtyPreexistingUsers: 0, + expectedDefaultConnector: constants.PasswordlessConnector, + }, + { + name: "First Cloud user should set cluster to passwordless when presets don't exist", + cloud: true, + withPresetUsers: false, + qtyPreexistingUsers: 0, + expectedDefaultConnector: constants.PasswordlessConnector, + }, + { + name: "Second Cloud user should not set cluster to passwordless when presets exist", + cloud: true, + withPresetUsers: true, + qtyPreexistingUsers: 1, + expectedDefaultConnector: "", + }, + { + name: "Second Cloud user should not set cluster to passwordless when presets don't exist", + cloud: true, + withPresetUsers: false, + qtyPreexistingUsers: 1, + expectedDefaultConnector: "", + }, + { + name: "First non-Cloud user should not set cluster to passwordless", + cloud: false, + withPresetUsers: false, + qtyPreexistingUsers: 0, + expectedDefaultConnector: "", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create new server + ctx := context.Background() + srv := newTestTLSServer(t) + + modules.SetTestModules(t, &modules.TestModules{ + TestBuildType: modules.BuildEnterprise, + TestFeatures: modules.Features{ + Cloud: tc.cloud, + }, + }) + + // set cluster Webauthn + authPreference, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ + Type: constants.Local, + SecondFactor: constants.SecondFactorWebauthn, + Webauthn: &types.Webauthn{ + RPID: "localhost", + }, + }) + require.NoError(t, err) + _, err = srv.Auth().UpsertAuthPreference(ctx, authPreference) + require.NoError(t, err) + + // the test server doesn't create the preset users, so we call createPresetUsers manually + if tc.withPresetUsers { + createPresetUsers(ctx, srv.Auth()) + } + + // create preexisting users + for i := 0; i < tc.qtyPreexistingUsers; i += 1 { + _, _, err = CreateUserAndRole(srv.Auth(), fmt.Sprintf("testuser-%d", i), nil /* allowedLogins */, nil /* allowRules */) + require.NoError(t, err) + } + + // create the user that might have the auth method changed to passwordless with 2FA + // since CreateResetPasswordToken requires MFA verification. + u, err := createUserWithSecondFactors(srv) + require.NoError(t, err) + + // add permission to edit users, necessary to change auth method to passwordless + user, err := srv.Auth().GetUser(ctx, u.username, false /* withSecrets */) + require.NoError(t, err) + // createUserWithSecondFactors creates a role for the user already, so we modify it with extra perms + roleName := user.GetRoles()[0] + role, err := srv.Auth().GetRole(ctx, roleName) + require.NoError(t, err) + role.SetRules(types.Allow, []types.Rule{ + types.NewRule(types.KindUser, services.RW()), + }) + _, err = srv.Auth().UpsertRole(ctx, role) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + // setup to change authentication method to passkey + resetToken, err := client.CreateResetPasswordToken(ctx, authclient.CreateUserTokenRequest{ + Name: user.GetName(), + }) + require.NoError(t, err) + token := resetToken.GetName() + + registerChal, err := client.CreateRegisterChallenge(ctx, &proto.CreateRegisterChallengeRequest{ + TokenID: token, + DeviceType: proto.DeviceType_DEVICE_TYPE_WEBAUTHN, + DeviceUsage: proto.DeviceUsage_DEVICE_USAGE_PASSWORDLESS, + }) + require.NoError(t, err) + + _, registerSolved, err := NewTestDeviceFromChallenge(registerChal, WithPasswordless()) + require.NoError(t, err) + + _, err = client.ChangeUserAuthentication(ctx, &proto.ChangeUserAuthenticationRequest{ + TokenID: token, + NewMFARegisterResponse: registerSolved, + }) + require.NoError(t, err) + + authPreferences, err := client.GetAuthPreference(ctx) + require.NoError(t, err) + + // assert that the auth preference matches the expected + require.Equal(t, tc.expectedDefaultConnector, authPreferences.GetConnectorName()) + }) + } +} diff --git a/lib/auth/init.go b/lib/auth/init.go index 40ffecd563591..64aae856f22e2 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -1048,12 +1048,23 @@ type PresetUsers interface { UpsertUser(ctx context.Context, user types.User) (types.User, error) } +// getPresetUsers returns a list of all preset users expected to be available on +// this cluster. +func getPresetUsers() []types.User { + presets := []types.User{ + services.NewSystemAutomaticAccessBotUser(), + } + + // Certain `New$FooUser()` functions will return a nil role if the + // corresponding feature is disabled. They should be filtered out as they + // are not actually made available on the cluster. + return slices.DeleteFunc(presets, func(u types.User) bool { return u == nil }) +} + // createPresetUsers creates all of the required user presets. No attempt is // made to migrate any existing users to the lastest preset. func createPresetUsers(ctx context.Context, um PresetUsers) error { - users := []types.User{ - services.NewSystemAutomaticAccessBotUser(), - } + users := getPresetUsers() for _, user := range users { // Some users are only valid for enterprise Teleport, and so will be // nil for an OSS build and can be skipped diff --git a/lib/auth/init_test.go b/lib/auth/init_test.go index e51ded4636edd..45f2b0d88da87 100644 --- a/lib/auth/init_test.go +++ b/lib/auth/init_test.go @@ -906,6 +906,22 @@ func TestPresets(t *testing.T) { }) } +func TestGetPresetUsers(t *testing.T) { + // no preset users for OSS + modules.SetTestModules(t, &modules.TestModules{ + TestBuildType: modules.BuildOSS, + }) + require.Empty(t, getPresetUsers()) + + // preset user @teleport-access-approval-bot on enterprise + modules.SetTestModules(t, &modules.TestModules{ + TestBuildType: modules.BuildEnterprise, + }) + require.Equal(t, []types.User{ + services.NewSystemAutomaticAccessBotUser(), + }, getPresetUsers()) +} + type mockUserManager struct { mock.Mock } From 56f4b4d7ee609d1a84af11d98ae92dcc5fd41af1 Mon Sep 17 00:00:00 2001 From: Erik Tate Date: Fri, 16 Aug 2024 13:09:16 -0400 Subject: [PATCH 03/51] prevent teleport-system group assignment for users created (#45446) outside of INSECURE_DROP mode --- integration/hostuser_test.go | 16 +-- lib/srv/sess.go | 2 +- lib/srv/usermgmt.go | 211 +++++++++++++---------------------- lib/srv/usermgmt_linux.go | 6 +- lib/srv/usermgmt_other.go | 5 - lib/srv/usermgmt_test.go | 82 +++++++++++--- 6 files changed, 160 insertions(+), 162 deletions(-) diff --git a/integration/hostuser_test.go b/integration/hostuser_test.go index dd8f68db28447..7c90419ecfb9f 100644 --- a/integration/hostuser_test.go +++ b/integration/hostuser_test.go @@ -218,7 +218,7 @@ func TestRootHostUsers(t *testing.T) { users := srv.NewHostUsers(context.Background(), presence, "host_uuid") testGroups := []string{"group1", "group2"} - closer, err := users.UpsertUser(testuser, &services.HostUsersInfo{Groups: testGroups, Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}) + closer, err := users.UpsertUser(testuser, services.HostUsersInfo{Groups: testGroups, Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}) require.NoError(t, err) testGroups = append(testGroups, types.TeleportServiceGroup) @@ -243,7 +243,7 @@ func TestRootHostUsers(t *testing.T) { _, err := user.LookupGroupId(testGID) require.ErrorIs(t, err, user.UnknownGroupIdError(testGID)) - closer, err := users.UpsertUser(testuser, &services.HostUsersInfo{ + closer, err := users.UpsertUser(testuser, services.HostUsersInfo{ Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, UID: testUID, GID: testGID, @@ -272,7 +272,7 @@ func TestRootHostUsers(t *testing.T) { expectedHome := filepath.Join("/home", testuser) require.NoDirExists(t, expectedHome) - closer, err := users.UpsertUser(testuser, &services.HostUsersInfo{Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP}) + closer, err := users.UpsertUser(testuser, services.HostUsersInfo{Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP}) require.NoError(t, err) require.Nil(t, closer) t.Cleanup(cleanupUsersAndGroups([]string{testuser}, nil)) @@ -303,7 +303,7 @@ func TestRootHostUsers(t *testing.T) { host.UserDel(testuser) }) closer, err := users.UpsertUser(testuser, - &services.HostUsersInfo{ + services.HostUsersInfo{ Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, }) require.NoError(t, err) @@ -333,12 +333,12 @@ func TestRootHostUsers(t *testing.T) { deleteableUsers := []string{"teleport-user1", "teleport-user2", "teleport-user3"} for _, user := range deleteableUsers { - _, err := users.UpsertUser(user, &services.HostUsersInfo{Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}) + _, err := users.UpsertUser(user, services.HostUsersInfo{Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}) require.NoError(t, err) } // this user should not be in the service group as it was created with mode keep. - closer, err := users.UpsertUser("teleport-user4", &services.HostUsersInfo{ + closer, err := users.UpsertUser("teleport-user4", services.HostUsersInfo{ Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, }) require.NoError(t, err) @@ -392,7 +392,7 @@ func TestRootHostUsers(t *testing.T) { // Verify that the user is created with the first set of groups. users := srv.NewHostUsers(context.Background(), presence, "host_uuid") - _, err := users.UpsertUser(testuser, &services.HostUsersInfo{ + _, err := users.UpsertUser(testuser, services.HostUsersInfo{ Groups: tc.firstGroups, Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, }) @@ -402,7 +402,7 @@ func TestRootHostUsers(t *testing.T) { requireUserInGroups(t, u, tc.firstGroups) // Verify that the user is updated with the second set of groups. - _, err = users.UpsertUser(testuser, &services.HostUsersInfo{ + _, err = users.UpsertUser(testuser, services.HostUsersInfo{ Groups: tc.secondGroups, Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, }) diff --git a/lib/srv/sess.go b/lib/srv/sess.go index 844a330b03b70..3d2af7ce2ec5f 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -282,7 +282,7 @@ func (s *SessionRegistry) TryCreateHostUser(ctx *ServerContext) error { if trace.IsAccessDenied(err) && existsErr != nil { return trace.WrapWithMessage(err, "Insufficient permission for host user creation") } - userCloser, err := s.users.UpsertUser(ctx.Identity.Login, ui) + userCloser, err := s.users.UpsertUser(ctx.Identity.Login, *ui) if userCloser != nil { ctx.AddCloser(userCloser) } diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index ab03ff3502c7f..678544da7460e 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -26,6 +26,7 @@ import ( "maps" "os/user" "regexp" + "slices" "strings" "syscall" "time" @@ -106,6 +107,8 @@ type HostUsersBackend interface { DeleteUser(name string) error // CreateHomeDirectory creates the users home directory and copies in /etc/skel CreateHomeDirectory(userHome string, uid, gid string) error + // GetDefaultHomeDirectory returns the default home directory path for the given user + GetDefaultHomeDirectory(user string) (string, error) } type userCloser struct { @@ -148,7 +151,7 @@ func (*HostSudoersNotImplemented) RemoveSudoers(name string) error { type HostUsers interface { // UpsertUser creates a temporary Teleport user in the TeleportServiceGroup - UpsertUser(name string, hostRoleInfo *services.HostUsersInfo) (io.Closer, error) + UpsertUser(name string, hostRoleInfo services.HostUsersInfo) (io.Closer, error) // DeleteUser deletes a temporary Teleport user only if they are // in a specified group DeleteUser(name string, gid string) error @@ -223,147 +226,71 @@ func (u *HostSudoersManagement) RemoveSudoers(name string) error { return nil } -// UpsertUser creates a temporary Teleport user in the TeleportServiceGroup -func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) (io.Closer, error) { - if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED { - return nil, trace.BadParameter("Mode is a required argument to CreateUser") - } - - groupsToAdd := make([]string, 0, len(ui.Groups)) - for _, group := range ui.Groups { - if group == name { - // this causes an error as useradd expects the group with the same name as the user to be available - log.Debugf("Skipping group creation with name the same as login user (%q, %q).", name, group) - continue - } - groupsToAdd = append(groupsToAdd, group) - } - if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { - groupsToAdd = append(groupsToAdd, types.TeleportServiceGroup) - } - var errs []error - for _, group := range groupsToAdd { - if err := u.createGroupIfNotExist(group); err != nil { - errs = append(errs, err) - continue - } - } - if err := trace.NewAggregate(errs...); err != nil { - return nil, trace.WrapWithMessage(err, "error while creating groups") +func (u *HostUserManagement) updateUser(name string, ui services.HostUsersInfo) error { + existingUser, err := u.backend.Lookup(name) + if err != nil { + return trace.Wrap(err) } - tempUser, err := u.backend.Lookup(name) - if err != nil && !errors.Is(err, user.UnknownUserError(name)) { - return nil, trace.Wrap(err) + currentGroups := make(map[string]struct{}, len(ui.Groups)) + groupIDs, err := u.backend.UserGIDs(existingUser) + if err != nil { + return trace.Wrap(err) } - if tempUser != nil { - // Collect actions that need to be done together under a lock on the user. - actionsUnderLock := make([]func() error, 0, 2) - doWithUserLock := func() error { - if len(actionsUnderLock) == 0 { - return nil - } - - return trace.Wrap(u.doWithUserLock(func(_ types.SemaphoreLease) error { - for _, action := range actionsUnderLock { - if err := action(); err != nil { - return trace.Wrap(err) - } - } - return nil - })) - } - - // Get the user's current groups. - currentGroups := make(map[string]struct{}, len(groupsToAdd)) - groupIds, err := u.backend.UserGIDs(tempUser) + for _, groupID := range groupIDs { + group, err := u.backend.LookupGroupByID(groupID) if err != nil { - return nil, trace.Wrap(err) - } - for _, groupId := range groupIds { - group, err := u.backend.LookupGroupByID(groupId) - if err != nil { - return nil, trace.Wrap(err) - } - currentGroups[group.Name] = struct{}{} + return trace.Wrap(err) } - // Get the groups that the user should end up with, including the primary group. - finalGroups := make(map[string]struct{}, len(groupsToAdd)+1) - for _, group := range groupsToAdd { - finalGroups[group] = struct{}{} - } - primaryGroup, err := u.backend.LookupGroupByID(tempUser.Gid) - if err != nil { - return nil, trace.Wrap(err) - } - finalGroups[primaryGroup.Name] = struct{}{} + currentGroups[group.Name] = struct{}{} + } - // Check if the user's groups need to be updated. - if !maps.Equal(currentGroups, finalGroups) { - actionsUnderLock = append(actionsUnderLock, func() error { - return trace.Wrap(u.backend.SetUserGroups(name, groupsToAdd)) - }) - } + _, hasSystemGroup := currentGroups[types.TeleportServiceGroup] + if hasSystemGroup && ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { + ui.Groups = append(ui.Groups, types.TeleportServiceGroup) + } - systemGroup, err := u.backend.LookupGroup(types.TeleportServiceGroup) - if err != nil { - if isUnknownGroupError(err, types.TeleportServiceGroup) { - // Teleport service group doesn't exist, so we don't need to update interaction time. - return nil, trace.Wrap(doWithUserLock()) - } - return nil, trace.Wrap(err) - } - gids, err := u.backend.UserGIDs(tempUser) - if err != nil { - return nil, trace.Wrap(err) - } - var found bool - for _, gid := range gids { - if gid == systemGroup.Gid { - found = true - break - } - } - if !found { - // User isn't managed by Teleport, so we don't need to update interaction time. - return nil, trace.Wrap(doWithUserLock()) - } + finalGroups := make(map[string]struct{}, len(ui.Groups)) + for _, group := range ui.Groups { + finalGroups[group] = struct{}{} + } - actionsUnderLock = append(actionsUnderLock, func() error { - return trace.Wrap(u.storage.UpsertHostUserInteractionTime(u.ctx, name, time.Now())) - }) - if err := doWithUserLock(); err != nil { - return nil, trace.Wrap(err) - } - // try to delete even if the user already exists as only users - // in the teleport-system group will be deleted and this way - // if a user creates multiple sessions the account will - // succeed in deletion - return &userCloser{ - username: name, - users: u, - backend: u.backend, - }, nil + primaryGroup, err := u.backend.LookupGroupByID(existingUser.Gid) + if err != nil { + return trace.Wrap(err) } + finalGroups[primaryGroup.Name] = struct{}{} + if !maps.Equal(currentGroups, finalGroups) { + return trace.Wrap(u.doWithUserLock(func(_ types.SemaphoreLease) error { + return trace.Wrap(u.backend.SetUserGroups(name, ui.Groups)) + })) + } + + return nil +} + +func (u *HostUserManagement) createUser(name string, ui services.HostUsersInfo) error { var home string - if ui.Mode != types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { - //nolint:staticcheck // SA4023. False positive on macOS. - home, err = readDefaultHome(name) - //nolint:staticcheck // SA4023. False positive on macOS. + var err error + if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { + ui.Groups = append(ui.Groups, types.TeleportServiceGroup) + } else { + home, err = u.backend.GetDefaultHomeDirectory(name) if err != nil { - return nil, trace.Wrap(err) + return trace.Wrap(err) } } - err = u.doWithUserLock(func(_ types.SemaphoreLease) error { + return trace.Wrap(u.doWithUserLock(func(_ types.SemaphoreLease) error { if ui.Mode != types.CreateHostUserMode_HOST_USER_MODE_KEEP { if err := u.storage.UpsertHostUserInteractionTime(u.ctx, name, time.Now()); err != nil { return trace.Wrap(err) } } + if ui.GID != "" { // if gid is specified a group must already exist err := u.backend.CreateGroup(name, ui.GID) @@ -372,7 +299,7 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) } } - err = u.backend.CreateUser(name, groupsToAdd, home, ui.UID, ui.GID) + err = u.backend.CreateUser(name, ui.Groups, home, ui.UID, ui.GID) if err != nil && !trace.IsAlreadyExists(err) { return trace.WrapWithMessage(err, "error while creating user") } @@ -389,22 +316,44 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) } return nil - }) - if err != nil { - return nil, trace.Wrap(err) + })) +} + +// UpsertUser creates a temporary Teleport user in the TeleportServiceGroup +func (u *HostUserManagement) UpsertUser(name string, ui services.HostUsersInfo) (io.Closer, error) { + var groupErrs []error + // cloning to prevent unintended mutation of passed in Groups slice + ui.Groups = slices.Clone(ui.Groups) + for _, group := range append(ui.Groups, types.TeleportServiceGroup) { + if err := u.createGroupIfNotExist(group); err != nil { + groupErrs = append(groupErrs, err) + } } - if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_KEEP { - return nil, nil + if err := trace.NewAggregate(groupErrs...); err != nil { + return nil, trace.WrapWithMessage(err, "error while creating groups") } - closer := &userCloser{ - username: name, - users: u, - backend: u.backend, + var closer io.Closer + if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { + closer = &userCloser{ + username: name, + users: u, + backend: u.backend, + } + } + + if err := u.updateUser(name, ui); err != nil { + if !errors.Is(err, user.UnknownUserError(name)) { + return nil, trace.Wrap(err) + } + + if err := u.createUser(name, ui); err != nil { + return nil, trace.Wrap(err) + } } - return closer, trace.Wrap(err) + return closer, nil } func (u *HostUserManagement) doWithUserLock(f func(types.SemaphoreLease) error) error { diff --git a/lib/srv/usermgmt_linux.go b/lib/srv/usermgmt_linux.go index 6dcf085743233..aaeeaccc0eb1b 100644 --- a/lib/srv/usermgmt_linux.go +++ b/lib/srv/usermgmt_linux.go @@ -211,16 +211,16 @@ func readDefaultKey(key string, defaultValue string) (string, error) { return defaultValue, nil } -// readDefaultHome reads /etc/default/useradd for the HOME key, +// GetDefaultHomeDirectory reads /etc/default/useradd for the HOME key, // defaulting to "/home" and join it with the user for the user // home directory -func readDefaultHome(user string) (string, error) { +func (u *HostUsersProvisioningBackend) GetDefaultHomeDirectory(user string) (string, error) { const defaultHome = "/home" home, err := readDefaultKey("HOME", defaultHome) return filepath.Join(home, user), trace.Wrap(err) } -// readDefaultHome reads /etc/default/useradd for the SKEL key, defaulting to "/etc/skel" +// readDefaultSkel reads /etc/default/useradd for the SKEL key, defaulting to "/etc/skel" func readDefaultSkel() (string, error) { const defaultSkel = "/etc/skel" skel, err := readDefaultKey("SKEL", defaultSkel) diff --git a/lib/srv/usermgmt_other.go b/lib/srv/usermgmt_other.go index 66bb293a75ae5..6685b1c61b950 100644 --- a/lib/srv/usermgmt_other.go +++ b/lib/srv/usermgmt_other.go @@ -34,8 +34,3 @@ func newHostUsersBackend() (HostUsersBackend, error) { func newHostSudoersBackend(_ string) (HostSudoersBackend, error) { return nil, trace.NotImplemented("Host user creation management is only supported on linux") } - -//nolint:staticcheck // intended to always return an error for non-linux builds -func readDefaultHome(user string) (string, error) { - return "", trace.NotImplemented("readDefaultHome is only supported on linux") -} diff --git a/lib/srv/usermgmt_test.go b/lib/srv/usermgmt_test.go index 4725a9acc9070..4ed366019f9ba 100644 --- a/lib/srv/usermgmt_test.go +++ b/lib/srv/usermgmt_test.go @@ -162,6 +162,10 @@ func (tm *testHostUserBackend) CreateHomeDirectory(user, uid, gid string) error return nil } +func (tm *testHostUserBackend) GetDefaultHomeDirectory(user string) (string, error) { + return "", nil +} + // RemoveSudoersFile implements HostUsersBackend func (tm *testHostUserBackend) RemoveSudoersFile(user string) error { delete(tm.sudoers, user) @@ -206,24 +210,29 @@ func TestUserMgmt_CreateTemporaryUser(t *testing.T) { storage: pres, } - userinfo := &services.HostUsersInfo{ + userinfo := services.HostUsersInfo{ Groups: []string{"hello", "sudo"}, Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, } // create a user with some groups closer, err := users.UpsertUser("bob", userinfo) require.NoError(t, err) - require.NotNil(t, closer, "user closer was nil") + // NOTE (eriktate): assert.Nil and assert.NotNil will pass for nil interfaces where nilInterface != nil. + // assert.Equal and assert.NotEqual perform the same comparisons we would in non-test code and are safer + // for interface types. + // + // https://glucn.com/posts/2019-05-20-golang-an-interface-holding-a-nil-value-is-not-nil + require.NotEqual(t, nil, closer, "user closer was nil") // temproary users must always include the teleport-service group require.Equal(t, []string{ "hello", "sudo", types.TeleportServiceGroup, }, backend.users["bob"]) - // try creat the same user again + // try create the same user again secondCloser, err := users.UpsertUser("bob", userinfo) require.NoError(t, err) - require.NotNil(t, secondCloser) + require.NotEqual(t, nil, secondCloser) // Close will remove the user if the user is in the teleport-system group require.NoError(t, closer.Close()) @@ -235,7 +244,7 @@ func TestUserMgmt_CreateTemporaryUser(t *testing.T) { // try to create a temporary user for simon closer, err = users.UpsertUser("simon", userinfo) require.NoError(t, err) - require.Nil(t, closer) + require.NotEqual(t, nil, closer) } func TestUserMgmtSudoers_CreateTemporaryUser(t *testing.T) { @@ -253,12 +262,12 @@ func TestUserMgmtSudoers_CreateTemporaryUser(t *testing.T) { backend: backend, } - closer, err := users.UpsertUser("bob", &services.HostUsersInfo{ + closer, err := users.UpsertUser("bob", services.HostUsersInfo{ Groups: []string{"hello", "sudo"}, Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, }) require.NoError(t, err) - require.NotNil(t, closer) + require.NotEqual(t, nil, closer) require.Empty(t, backend.sudoers) sudoers.WriteSudoers("bob", []string{"validsudoers"}) @@ -277,12 +286,12 @@ func TestUserMgmtSudoers_CreateTemporaryUser(t *testing.T) { // test user already exists but teleport-service group has not yet // been created backend.CreateUser("testuser", nil, "", "", "") - _, err := users.UpsertUser("testuser", &services.HostUsersInfo{ + _, err := users.UpsertUser("testuser", services.HostUsersInfo{ Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, }) require.NoError(t, err) backend.CreateGroup(types.TeleportServiceGroup, "") - _, err = users.UpsertUser("testuser", &services.HostUsersInfo{ + _, err = users.UpsertUser("testuser", services.HostUsersInfo{ Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, }) require.NoError(t, err) @@ -321,7 +330,10 @@ func TestUserMgmt_DeleteAllTeleportSystemUsers(t *testing.T) { mgmt.CreateGroup(group, "") } if slices.Contains(user.groups, types.TeleportServiceGroup) { - users.UpsertUser(user.user, &services.HostUsersInfo{Groups: user.groups}) + users.UpsertUser(user.user, services.HostUsersInfo{ + Groups: user.groups, + Mode: types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, + }) } else { mgmt.CreateUser(user.user, user.groups, "", "", "") } @@ -404,29 +416,71 @@ func TestUpdateUserGroups(t *testing.T) { require.NoError(t, backend.CreateGroup(group, "")) } - userinfo := &services.HostUsersInfo{ + userinfo := services.HostUsersInfo{ Groups: allGroups[:2], Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, } + // Create a user with some groups. closer, err := users.UpsertUser("alice", userinfo) assert.NoError(t, err) - assert.Nil(t, closer) + assert.Equal(t, nil, closer) assert.Zero(t, backend.setUserGroupsCalls) assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) // Update user with new groups. userinfo.Groups = allGroups[2:] + closer, err = users.UpsertUser("alice", userinfo) assert.NoError(t, err) - assert.Nil(t, closer) + assert.Equal(t, nil, closer) assert.Equal(t, 1, backend.setUserGroupsCalls) assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) // Upsert again with same groups should not call SetUserGroups. closer, err = users.UpsertUser("alice", userinfo) assert.NoError(t, err) - assert.Nil(t, closer) + assert.Equal(t, nil, closer) + assert.Equal(t, 1, backend.setUserGroupsCalls) + assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) +} + +func Test_DontDropExistingUser(t *testing.T) { + t.Parallel() + + backend := newTestUserMgmt() + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + pres := local.NewPresenceService(bk) + users := HostUserManagement{ + backend: backend, + storage: pres, + } + + allGroups := []string{"foo", "bar", "baz", "quux"} + for _, group := range allGroups { + require.NoError(t, backend.CreateGroup(group, "")) + } + + userinfo := services.HostUsersInfo{ + Groups: allGroups[:2], + Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, + } + + // Create a user with some groups. + closer, err := users.UpsertUser("alice", userinfo) + assert.NoError(t, err) + assert.Equal(t, nil, closer) + assert.Zero(t, backend.setUserGroupsCalls) + assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) + + // Upserting an existing user in INSECURE_DROP mode shouldn't make them ephemeral + userinfo.Mode = types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP + userinfo.Groups = allGroups[2:] + closer, err = users.UpsertUser("alice", userinfo) + assert.NoError(t, err) + assert.NotEqual(t, nil, closer) assert.Equal(t, 1, backend.setUserGroupsCalls) assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) + assert.NotContains(t, backend.users["alice"], types.TeleportServiceGroup) } From 2982d5c929d50e079ab3cd1cc2b71d844e935651 Mon Sep 17 00:00:00 2001 From: Evan Freed <2314084+evanfreed@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:23:50 -0500 Subject: [PATCH 04/51] [16.1.7] cloud docs (#45471) * bump cloud docs to 16.1.6 Signed-off-by: Evan Freed * bump to 16.1.7 Signed-off-by: Evan Freed --------- Signed-off-by: Evan Freed --- docs/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config.json b/docs/config.json index a6f54d47106bb..156ff0f6a64fc 100644 --- a/docs/config.json +++ b/docs/config.json @@ -107,7 +107,7 @@ "icon": "book", "title": "References", "entries": [], - "generateFrom": "reference" + "generateFrom": "reference" } ], "variables": { @@ -128,7 +128,7 @@ "aws_secret_access_key": "zyxw9876-this-is-an-example" }, "cloud": { - "version": "16.1.0", + "version": "16.1.7", "major_version": "16", "sla": { "monthly_percentage": "99.9%", From b282143c87706b0222ecb3c86459d17a69e4eed6 Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Fri, 16 Aug 2024 13:12:26 -0700 Subject: [PATCH 05/51] split SSH and TLS keys in AuthenticateSSHUser (#45448) * split AuthenticateSSHUser * add tests --- lib/auth/auth_login_test.go | 52 +++++++++++++++++++------ lib/auth/auth_test.go | 77 +++++++++++++++++++------------------ lib/auth/authclient/clt.go | 37 ++++++++++++++++-- lib/auth/methods.go | 32 +++++++++------ lib/auth/tls_test.go | 17 ++------ 5 files changed, 138 insertions(+), 77 deletions(-) diff --git a/lib/auth/auth_login_test.go b/lib/auth/auth_login_test.go index 6b1bc4fccfe02..01e5b523b7f9a 100644 --- a/lib/auth/auth_login_test.go +++ b/lib/auth/auth_login_test.go @@ -873,6 +873,19 @@ func TestCreateRegisterChallenge_unusableDevice(t *testing.T) { // -----END PRIVATE KEY----- const sshPubKey = `ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGv+gN2C23P08ieJRA9gU/Ik4bsOh3Kw193UYscJDw41mATj+Kqyf45Rmj8F8rs3i7mYKRXXu1IjNRBzNgpXxqc=` +// tlsPubKey is a randomly-generated public key used for login tests. +// +// The corresponding private key is: +// -----BEGIN EC PRIVATE KEY----- +// MHcCAQEEINmdcjzor3czsAVpSYFJCjs/623gDfMcFE2AIcGTYZARoAoGCCqGSM49 +// AwEHoUQDQgAE/Jn3tYhc60M2IOen1yRht6r8xX3hv7nNLYBIfxaKxXf+dAFVllYz +// VUrSzAQxi1LSAplOJVgOtHv0J69dRSUSzA== +// -----END EC PRIVATE KEY----- +const tlsPubKey = `-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/Jn3tYhc60M2IOen1yRht6r8xX3h +v7nNLYBIfxaKxXf+dAFVllYzVUrSzAQxi1LSAplOJVgOtHv0J69dRSUSzA== +-----END PUBLIC KEY-----` + func TestServer_AuthenticateUser_passwordOnly(t *testing.T) { t.Parallel() @@ -896,7 +909,7 @@ func TestServer_AuthenticateUser_passwordOnly(t *testing.T) { })) } } - t.Run("ssh", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { + t.Run("ssh single key", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { req.PublicKey = []byte(sshPubKey) _, err := s.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: req, @@ -904,6 +917,15 @@ func TestServer_AuthenticateUser_passwordOnly(t *testing.T) { }) return err })) + t.Run("ssh split keys", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { + req.SSHPublicKey = []byte(sshPubKey) + req.TLSPublicKey = []byte(tlsPubKey) + _, err := s.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ + AuthenticateUserRequest: req, + TTL: 24 * time.Hour, + }) + return err + })) t.Run("web", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { _, err := s.AuthenticateWebUser(ctx, req) return err @@ -972,7 +994,8 @@ func TestServer_AuthenticateUser_passwordOnly_failure(t *testing.T) { } } t.Run(test.name+"/ssh", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { - req.PublicKey = []byte(sshPubKey) + req.SSHPublicKey = []byte(sshPubKey) + req.TLSPublicKey = []byte(tlsPubKey) _, err := s.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: req, TTL: 24 * time.Hour, @@ -1027,7 +1050,8 @@ func TestServer_AuthenticateUser_setsPasswordState(t *testing.T) { } } t.Run("ssh", makeRun(func(s *Server, req authclient.AuthenticateUserRequest) error { - req.PublicKey = []byte(sshPubKey) + req.SSHPublicKey = []byte(sshPubKey) + req.TLSPublicKey = []byte(tlsPubKey) _, err := s.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: req, TTL: 24 * time.Hour, @@ -1075,8 +1099,9 @@ func TestServer_AuthenticateUser_mfaDevices(t *testing.T) { // Solve challenge (client-side) resp, err := test.solveChallenge(challenge) authReq := authclient.AuthenticateUserRequest{ - Username: username, - PublicKey: []byte(sshPubKey), + Username: username, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), } require.NoError(t, err) @@ -1204,8 +1229,9 @@ func TestServer_Authenticate_passwordless(t *testing.T) { authenticate: func(t *testing.T, resp *wantypes.CredentialAssertionResponse) { loginResp, err := proxyClient.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Webauthn: resp, - PublicKey: []byte(sshPubKey), + Webauthn: resp, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: 24 * time.Hour, }) @@ -1224,8 +1250,9 @@ func TestServer_Authenticate_passwordless(t *testing.T) { authenticate: func(t *testing.T, resp *wantypes.CredentialAssertionResponse) { loginResp, err := proxyClient.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Webauthn: resp, - PublicKey: []byte(sshPubKey), + Webauthn: resp, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: 24 * time.Hour, }) @@ -1270,9 +1297,10 @@ func TestServer_Authenticate_passwordless(t *testing.T) { // Fail a login attempt so have a non-empty list of attempts. _, err := proxyClient.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Webauthn: &wantypes.CredentialAssertionResponse{}, // bad response - PublicKey: []byte(sshPubKey), + Username: user, + Webauthn: &wantypes.CredentialAssertionResponse{}, // bad response + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: 24 * time.Hour, }) diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index cf027a047a90e..67a26656ec9e4 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -626,16 +626,13 @@ func TestAuthenticateSSHUser(t *testing.T) { role, err = s.a.UpsertRole(ctx, role) require.NoError(t, err) - kg := testauthority.New() - _, pub, err := kg.GetNewKeyPairFromPool() - require.NoError(t, err) - // Login to the root cluster. resp, err := s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -643,17 +640,18 @@ func TestAuthenticateSSHUser(t *testing.T) { require.NoError(t, err) require.Equal(t, user, resp.Username) // Verify the public key and principals in SSH cert. - inSSHPub, _, _, _, err := ssh.ParseAuthorizedKey(pub) + inSSHPub, _, _, _, err := ssh.ParseAuthorizedKey([]byte(sshPubKey)) require.NoError(t, err) gotSSHCert, err := sshutils.ParseCertificate(resp.Cert) require.NoError(t, err) require.Equal(t, inSSHPub, gotSSHCert.Key) require.Equal(t, []string{user, teleport.SSHSessionJoinPrincipal}, gotSSHCert.ValidPrincipals) // Verify the public key and Subject in TLS cert. - inCryptoPub := inSSHPub.(ssh.CryptoPublicKey).CryptoPublicKey() + inTLSPub, err := keys.ParsePublicKey([]byte(tlsPubKey)) + require.NoError(t, err) gotTLSCert, err := tlsca.ParseCertificatePEM(resp.TLSCert) require.NoError(t, err) - require.Equal(t, gotTLSCert.PublicKey, inCryptoPub) + require.Equal(t, gotTLSCert.PublicKey, inTLSPub) wantID := tlsca.Identity{ Username: user, Groups: []string{role.GetName()}, @@ -672,9 +670,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login to the leaf cluster. resp, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: "leaf.localhost", @@ -718,9 +717,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login specifying a valid kube cluster. It should appear in the TLS cert. resp, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -749,9 +749,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login without specifying kube cluster. Kube cluster in the certificate should be empty. resp, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -781,9 +782,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login specifying a valid kube cluster. It should appear in the TLS cert. resp, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -812,9 +814,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login without specifying kube cluster. Kube cluster in the certificate should be empty. resp, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -844,9 +847,10 @@ func TestAuthenticateSSHUser(t *testing.T) { // Login specifying an invalid kube cluster. This should fail. _, err = s.a.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Username: user, - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Username: user, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), @@ -1567,15 +1571,15 @@ func TestServer_AugmentContextUserCertificates(t *testing.T) { "UpsertPassword failed") // Authenticate and create certificates. - _, pub, err := testauthority.New().GetNewKeyPairFromPool() - require.NoError(t, err, "GetNewKeyPairFromPool failed") authResp, err := authServer.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ Username: username, Pass: &authclient.PassCreds{ Password: []byte(pass), }, - PublicKey: pub, + // TODO(nklaassen): support split SSH and TLS keys with device + // trust. + PublicKey: []byte(sshPubKey), }, TTL: 1 * time.Hour, }) @@ -1750,6 +1754,8 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { Pass: &authclient.PassCreds{ Password: []byte(pass), }, + // TODO(nklaassen): support split SSH and TLS keys with device + // trust. PublicKey: ssh.MarshalAuthorizedKey(sPubKey), }, TTL: 1 * time.Hour, @@ -2421,10 +2427,6 @@ func TestGenerateUserCertIPPinning(t *testing.T) { options.PinSourceIP = true pinnedRole.SetOptions(options) - keygen := testauthority.New() - _, pub, err := keygen.GetNewKeyPairFromPool() - require.NoError(t, err) - _, err = s.a.UpsertRole(ctx, pinnedRole) require.NoError(t, err) @@ -2460,8 +2462,9 @@ func TestGenerateUserCertIPPinning(t *testing.T) { baseAuthRequest := authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ - Pass: &authclient.PassCreds{Password: pass}, - PublicKey: pub, + Pass: &authclient.PassCreds{Password: pass}, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: time.Hour, RouteToCluster: s.clusterName.GetClusterName(), diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 66fafb23d32c4..15d56301da945 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -1267,8 +1267,16 @@ func (v *ValidateTrustedClusterResponseRaw) ToNative() (*ValidateTrustedClusterR type AuthenticateUserRequest struct { // Username is a username Username string `json:"username"` - // PublicKey is a public key in ssh authorized_keys format - PublicKey []byte `json:"public_key"` + + // PublicKey is a public key in ssh authorized_keys format. + // Soon to be deprecated in favor of SSHPublicKey, TLSPublicKey + PublicKey []byte `json:"public_key,omitempty"` + + // SSHPublicKey is a public key in ssh authorized_keys format. + SSHPublicKey []byte `json:"ssh_public_key,omitempty"` + // TLSPublicKey is a public key in PEM-encoded PKCS#1 or PKIX format. + TLSPublicKey []byte `json:"tls_public_key,omitempty"` + // Pass is a password used in local authentication schemes Pass *PassCreds `json:"pass,omitempty"` // Webauthn is a signed credential assertion, used in MFA authentication @@ -1337,8 +1345,17 @@ type AuthenticateSSHRequest struct { // KubernetesCluster sets the target kubernetes cluster for the TLS // certificate. This can be empty on older clients. KubernetesCluster string `json:"kubernetes_cluster"` + // AttestationStatement is an attestation statement associated with the given public key. + // Soon to be deprecated in favor of SSHAttestationStatement, TLSAttestationStatement. AttestationStatement *keys.AttestationStatement `json:"attestation_statement,omitempty"` + + // SSHAttestationStatement is an attestation statement associated with the + // given SSH public key. + SSHAttestationStatement *keys.AttestationStatement `json:"ssh_attestation_statement,omitempty"` + // TLSAttestationStatement is an attestation statement associated with the + // given TLS public key. + TLSAttestationStatement *keys.AttestationStatement `json:"tls_attestation_statement,omitempty"` } // CheckAndSetDefaults checks and sets default certificate values @@ -1346,8 +1363,20 @@ func (a *AuthenticateSSHRequest) CheckAndSetDefaults() error { if err := a.AuthenticateUserRequest.CheckAndSetDefaults(); err != nil { return trace.Wrap(err) } - if len(a.PublicKey) == 0 { - return trace.BadParameter("missing parameter 'public_key'") + if len(a.SSHPublicKey) == 0 && len(a.TLSPublicKey) == 0 && len(a.PublicKey) == 0 { + return trace.BadParameter("missing parameter: at least one of 'ssh_public_key', 'tls_public_key', 'public_key' must be set") + } + if len(a.PublicKey) != 0 && len(a.SSHPublicKey) != 0 { + return trace.BadParameter("both 'public_key' and 'ssh_public_key' are set") + } + if len(a.PublicKey) != 0 && len(a.TLSPublicKey) != 0 { + return trace.BadParameter("both 'public_key' and 'tls_public_key' are set") + } + if a.AttestationStatement != nil && a.SSHAttestationStatement != nil { + return trace.BadParameter("both 'attestation_statement' and 'ssh_attestation_statement' are set") + } + if a.AttestationStatement != nil && a.TLSAttestationStatement != nil { + return trace.BadParameter("both 'attestation_statement' and 'tls_attestation_statement' are set") } certificateFormat, err := utils.CheckCertificateFormatFlag(a.CompatibilityMode) if err != nil { diff --git a/lib/auth/methods.go b/lib/auth/methods.go index cba958b2ab6bf..faba1deea2740 100644 --- a/lib/auth/methods.go +++ b/lib/auth/methods.go @@ -497,6 +497,7 @@ func (a *Server) authenticateHeadless(ctx context.Context, req authclient.Authen } ha.State = types.HeadlessAuthenticationState_HEADLESS_AUTHENTICATION_STATE_PENDING + // TODO(nklaassen): support split SSH and TLS keys for headless auth. ha.PublicKey = req.PublicKey ha.ClientIpAddress = req.ClientMetadata.RemoteAddr if err := services.ValidateHeadlessAuthentication(ha); err != nil { @@ -534,6 +535,7 @@ func (a *Server) authenticateHeadless(ctx context.Context, req authclient.Authen if approvedHeadlessAuthn.User != req.Username { return nil, trace.AccessDenied("headless authentication user mismatch") } + // TODO(nklaassen): support split SSH and TLS keys for headless auth. if !bytes.Equal(req.PublicKey, ha.PublicKey) { return nil, trace.AccessDenied("headless authentication public key mismatch") } @@ -697,18 +699,25 @@ func (a *Server) AuthenticateSSHUser(ctx context.Context, req authclient.Authent return nil, trace.BadParameter("source IP pinning is enabled but client IP is unknown") } - // TODO(nklaassen): separate SSH and TLS keys. For now they are the same. - sshPublicKey := req.PublicKey - publicKey, err := sshutils.CryptoPublicKey(req.PublicKey) - if err != nil { - return nil, trace.Wrap(err) - } - tlsPublicKey, err := keys.MarshalPublicKey(publicKey) - if err != nil { - return nil, trace.Wrap(err) + sshPublicKey := req.SSHPublicKey + tlsPublicKey := req.TLSPublicKey + sshPublicKeyAttestationStatement := req.SSHAttestationStatement + tlsPublicKeyAttestationStatement := req.TLSAttestationStatement + if req.PublicKey != nil { + // TODO(nklaassen): DELETE IN 18.0.0 after all clients should be using + // the separated keys. + sshPublicKey = req.PublicKey + publicKey, err := sshutils.CryptoPublicKey(req.PublicKey) + if err != nil { + return nil, trace.Wrap(err) + } + tlsPublicKey, err = keys.MarshalPublicKey(publicKey) + if err != nil { + return nil, trace.Wrap(err) + } + sshPublicKeyAttestationStatement = req.AttestationStatement + tlsPublicKeyAttestationStatement = req.AttestationStatement } - sshPublicKeyAttestationStatement := req.AttestationStatement - tlsPublicKeyAttestationStatement := req.AttestationStatement certReq := certRequest{ user: user, @@ -731,6 +740,7 @@ func (a *Server) AuthenticateSSHUser(ctx context.Context, req authclient.Authent if err != nil { return nil, trace.Wrap(err) } + // TODO(nklaassen): support split keys for headless auth. if !bytes.Equal(req.PublicKey, ha.PublicKey) { return nil, trace.AccessDenied("headless authentication public key mismatch") } diff --git a/lib/auth/tls_test.go b/lib/auth/tls_test.go index 72573738d096c..aa13027e3f6c1 100644 --- a/lib/auth/tls_test.go +++ b/lib/auth/tls_test.go @@ -3002,15 +3002,6 @@ func TestCertificateFormat(t *testing.T) { ctx := context.Background() testSrv := newTestTLSServer(t) - priv, pub, err := testauthority.New().GenerateKeyPair() - require.NoError(t, err) - - // make sure we can parse the private and public key - _, err = ssh.ParsePrivateKey(priv) - require.NoError(t, err) - _, _, _, _, err = ssh.ParseAuthorizedKey(pub) - require.NoError(t, err) - // use admin client to create user and role user, userRole, err := CreateUserAndRole(testSrv.Auth(), "user", []string{"user"}, nil) require.NoError(t, err) @@ -3055,7 +3046,8 @@ func TestCertificateFormat(t *testing.T) { Pass: &authclient.PassCreds{ Password: pass, }, - PublicKey: pub, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, CompatibilityMode: ts.inClientCertificateFormat, TTL: apidefaults.CertDuration, @@ -3387,15 +3379,14 @@ func TestLoginNoLocalAuth(t *testing.T) { require.True(t, trace.IsAccessDenied(err)) // Make sure access is denied for SSH login. - _, pub, err := testauthority.New().GenerateKeyPair() - require.NoError(t, err) _, err = testSrv.Auth().AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ Username: user, Pass: &authclient.PassCreds{ Password: pass, }, - PublicKey: pub, + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, }) require.True(t, trace.IsAccessDenied(err)) From 9f694a138898bf819b319b8c7e6689d4a37bca48 Mon Sep 17 00:00:00 2001 From: Andrew Burke <31974658+atburke@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:15:21 -0700 Subject: [PATCH 06/51] Add static host users gRPC service (#45292) This change adds the gRPC service for static host users. --- api/client/client.go | 7 + api/client/statichostuser/statichostuser.go | 94 +++++ lib/auth/auth.go | 9 + lib/auth/grpcserver.go | 11 + lib/auth/init.go | 4 + lib/auth/statichostuser/service.go | 176 +++++++++ lib/auth/statichostuser/service_test.go | 386 ++++++++++++++++++++ 7 files changed, 687 insertions(+) create mode 100644 api/client/statichostuser/statichostuser.go create mode 100644 lib/auth/statichostuser/service.go create mode 100644 lib/auth/statichostuser/service_test.go diff --git a/api/client/client.go b/api/client/client.go index 0036f57058b6e..6acf49c91e262 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -59,6 +59,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/scim" "github.com/gravitational/teleport/api/client/secreport" + statichostuserclient "github.com/gravitational/teleport/api/client/statichostuser" "github.com/gravitational/teleport/api/client/userloginstate" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/defaults" @@ -86,6 +87,7 @@ import ( secreportsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/secreports/v1" trustpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" userloginstatev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" userpreferencespb "github.com/gravitational/teleport/api/gen/proto/go/userpreferences/v1" @@ -3184,6 +3186,11 @@ func (c *Client) DeleteKubernetesWaitingContainer(ctx context.Context, req *kube return c.GetKubernetesWaitingContainerClient().DeleteKubernetesWaitingContainer(ctx, req) } +// StaticHostUserClient returns a new static host user client. +func (c *Client) StaticHostUserClient() *statichostuserclient.Client { + return statichostuserclient.NewClient(userprovisioningpb.NewStaticHostUsersServiceClient(c.conn)) +} + // CreateDatabase creates a new database resource. func (c *Client) CreateDatabase(ctx context.Context, database types.Database) error { databaseV3, ok := database.(*types.DatabaseV3) diff --git a/api/client/statichostuser/statichostuser.go b/api/client/statichostuser/statichostuser.go new file mode 100644 index 0000000000000..f8100ff9998fc --- /dev/null +++ b/api/client/statichostuser/statichostuser.go @@ -0,0 +1,94 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package statichostuser + +import ( + "context" + + "github.com/gravitational/trace" + + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" +) + +// Client is a StaticHostUser client. +type Client struct { + grpcClient userprovisioningpb.StaticHostUsersServiceClient +} + +// NewClient creates a new StaticHostUser client. +func NewClient(grpcClient userprovisioningpb.StaticHostUsersServiceClient) *Client { + return &Client{ + grpcClient: grpcClient, + } +} + +// ListStaticHostUsers lists static host users. +func (c *Client) ListStaticHostUsers(ctx context.Context, pageSize int, pageToken string) ([]*userprovisioningpb.StaticHostUser, string, error) { + resp, err := c.grpcClient.ListStaticHostUsers(ctx, &userprovisioningpb.ListStaticHostUsersRequest{ + PageSize: int32(pageSize), + PageToken: pageToken, + }) + if err != nil { + return nil, "", trace.Wrap(err) + } + return resp.Users, resp.NextPageToken, nil +} + +// GetStaticHostUser returns a static host user by name. +func (c *Client) GetStaticHostUser(ctx context.Context, name string) (*userprovisioningpb.StaticHostUser, error) { + if name == "" { + return nil, trace.BadParameter("missing name") + } + out, err := c.grpcClient.GetStaticHostUser(ctx, &userprovisioningpb.GetStaticHostUserRequest{ + Name: name, + }) + return out, trace.Wrap(err) +} + +// CreateStaticHostUser creates a static host user. +func (c *Client) CreateStaticHostUser(ctx context.Context, in *userprovisioningpb.StaticHostUser) (*userprovisioningpb.StaticHostUser, error) { + out, err := c.grpcClient.CreateStaticHostUser(ctx, &userprovisioningpb.CreateStaticHostUserRequest{ + User: in, + }) + return out, trace.Wrap(err) +} + +// UpdateStaticHostUser updates a static host user. +func (c *Client) UpdateStaticHostUser(ctx context.Context, in *userprovisioningpb.StaticHostUser) (*userprovisioningpb.StaticHostUser, error) { + out, err := c.grpcClient.UpdateStaticHostUser(ctx, &userprovisioningpb.UpdateStaticHostUserRequest{ + User: in, + }) + return out, trace.Wrap(err) +} + +// UpsertStaticHostUser upserts a static host user. +func (c *Client) UpsertStaticHostUser(ctx context.Context, in *userprovisioningpb.StaticHostUser) (*userprovisioningpb.StaticHostUser, error) { + out, err := c.grpcClient.UpsertStaticHostUser(ctx, &userprovisioningpb.UpsertStaticHostUserRequest{ + User: in, + }) + return out, trace.Wrap(err) +} + +// DeleteStaticHostUser deletes a static host user. Note that this does not +// remove any host users created on nodes from the resource. +func (c *Client) DeleteStaticHostUser(ctx context.Context, name string) error { + if name == "" { + return trace.BadParameter("missing name") + } + _, err := c.grpcClient.DeleteStaticHostUser(ctx, &userprovisioningpb.DeleteStaticHostUserRequest{ + Name: name, + }) + return trace.Wrap(err) +} diff --git a/lib/auth/auth.go b/lib/auth/auth.go index fd73856e97888..ea5a1814dc0d6 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -395,6 +395,13 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { } } + if cfg.StaticHostUsers == nil { + cfg.StaticHostUsers, err = local.NewStaticHostUserService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + } + closeCtx, cancelFunc := context.WithCancel(context.TODO()) services := &Services{ TrustInternal: cfg.Trust, @@ -434,6 +441,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { CrownJewels: cfg.CrownJewels, BotInstance: cfg.BotInstance, SPIFFEFederations: cfg.SPIFFEFederations, + StaticHostUser: cfg.StaticHostUsers, } as := Server{ @@ -631,6 +639,7 @@ type Services struct { services.AccessGraphSecretsGetter services.DevicesGetter services.SPIFFEFederations + services.StaticHostUser } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 368bf60215f85..64f66f9549acf 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -66,6 +66,7 @@ import ( presencev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/presence/v1" trustpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" userloginstatev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" userpreferencespb "github.com/gravitational/teleport/api/gen/proto/go/userpreferences/v1" @@ -89,6 +90,7 @@ import ( notifications "github.com/gravitational/teleport/lib/auth/notifications/notificationsv1" "github.com/gravitational/teleport/lib/auth/okta" "github.com/gravitational/teleport/lib/auth/presence/presencev1" + statichostuserv1 "github.com/gravitational/teleport/lib/auth/statichostuser" "github.com/gravitational/teleport/lib/auth/trust/trustv1" "github.com/gravitational/teleport/lib/auth/userloginstate" "github.com/gravitational/teleport/lib/auth/userpreferences/userpreferencesv1" @@ -5404,6 +5406,15 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { vnetConfigServiceServer := vnetconfig.NewService(vnetConfigStorage, cfg.Authorizer) vnet.RegisterVnetConfigServiceServer(server, vnetConfigServiceServer) + staticHostUserServer, err := statichostuserv1.NewService(statichostuserv1.ServiceConfig{ + Authorizer: cfg.Authorizer, + Backend: cfg.AuthServer.Services, + }) + if err != nil { + return nil, trace.Wrap(err) + } + userprovisioningpb.RegisterStaticHostUsersServiceServer(server, staticHostUserServer) + // Only register the service if this is an open source build. Enterprise builds // register the actual service via an auth plugin, if we register here then all // Enterprise builds would fail with a duplicate service registered error. diff --git a/lib/auth/init.go b/lib/auth/init.go index 64aae856f22e2..974ae19f13cda 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -309,6 +309,10 @@ type InitConfig struct { // SPIFFEFederations is a service that manages storing SPIFFE federations. SPIFFEFederations services.SPIFFEFederations + + // StaticHostUsers is a service that manages host users that should be + // created on SSH nodes. + StaticHostUsers services.StaticHostUser } // Init instantiates and configures an instance of AuthServer diff --git a/lib/auth/statichostuser/service.go b/lib/auth/statichostuser/service.go new file mode 100644 index 0000000000000..e216a21f5a74b --- /dev/null +++ b/lib/auth/statichostuser/service.go @@ -0,0 +1,176 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package statichostuser + +import ( + "context" + + "github.com/gravitational/trace" + "google.golang.org/protobuf/types/known/emptypb" + + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/services" +) + +// ServiceConfig holds configuration options for the static host user gRPC service. +type ServiceConfig struct { + // Authorizer is the authorizer used to check access to resources. + Authorizer authz.Authorizer + // Backend is the backend used to store static host users. + Backend services.StaticHostUser + // TODO(atburke): add cache +} + +// Service implements the static host user RPC service. +type Service struct { + userprovisioningpb.UnimplementedStaticHostUsersServiceServer + + authorizer authz.Authorizer + backend services.StaticHostUser +} + +// NewService creates a new static host user gRPC service. +func NewService(cfg ServiceConfig) (*Service, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + } + + return &Service{ + authorizer: cfg.Authorizer, + backend: cfg.Backend, + }, nil +} + +// ListStaticHostUsers lists static host users. +func (s *Service) ListStaticHostUsers(ctx context.Context, req *userprovisioningpb.ListStaticHostUsersRequest) (*userprovisioningpb.ListStaticHostUsersResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbList, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + // TODO(atburke): Switch to using the cache after static host users have been added to the cache. + users, nextToken, err := s.backend.ListStaticHostUsers(ctx, int(req.PageSize), req.PageToken) + if err != nil { + return nil, trace.Wrap(err) + } + return &userprovisioningpb.ListStaticHostUsersResponse{ + Users: users, + NextPageToken: nextToken, + }, nil +} + +// GetStaticHostUser returns a static host user by name. +func (s *Service) GetStaticHostUser(ctx context.Context, req *userprovisioningpb.GetStaticHostUserRequest) (*userprovisioningpb.StaticHostUser, error) { + if req.Name == "" { + return nil, trace.BadParameter("missing name") + } + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + // TODO(atburke): Switch to using the cache after static host users have been added to the cache. + out, err := s.backend.GetStaticHostUser(ctx, req.Name) + return out, trace.Wrap(err) +} + +// CreateStaticHostUser creates a static host user. +func (s *Service) CreateStaticHostUser(ctx context.Context, req *userprovisioningpb.CreateStaticHostUserRequest) (*userprovisioningpb.StaticHostUser, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + out, err := s.backend.CreateStaticHostUser(ctx, req.User) + return out, trace.Wrap(err) +} + +// UpdateStaticHostUser updates a static host user. +func (s *Service) UpdateStaticHostUser(ctx context.Context, req *userprovisioningpb.UpdateStaticHostUserRequest) (*userprovisioningpb.StaticHostUser, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + out, err := s.backend.UpdateStaticHostUser(ctx, req.User) + return out, trace.Wrap(err) +} + +// UpsertStaticHostUser upserts a static host user. +func (s *Service) UpsertStaticHostUser(ctx context.Context, req *userprovisioningpb.UpsertStaticHostUserRequest) (*userprovisioningpb.StaticHostUser, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbCreate, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + out, err := s.backend.UpsertStaticHostUser(ctx, req.User) + return out, trace.Wrap(err) +} + +// DeleteStaticHostUser deletes a static host user. Note that this does not +// remove any host users created on nodes from the resource. +func (s *Service) DeleteStaticHostUser(ctx context.Context, req *userprovisioningpb.DeleteStaticHostUserRequest) (*emptypb.Empty, error) { + if req.Name == "" { + return nil, trace.BadParameter("missing name") + } + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindStaticHostUser, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, trace.Wrap(s.backend.DeleteStaticHostUser(ctx, req.Name)) +} diff --git a/lib/auth/statichostuser/service_test.go b/lib/auth/statichostuser/service_test.go new file mode 100644 index 0000000000000..1d6854ad8d1fc --- /dev/null +++ b/lib/auth/statichostuser/service_test.go @@ -0,0 +1,386 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package statichostuser + +import ( + "context" + "fmt" + "testing" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/userprovisioning" + "github.com/gravitational/teleport/api/types/wrappers" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/tlsca" +) + +type authorizerFactory func(t *testing.T, client localClient) authz.Authorizer + +func staticHostUserName(i int) string { + return fmt.Sprintf("user-%d", i) +} + +func makeStaticHostUser(i int) *userprovisioningpb.StaticHostUser { + name := staticHostUserName(i) + return userprovisioning.NewStaticHostUser(name, &userprovisioningpb.StaticHostUserSpec{ + Login: name, + Groups: []string{"foo", "bar"}, + NodeLabels: &wrappers.LabelValues{ + Values: map[string]wrappers.StringValues{ + "foo": { + Values: []string{"bar"}, + }, + }, + }, + }) +} + +func authorizeWithVerbs(verbs []string, mfaVerified bool) authorizerFactory { + return func(t *testing.T, client localClient) authz.Authorizer { + return authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { + authzContext := authorizerForDummyUser(t, ctx, client, verbs) + if mfaVerified { + authzContext.AdminActionAuthState = authz.AdminActionAuthMFAVerified + } else { + authzContext.AdminActionAuthState = authz.AdminActionAuthUnauthorized + } + return authzContext, nil + }) + } +} + +func assertTraceErr(f func(error) bool) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, _ ...any) { + require.Error(t, err) + require.True(t, f(err), "unexpected error: %v", err) + } +} + +func TestStaticHostUserCRUD(t *testing.T) { + t.Parallel() + + accessTests := []struct { + name string + request func(ctx context.Context, svc *Service, localSvc *local.StaticHostUserService) error + allowVerbs []string + }{ + { + name: "list", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.ListStaticHostUsers(ctx, &userprovisioningpb.ListStaticHostUsersRequest{}) + return err + }, + allowVerbs: []string{types.VerbList, types.VerbRead}, + }, + { + name: "get", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.GetStaticHostUser(ctx, &userprovisioningpb.GetStaticHostUserRequest{ + Name: staticHostUserName(0), + }) + return err + }, + allowVerbs: []string{types.VerbRead}, + }, + { + name: "create", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.CreateStaticHostUser(ctx, &userprovisioningpb.CreateStaticHostUserRequest{ + User: makeStaticHostUser(10), + }) + return err + }, + allowVerbs: []string{types.VerbCreate}, + }, + { + name: "update", + request: func(ctx context.Context, svc *Service, localSvc *local.StaticHostUserService) error { + // Get the initial user from the local service to bypass RBAC. + hostUser, err := localSvc.GetStaticHostUser(ctx, staticHostUserName(0)) + if err != nil { + return trace.Wrap(err) + } + hostUser.Spec.Login = "bob" + _, err = svc.UpdateStaticHostUser(ctx, &userprovisioningpb.UpdateStaticHostUserRequest{ + User: hostUser, + }) + return err + }, + allowVerbs: []string{types.VerbRead, types.VerbUpdate}, + }, + { + name: "upsert", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.UpsertStaticHostUser(ctx, &userprovisioningpb.UpsertStaticHostUserRequest{ + User: makeStaticHostUser(10), + }) + return err + }, + allowVerbs: []string{types.VerbCreate, types.VerbUpdate}, + }, + { + name: "delete", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.DeleteStaticHostUser(ctx, &userprovisioningpb.DeleteStaticHostUserRequest{ + Name: staticHostUserName(0), + }) + return err + }, + allowVerbs: []string{types.VerbDelete}, + }, + } + + for _, tc := range accessTests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + + t.Run("allow", func(t *testing.T) { + t.Parallel() + // Create authorizer with required verbs. + authorizer := authorizeWithVerbs(tc.allowVerbs, true) + // CRUD action should succeed. + testStaticHostUserAccess(t, authorizer, tc.request, require.NoError) + }) + + t.Run("deny rbac", func(t *testing.T) { + t.Parallel() + // Create authorizer without required verbs. + authorizer := authorizeWithVerbs(nil, true) + // CRUD action should fail. + testStaticHostUserAccess(t, authorizer, tc.request, assertTraceErr(trace.IsAccessDenied)) + }) + + t.Run("deny mfa", func(t *testing.T) { + t.Parallel() + // Create authorizer without verified MFA. + authorizer := authorizeWithVerbs(tc.allowVerbs, false) + // CRUD action should fail. + testStaticHostUserAccess(t, authorizer, tc.request, assertTraceErr(trace.IsAccessDenied)) + }) + }) + } + + otherTests := []struct { + name string + request func(ctx context.Context, svc *Service, localSvc *local.StaticHostUserService) error + verbs []string + assert require.ErrorAssertionFunc + }{ + { + name: "get nonexistent resource", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.GetStaticHostUser(ctx, &userprovisioningpb.GetStaticHostUserRequest{ + Name: "fake", + }) + return err + }, + verbs: []string{types.VerbRead}, + assert: assertTraceErr(trace.IsNotFound), + }, + { + name: "create resource twice", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.CreateStaticHostUser(ctx, &userprovisioningpb.CreateStaticHostUserRequest{ + User: makeStaticHostUser(0), + }) + return err + }, + verbs: []string{types.VerbCreate}, + assert: assertTraceErr(trace.IsAlreadyExists), + }, + { + name: "delete nonexisting resource", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.DeleteStaticHostUser(ctx, &userprovisioningpb.DeleteStaticHostUserRequest{ + Name: staticHostUserName(10), + }) + return err + }, + verbs: []string{types.VerbDelete}, + assert: assertTraceErr(trace.IsNotFound), + }, + { + name: "update with wrong revision", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.UpdateStaticHostUser(ctx, &userprovisioningpb.UpdateStaticHostUserRequest{ + User: makeStaticHostUser(0), + }) + return err + }, + verbs: []string{types.VerbUpdate}, + assert: assertTraceErr(trace.IsCompareFailed), + }, + { + name: "update nonexistent resource", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.UpdateStaticHostUser(ctx, &userprovisioningpb.UpdateStaticHostUserRequest{ + User: makeStaticHostUser(10), + }) + return err + }, + verbs: []string{types.VerbUpdate}, + assert: assertTraceErr(trace.IsCompareFailed), + }, + { + name: "upsert with update permission only", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.UpsertStaticHostUser(ctx, &userprovisioningpb.UpsertStaticHostUserRequest{ + User: makeStaticHostUser(0), + }) + return err + }, + verbs: []string{types.VerbUpdate}, + assert: assertTraceErr(trace.IsAccessDenied), + }, + { + name: "upsert with create permission only", + request: func(ctx context.Context, svc *Service, _ *local.StaticHostUserService) error { + _, err := svc.UpsertStaticHostUser(ctx, &userprovisioningpb.UpsertStaticHostUserRequest{ + User: makeStaticHostUser(10), + }) + return err + }, + verbs: []string{types.VerbCreate}, + assert: assertTraceErr(trace.IsAccessDenied), + }, + } + for _, tc := range otherTests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + authorizer := authorizeWithVerbs(tc.verbs, true) + testStaticHostUserAccess(t, authorizer, tc.request, tc.assert) + }) + } +} + +func testStaticHostUserAccess( + t *testing.T, + authorizer func(t *testing.T, client localClient) authz.Authorizer, + request func(ctx context.Context, svc *Service, localSvc *local.StaticHostUserService) error, + assert require.ErrorAssertionFunc, +) { + ctx, resourceSvc, localSvc := initSvc(t, authorizer) + err := request(ctx, resourceSvc, localSvc) + assert(t, err) +} + +func authorizerForDummyUser(t *testing.T, ctx context.Context, localClient localClient, roleVerbs []string) *authz.Context { + const clusterName = "localhost" + + // Create role + roleName := "role-" + uuid.NewString() + var allowRules []types.Rule + if len(roleVerbs) != 0 { + allowRules = []types.Rule{ + { + Resources: []string{types.KindStaticHostUser}, + Verbs: roleVerbs, + }, + } + } + role, err := types.NewRole(roleName, types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: allowRules}, + }) + require.NoError(t, err) + + role, err = localClient.CreateRole(ctx, role) + require.NoError(t, err) + + // Create user + user, err := types.NewUser("user-" + uuid.NewString()) + require.NoError(t, err) + user.AddRole(roleName) + user, err = localClient.CreateUser(ctx, user) + require.NoError(t, err) + + localUser := authz.LocalUser{ + Username: user.GetName(), + Identity: tlsca.Identity{ + Username: user.GetName(), + Groups: []string{role.GetName()}, + }, + } + authCtx, err := authz.ContextForLocalUser(ctx, localUser, localClient, clusterName, true) + require.NoError(t, err) + + return authCtx +} + +type localClient interface { + authz.AuthorizerAccessPoint + + CreateUser(ctx context.Context, user types.User) (types.User, error) + CreateRole(ctx context.Context, role types.Role) (types.Role, error) +} + +func initSvc(t *testing.T, authorizerFn func(t *testing.T, client localClient) authz.Authorizer) (context.Context, *Service, *local.StaticHostUserService) { + ctx := context.Background() + backend, err := memory.New(memory.Config{}) + require.NoError(t, err) + + roleSvc := local.NewAccessService(backend) + userSvc := local.NewTestIdentityService(backend) + clusterSrv, err := local.NewClusterConfigurationService(backend) + require.NoError(t, err) + caSrv := local.NewCAService(backend) + + clusterConfigSvc, err := local.NewClusterConfigurationService(backend) + require.NoError(t, err) + _, err = clusterConfigSvc.UpsertAuthPreference(ctx, types.DefaultAuthPreference()) + require.NoError(t, err) + _, err = clusterConfigSvc.UpsertClusterAuditConfig(ctx, types.DefaultClusterAuditConfig()) + require.NoError(t, err) + _, err = clusterConfigSvc.UpsertClusterNetworkingConfig(ctx, types.DefaultClusterNetworkingConfig()) + require.NoError(t, err) + _, err = clusterConfigSvc.UpsertSessionRecordingConfig(ctx, types.DefaultSessionRecordingConfig()) + require.NoError(t, err) + + localResourceService, err := local.NewStaticHostUserService(backend) + require.NoError(t, err) + for i := 0; i < 10; i++ { + _, err := localResourceService.CreateStaticHostUser(ctx, makeStaticHostUser(i)) + require.NoError(t, err) + } + + client := struct { + *local.AccessService + *local.IdentityService + *local.ClusterConfigurationService + *local.CA + }{ + AccessService: roleSvc, + IdentityService: userSvc, + ClusterConfigurationService: clusterSrv, + CA: caSrv, + } + + resourceSvc, err := NewService(ServiceConfig{ + Authorizer: authorizerFn(t, client), + Backend: localResourceService, + }) + require.NoError(t, err) + + return ctx, resourceSvc, localResourceService +} From 186c0602252798bdce498ec091dad5dbc82a63cf Mon Sep 17 00:00:00 2001 From: "M.C.M." Date: Fri, 16 Aug 2024 14:03:30 -0700 Subject: [PATCH 07/51] redirect for broken access graph link (#45567) --- docs/config.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/config.json b/docs/config.json index 156ff0f6a64fc..aeb3cf408111f 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1636,6 +1636,11 @@ "destination": "/enroll-resources/database-access/enroll-managed-databases/snowflake/", "permanent": true }, + { + "source": "/access-controls/access-graph/", + "destination": "/admin-guides/deploy-a-cluster/access-graph/access-graph/", + "permanent": true + }, { "source": "/access-controls/access-graph/aws-sync/", "destination": "/admin-guides/teleport-policy/integrations/aws-sync/", From 1fdef401b3b1c7eda5e77df0a387b3d14197608a Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Fri, 16 Aug 2024 14:41:09 -0700 Subject: [PATCH 08/51] Device Trust Web support for split SSH and TLS keys (#45513) --- lib/auth/auth.go | 26 ++++++++++++++++++++++---- lib/auth/auth_test.go | 32 ++++++++++++++++++-------------- lib/auth/helpers.go | 3 +++ 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index ea5a1814dc0d6..702d3102721fc 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -2397,9 +2397,15 @@ type DeviceExtensions tlsca.DeviceExtensions type AugmentUserCertificateOpts struct { // SSHAuthorizedKey is an SSH certificate, in the authorized key format, to // augment with opts. - // The SSH certificate must be issued for the current authenticated user and - // must match their TLS certificate. + // The SSH certificate must be issued for the current authenticated user, + // and either: + // - the public key must match their TLS certificate, or + // - SSHKeySatisfiedChallenge must be true. SSHAuthorizedKey []byte + // SSHKeySatisfiedChallenge will be true if the user has already + // proven that they own the private key associated with SSHAuthorizedKey by + // satisfying a signature challenge. + SSHKeySatisfiedChallenge bool // DeviceExtensions are the device-aware extensions to add to the certificates // being augmented. DeviceExtensions *DeviceExtensions @@ -2439,6 +2445,7 @@ func (a *Server) AugmentContextUserCertificates( x509Cert: x509Cert, x509Identity: &identity, sshAuthorizedKey: opts.SSHAuthorizedKey, + sshKeyVerified: opts.SSHKeySatisfiedChallenge, deviceExtensions: opts.DeviceExtensions, }) } @@ -2514,12 +2521,18 @@ func (a *Server) AugmentWebSessionCertificates(ctx context.Context, opts *Augmen return trace.Wrap(err) } + // We consider this SSH key to be verified because we take it directly from + // the web session. The user doesn't need to verify they own it because the + // don't: we own it. + const sshKeyVerified = true + // Augment certificates. newCerts, err := a.augmentUserCertificates(ctx, augmentUserCertificatesOpts{ checker: checker, x509Cert: x509Cert, x509Identity: x509Identity, sshAuthorizedKey: session.GetPub(), + sshKeyVerified: sshKeyVerified, deviceExtensions: opts.DeviceExtensions, }) if err != nil { @@ -2538,6 +2551,11 @@ type augmentUserCertificatesOpts struct { x509Cert *x509.Certificate x509Identity *tlsca.Identity sshAuthorizedKey []byte + // sshKeyVerified means that either the user has proven that they control + // the private key associated with sshAuthorizedKey (by signing a + // challenge), or it comes from a web session where we know that the cluster + // controls the key. + sshKeyVerified bool deviceExtensions *DeviceExtensions } @@ -2618,8 +2636,8 @@ func (a *Server) augmentUserCertificates( return nil, trace.BadParameter("identity and SSH user mismatch") case !slices.Equal(filterAndSortPrincipals(sshCert.ValidPrincipals), filterAndSortPrincipals(x509Identity.Principals)): return nil, trace.BadParameter("identity and SSH principals mismatch") - case !apisshutils.KeysEqual(sshCert.Key, xPubKey): - return nil, trace.BadParameter("x509 and SSH public key mismatch") + case !opts.sshKeyVerified && !apisshutils.KeysEqual(sshCert.Key, xPubKey): + return nil, trace.BadParameter("x509 and SSH public key mismatch and SSH challenge unsatisfied") // Do not reissue if device extensions are already present. case sshCert.Extensions[teleport.CertExtensionDeviceID] != "", sshCert.Extensions[teleport.CertExtensionDeviceAssetTag] != "", diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index 67a26656ec9e4..7554951b81c6e 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -1577,9 +1577,8 @@ func TestServer_AugmentContextUserCertificates(t *testing.T) { Pass: &authclient.PassCreds{ Password: []byte(pass), }, - // TODO(nklaassen): support split SSH and TLS keys with device - // trust. - PublicKey: []byte(sshPubKey), + SSHPublicKey: []byte(sshPubKey), + TLSPublicKey: []byte(tlsPubKey), }, TTL: 1 * time.Hour, }) @@ -1607,7 +1606,8 @@ func TestServer_AugmentContextUserCertificates(t *testing.T) { name: "device extensions", x509PEM: authResp.TLSCert, opts: &AugmentUserCertificateOpts{ - SSHAuthorizedKey: authResp.Cert, + SSHAuthorizedKey: authResp.Cert, + SSHKeySatisfiedChallenge: true, DeviceExtensions: &DeviceExtensions{ DeviceID: devID, AssetTag: devTag, @@ -1742,11 +1742,13 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { // authenticate authenticates the specified user, creating a new key pair, a // new pair of certificates, and parsing all relevant responses. authenticate := func(t *testing.T, user, pass string) (tlsRaw, sshRaw []byte, xCert *x509.Certificate, sshCert *ssh.Certificate, identity *tlsca.Identity) { - // Avoid using recycled keys here, otherwise the test may flake. - privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - require.NoError(t, err, "GenerateKey failed") - sPubKey, err := ssh.NewPublicKey(privKey.Public()) - require.NoError(t, err, "NewPublicKey failed") + sshKey, tlsKey, err := cryptosuites.GenerateUserSSHAndTLSKey(ctx, authServer) + require.NoError(t, err) + + sshPublicKey, err := ssh.NewPublicKey(sshKey.Public()) + require.NoError(t, err) + tlsPublicKeyPEM, err := keys.MarshalPublicKey(tlsKey.Public()) + require.NoError(t, err) authResp, err := authServer.AuthenticateSSHUser(ctx, authclient.AuthenticateSSHRequest{ AuthenticateUserRequest: authclient.AuthenticateUserRequest{ @@ -1754,9 +1756,8 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { Pass: &authclient.PassCreds{ Password: []byte(pass), }, - // TODO(nklaassen): support split SSH and TLS keys with device - // trust. - PublicKey: ssh.MarshalAuthorizedKey(sPubKey), + SSHPublicKey: ssh.MarshalAuthorizedKey(sshPublicKey), + TLSPublicKey: tlsPublicKeyPEM, }, TTL: 1 * time.Hour, }) @@ -1821,7 +1822,8 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { aaCtx, err := ctxFromAuthorize(aCtx) require.NoError(t, err, "ctxFromAuthorize failed") augResp, err := authServer.AugmentContextUserCertificates(aCtx, aaCtx, &AugmentUserCertificateOpts{ - SSHAuthorizedKey: sshRaw1, + SSHAuthorizedKey: sshRaw1, + SSHKeySatisfiedChallenge: true, DeviceExtensions: &DeviceExtensions{ DeviceID: "device1", AssetTag: "tag1", @@ -1850,6 +1852,7 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { AssetTag: "devicetag1", CredentialID: "credentialid1", }, + SSHKeySatisfiedChallenge: true, } optsFromBase := func(_ *testing.T) *AugmentUserCertificateOpts { return baseOpts } @@ -1945,12 +1948,13 @@ func TestServer_AugmentContextUserCertificates_errors(t *testing.T) { wantErr: "x509 user mismatch", }, { - name: "x509/SSH public key mismatch", + name: "SSH challenge not satisfied and x509/SSH public key mismatch", x509Cert: xCert1, identity: identity1, createOpts: func(_ *testing.T) *AugmentUserCertificateOpts { cp := *baseOpts cp.SSHAuthorizedKey = sshRaw11 // should be sshRaw1 + cp.SSHKeySatisfiedChallenge = false return &cp }, wantErr: "public key mismatch", diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 5e20f033efe6e..e2bc5c9986b81 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -386,6 +386,9 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { if err != nil { return nil, trace.Wrap(err) } + if authPreference.GetSignatureAlgorithmSuite() == types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED { + authPreference.SetSignatureAlgorithmSuite(types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_BALANCED_V1) + } _, err = srv.AuthServer.UpsertAuthPreference(ctx, authPreference) if err != nil { return nil, trace.Wrap(err) From f25050aadc4dd060094c8975a15f34cb807f018e Mon Sep 17 00:00:00 2001 From: Yassine Bounekhla <56373201+rudream@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:58:45 -0400 Subject: [PATCH 09/51] fix featurehiding (#45566) --- web/packages/teleport/src/TopBar/TopBar.tsx | 28 ++++++++++--------- web/packages/teleport/src/teleportContext.tsx | 7 ++++- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/web/packages/teleport/src/TopBar/TopBar.tsx b/web/packages/teleport/src/TopBar/TopBar.tsx index 1016132897d6f..f369d7b11f4db 100644 --- a/web/packages/teleport/src/TopBar/TopBar.tsx +++ b/web/packages/teleport/src/TopBar/TopBar.tsx @@ -152,19 +152,21 @@ export function TopBar({ CustomLogo }: TopBarProps) { Icon={Server} /> )} - + {ctx.getFeatureFlags().managementSection && ( + + )} {topBarLinks.map(({ topMenuItem, navigationItem }) => { const link = navigationItem.getLink(clusterId); diff --git a/web/packages/teleport/src/teleportContext.tsx b/web/packages/teleport/src/teleportContext.tsx index 2602b79de5a95..b8b160cf63571 100644 --- a/web/packages/teleport/src/teleportContext.tsx +++ b/web/packages/teleport/src/teleportContext.tsx @@ -147,7 +147,12 @@ class TeleportContext implements types.Context { userContext.getIntegrationsAccess().list || userContext.hasDiscoverAccess() || userContext.getDeviceTrustAccess().list || - userContext.getLockAccess().list + userContext.getLockAccess().list || + userContext.getAccessListAccess().list || + userContext.getAccessGraphAccess().list || + hasAccessMonitoringAccess() || + userContext.getTokenAccess().create || + userContext.getBotsAccess().list ); } From 275832ed27eac524b9a0d744bb475a7dc948f55d Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Sat, 17 Aug 2024 10:28:51 -0700 Subject: [PATCH 10/51] Fix flaky test. (#45544) --- lib/srv/mock.go | 7 ++++++- lib/srv/reexec_test.go | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/srv/mock.go b/lib/srv/mock.go index 5fbc95ba0e9b5..cfe94e4dc5e78 100644 --- a/lib/srv/mock.go +++ b/lib/srv/mock.go @@ -102,8 +102,13 @@ func newTestServerContext(t *testing.T, srv Server, roleSet services.RoleSet) *S scx.killShellr, scx.killShellw, err = os.Pipe() require.NoError(t, err) + scx.AddCloser(scx.killShellw) - t.Cleanup(func() { require.NoError(t, scx.Close()) }) + // TODO (joerger): check the error coming from Close once the logic around + // closing open files has been fixed to fail with "close |1: file already closed". + // Note that outside of tests, we never check the error form scx.Close because this + // error is a part of normal execution currently. + t.Cleanup(func() { scx.Close() }) return scx } diff --git a/lib/srv/reexec_test.go b/lib/srv/reexec_test.go index b9ab676ac3cb2..561342ff5c3b2 100644 --- a/lib/srv/reexec_test.go +++ b/lib/srv/reexec_test.go @@ -230,7 +230,7 @@ func testNetworkingCommand(t *testing.T, login string) { ctx := context.Background() srv := newMockServer(t) - scx := newExecServerContext(t, srv) + scx := newTestServerContext(t, srv, nil) scx.ExecType = teleport.NetworkingSubCommand if login != "" { scx.Identity.Login = login From 6f7156d8b2142bb7466557d27b461d5b9e49d956 Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Sat, 17 Aug 2024 10:55:32 -0700 Subject: [PATCH 11/51] Refactor SAML IdP Sessions - Follow up (#41779) * Remove SAML IdP session cookie. * Add deprecation notes for SAML IdP Session endpoints. * Address comment. * Fix lint. * Update deprecation notes to v18. --- api/client/client.go | 13 + api/client/proto/authservice.pb.go | 1865 +++++++++-------- .../legacy/client/proto/authservice.proto | 24 +- lib/auth/auth_with_roles.go | 6 + lib/auth/grpcserver.go | 6 + lib/idp/saml/session.go | 52 - lib/services/local/session.go | 6 + lib/web/apiserver.go | 18 +- lib/web/apiserver_test.go | 69 - lib/web/sessions.go | 8 +- 10 files changed, 987 insertions(+), 1080 deletions(-) delete mode 100644 lib/idp/saml/session.go diff --git a/api/client/client.go b/api/client/client.go index 6acf49c91e262..c647ccdfc6957 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -1494,6 +1494,8 @@ func (c *Client) GetSnowflakeSessions(ctx context.Context) ([]types.WebSession, } // ListSAMLIdPSessions gets a paginated list of SAML IdP sessions. +// Deprecated: Do not use. The Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. func (c *Client) ListSAMLIdPSessions(ctx context.Context, pageSize int, pageToken, user string) ([]types.WebSession, string, error) { resp, err := c.grpc.ListSAMLIdPSessions( ctx, @@ -1539,6 +1541,8 @@ func (c *Client) CreateSnowflakeSession(ctx context.Context, req types.CreateSno } // CreateSAMLIdPSession creates a SAML IdP session. +// Deprecated: Do not use. The Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. func (c *Client) CreateSAMLIdPSession(ctx context.Context, req types.CreateSAMLIdPSessionRequest) (types.WebSession, error) { resp, err := c.grpc.CreateSAMLIdPSession(ctx, &proto.CreateSAMLIdPSessionRequest{ SessionID: req.SessionID, @@ -1565,6 +1569,8 @@ func (c *Client) GetSnowflakeSession(ctx context.Context, req types.GetSnowflake } // GetSAMLIdPSession gets a SAML IdP session. +// Deprecated: Do not use. The Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. func (c *Client) GetSAMLIdPSession(ctx context.Context, req types.GetSAMLIdPSessionRequest) (types.WebSession, error) { resp, err := c.grpc.GetSAMLIdPSession(ctx, &proto.GetSAMLIdPSessionRequest{ SessionID: req.SessionID, @@ -1593,6 +1599,9 @@ func (c *Client) DeleteSnowflakeSession(ctx context.Context, req types.DeleteSno } // DeleteSAMLIdPSession removes a SAML IdP session. +// Deprecated: Do not use. As of v16, the Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. This endpoint +// will be removed in v17. func (c *Client) DeleteSAMLIdPSession(ctx context.Context, req types.DeleteSAMLIdPSessionRequest) error { _, err := c.grpc.DeleteSAMLIdPSession(ctx, &proto.DeleteSAMLIdPSessionRequest{ SessionID: req.SessionID, @@ -1613,6 +1622,8 @@ func (c *Client) DeleteAllSnowflakeSessions(ctx context.Context) error { } // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. +// Deprecated: Do not use. The Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. func (c *Client) DeleteAllSAMLIdPSessions(ctx context.Context) error { _, err := c.grpc.DeleteAllSAMLIdPSessions(ctx, &emptypb.Empty{}) return trace.Wrap(err) @@ -1625,6 +1636,8 @@ func (c *Client) DeleteUserAppSessions(ctx context.Context, req *proto.DeleteUse } // DeleteUserSAMLIdPSessions deletes all user’s SAML IdP sessions. +// Deprecated: Do not use. The Concept of SAML IdP Sessions is no longer in use. +// SAML IdP Sessions are directly tied to their parent web sessions instead. func (c *Client) DeleteUserSAMLIdPSessions(ctx context.Context, username string) error { req := &proto.DeleteUserSAMLIdPSessionsRequest{ Username: username, diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 28ee7d0e66c1b..8ac360ce90a9d 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -15611,935 +15611,936 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14844 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x8c, 0x1c, 0x49, - 0x76, 0x18, 0xda, 0x55, 0xfd, 0x3e, 0xfd, 0x60, 0x31, 0xba, 0x9b, 0x5d, 0x6c, 0x3e, 0x8a, 0x4c, - 0xce, 0x83, 0xc3, 0x9d, 0xe5, 0xa3, 0x39, 0x33, 0x3b, 0xaf, 0x9d, 0x99, 0xea, 0x07, 0xd9, 0x4d, - 0xf6, 0x6b, 0xb2, 0xba, 0x9b, 0x33, 0xb3, 0xa3, 0xad, 0xcd, 0xae, 0x0a, 0x76, 0xa7, 0x58, 0x9d, - 0x59, 0x9b, 0x99, 0x45, 0x0e, 0x57, 0x57, 0xba, 0xd0, 0xea, 0x5e, 0x5c, 0xfd, 0xdc, 0x7b, 0x25, - 0xc0, 0x32, 0x64, 0xe8, 0x43, 0x36, 0x60, 0x01, 0x86, 0x01, 0x1b, 0xfa, 0x11, 0xf4, 0x63, 0x7f, - 0xf8, 0xcb, 0x6b, 0x01, 0x82, 0x6d, 0x48, 0xfa, 0xf1, 0x47, 0xcb, 0x5e, 0xc0, 0x3f, 0x0d, 0xfb, - 0x43, 0x30, 0x6c, 0xc0, 0x0b, 0x08, 0x30, 0xe2, 0xc4, 0x23, 0x23, 0xf2, 0x51, 0xd5, 0x4d, 0x72, - 0x56, 0xfe, 0x21, 0xbb, 0x4e, 0x9c, 0x73, 0x22, 0xe2, 0x44, 0x64, 0xc4, 0x89, 0x13, 0x27, 0xce, - 0x81, 0x9b, 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0x74, 0xdf, 0x69, 0x3c, 0xbf, 0xd5, - 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0xb5, 0x03, 0x3f, 0xf2, 0x6f, 0x39, 0x9d, 0xe8, 0x20, 0xa4, 0xc1, - 0x53, 0xb7, 0x41, 0x6f, 0x22, 0x84, 0x0c, 0xe2, 0x7f, 0x73, 0xd3, 0xfb, 0xfe, 0xbe, 0xcf, 0x71, - 0xd8, 0x5f, 0xbc, 0x70, 0xee, 0xc2, 0xbe, 0xef, 0xef, 0xb7, 0x28, 0x27, 0xde, 0xeb, 0x3c, 0xbe, - 0x45, 0x0f, 0xdb, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x21, 0x0d, 0x23, 0xe7, 0xb0, - 0x2d, 0x10, 0xde, 0x52, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, - 0xff, 0x29, 0x50, 0xaf, 0x77, 0x6d, 0x75, 0x83, 0x06, 0x51, 0x78, 0x22, 0x4c, 0xfa, 0x94, 0x7a, - 0x51, 0xaa, 0x7a, 0x81, 0x19, 0x3d, 0x6f, 0xd3, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xd5, 0x6c, - 0x54, 0xfc, 0x57, 0xa0, 0x7c, 0x37, 0x1b, 0xe5, 0x19, 0xdd, 0x63, 0x32, 0xf5, 0xd4, 0x1f, 0x3d, - 0xd0, 0x03, 0xa7, 0xdd, 0xa6, 0x41, 0xfc, 0x87, 0x40, 0x3f, 0xaf, 0xd0, 0x0f, 0x1f, 0x3b, 0x4c, - 0x44, 0x87, 0x8f, 0x9d, 0x54, 0x37, 0x3a, 0xa1, 0xb3, 0x4f, 0x45, 0xf3, 0x9f, 0xde, 0xd1, 0x7f, - 0x72, 0x54, 0xeb, 0x0f, 0x0b, 0x30, 0xf8, 0xc8, 0x89, 0x1a, 0x07, 0xe4, 0x53, 0x18, 0x7c, 0xe8, - 0x7a, 0xcd, 0xb0, 0x5c, 0xb8, 0xd2, 0x7f, 0x7d, 0x6c, 0xbe, 0x74, 0x93, 0x77, 0x05, 0x0b, 0x59, - 0xc1, 0xc2, 0xec, 0xcf, 0x8e, 0x2a, 0x7d, 0xc7, 0x47, 0x95, 0x33, 0x4f, 0x18, 0xda, 0xdb, 0xfe, - 0xa1, 0x1b, 0xe1, 0xd8, 0xda, 0x9c, 0x8e, 0xec, 0xc0, 0x54, 0xb5, 0xd5, 0xf2, 0x9f, 0x6d, 0x39, - 0x41, 0xe4, 0x3a, 0xad, 0x5a, 0xa7, 0xd1, 0xa0, 0x61, 0x58, 0x2e, 0x5e, 0x29, 0x5c, 0x1f, 0x59, - 0xb8, 0x76, 0x7c, 0x54, 0xa9, 0x38, 0xac, 0xb8, 0xde, 0xe6, 0xe5, 0xf5, 0x90, 0x23, 0x68, 0x8c, - 0xb2, 0xe8, 0xad, 0x3f, 0x1b, 0x82, 0xd2, 0x8a, 0x1f, 0x46, 0x8b, 0x6c, 0x44, 0x6d, 0xfa, 0xe3, - 0x0e, 0x0d, 0x23, 0x72, 0x0d, 0x86, 0x18, 0x6c, 0x75, 0xa9, 0x5c, 0xb8, 0x52, 0xb8, 0x3e, 0xba, - 0x30, 0x76, 0x7c, 0x54, 0x19, 0x3e, 0xf0, 0xc3, 0xa8, 0xee, 0x36, 0x6d, 0x51, 0x44, 0xde, 0x82, - 0x91, 0x0d, 0xbf, 0x49, 0x37, 0x9c, 0x43, 0x8a, 0xad, 0x18, 0x5d, 0x98, 0x38, 0x3e, 0xaa, 0x8c, - 0x7a, 0x7e, 0x93, 0xd6, 0x3d, 0xe7, 0x90, 0xda, 0xaa, 0x98, 0xec, 0xc2, 0x80, 0xed, 0xb7, 0x68, - 0xb9, 0x1f, 0xd1, 0x16, 0x8e, 0x8f, 0x2a, 0x03, 0x81, 0xdf, 0xa2, 0xbf, 0x38, 0xaa, 0xbc, 0xb7, - 0xef, 0x46, 0x07, 0x9d, 0xbd, 0x9b, 0x0d, 0xff, 0xf0, 0xd6, 0x7e, 0xe0, 0x3c, 0x75, 0xf9, 0x24, - 0x74, 0x5a, 0xb7, 0xe2, 0xa9, 0xda, 0x76, 0xc5, 0xb8, 0xd7, 0x9e, 0x87, 0x11, 0x3d, 0x64, 0x9c, - 0x6c, 0xe4, 0x47, 0x1e, 0xc1, 0x74, 0xb5, 0xd9, 0x74, 0x39, 0xc5, 0x56, 0xe0, 0x7a, 0x0d, 0xb7, - 0xed, 0xb4, 0xc2, 0xf2, 0xc0, 0x95, 0xfe, 0xeb, 0xa3, 0x42, 0x28, 0xaa, 0xbc, 0xde, 0x56, 0x08, - 0x9a, 0x50, 0x32, 0x19, 0x90, 0xbb, 0x30, 0xb2, 0xb4, 0x51, 0x63, 0x6d, 0x0f, 0xcb, 0x83, 0xc8, - 0x6c, 0xf6, 0xf8, 0xa8, 0x32, 0xd5, 0xf4, 0x42, 0xec, 0x9a, 0xce, 0x40, 0x21, 0x92, 0xf7, 0x60, - 0x7c, 0xab, 0xb3, 0xd7, 0x72, 0x1b, 0xdb, 0x6b, 0xb5, 0x87, 0xf4, 0x79, 0x79, 0xe8, 0x4a, 0xe1, - 0xfa, 0xf8, 0x02, 0x39, 0x3e, 0xaa, 0x4c, 0xb6, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, - 0x6e, 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xc2, 0xe8, 0x86, 0x53, 0x74, 0x61, 0x78, 0xa0, 0xd3, - 0x71, 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x87, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x50, 0x1e, 0x41, 0xd9, - 0x9e, 0x39, 0x3e, 0xaa, 0x8c, 0x05, 0x08, 0xad, 0x3b, 0xcd, 0x66, 0x60, 0x6b, 0x28, 0x64, 0x11, - 0x46, 0x6c, 0x9f, 0x0b, 0xb8, 0x3c, 0x7a, 0xa5, 0x70, 0x7d, 0x6c, 0xfe, 0x8c, 0x98, 0x86, 0x12, - 0xbc, 0x70, 0xee, 0xf8, 0xa8, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xde, - 0xf0, 0x17, 0x9d, 0xc6, 0x01, 0x2d, 0x03, 0xce, 0xbd, 0xc1, 0xe3, 0xa3, 0x4a, 0xe1, 0xbb, 0xb6, - 0x84, 0x92, 0xa7, 0x30, 0x16, 0x0f, 0x54, 0x58, 0x1e, 0x43, 0xf1, 0x6d, 0x1f, 0x1f, 0x55, 0xce, - 0x85, 0x08, 0xae, 0xb3, 0xa1, 0xd7, 0x24, 0xf8, 0x12, 0xb3, 0x40, 0xaf, 0x88, 0x7c, 0x0d, 0x33, - 0xf1, 0xcf, 0x6a, 0x18, 0xd2, 0x80, 0xf1, 0x58, 0x5d, 0x2a, 0x4f, 0xa0, 0x64, 0xde, 0x38, 0x3e, - 0xaa, 0x58, 0x5a, 0x0b, 0xea, 0x8e, 0x44, 0xa9, 0xbb, 0x4d, 0xad, 0xa7, 0xd9, 0x4c, 0x1e, 0x0c, - 0x8c, 0x8c, 0x97, 0x26, 0xec, 0x4b, 0x3b, 0x5e, 0x18, 0x39, 0x7b, 0x2d, 0x9a, 0x89, 0x64, 0xfd, - 0x6d, 0x01, 0xc8, 0x66, 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0xfb, 0x9e, 0xe4, 0xe7, 0xf4, 0x36, 0x8c, - 0xf2, 0x81, 0x63, 0xa3, 0x5b, 0xc4, 0xd1, 0x9d, 0x3c, 0x3e, 0xaa, 0x80, 0x18, 0x5d, 0x36, 0xb2, - 0x31, 0x02, 0x79, 0x1d, 0xfa, 0xb7, 0xb7, 0xd7, 0xf0, 0x5b, 0xe9, 0x5f, 0x98, 0x3a, 0x3e, 0xaa, - 0xf4, 0x47, 0x51, 0xeb, 0x17, 0x47, 0x95, 0x91, 0xa5, 0x4e, 0x80, 0x62, 0xb1, 0x59, 0x39, 0x79, - 0x1d, 0x86, 0x17, 0x5b, 0x9d, 0x30, 0xa2, 0x41, 0x79, 0x20, 0xfe, 0x48, 0x1b, 0x1c, 0x64, 0xcb, - 0x32, 0xf2, 0x1d, 0x18, 0xd8, 0x09, 0x69, 0x50, 0x1e, 0xc4, 0xf1, 0x9e, 0x10, 0xe3, 0xcd, 0x40, - 0xbb, 0xf3, 0x0b, 0x23, 0xec, 0x4b, 0xec, 0x84, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x41, 0x3e, - 0x68, 0x43, 0xb8, 0x48, 0x4d, 0xa8, 0xd9, 0xd1, 0xa2, 0xbb, 0xef, 0x2d, 0x8c, 0x1e, 0x1f, 0x55, - 0x06, 0x71, 0xf0, 0x6c, 0x8e, 0xf6, 0x60, 0x60, 0xa4, 0x50, 0x2a, 0xda, 0x23, 0x8c, 0x96, 0x7d, - 0x16, 0xd6, 0x77, 0x60, 0x4c, 0xeb, 0x3e, 0xb9, 0x08, 0x03, 0xec, 0x7f, 0x5c, 0x44, 0xc6, 0x79, - 0x65, 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0xc3, 0x29, 0x28, 0x31, 0x4a, 0x63, 0xe5, 0xb9, 0xa9, - 0x8b, 0x8a, 0xd3, 0x95, 0x4c, 0x51, 0x95, 0x0b, 0xba, 0xb0, 0xae, 0x83, 0xaa, 0x5d, 0x2c, 0x42, - 0xe3, 0xc7, 0x47, 0x95, 0x91, 0x8e, 0x80, 0xc5, 0x6d, 0x23, 0x35, 0x18, 0x5e, 0xfe, 0xa6, 0xed, - 0x06, 0x34, 0x44, 0xd1, 0x8e, 0xcd, 0xcf, 0xdd, 0xe4, 0xdb, 0xe5, 0x4d, 0xb9, 0x5d, 0xde, 0xdc, - 0x96, 0xdb, 0xe5, 0xc2, 0x25, 0xb1, 0x18, 0x9f, 0xa5, 0x9c, 0x24, 0x9e, 0x1f, 0xbf, 0xf3, 0xd7, - 0x95, 0x82, 0x2d, 0x39, 0x91, 0xb7, 0x61, 0xe8, 0x9e, 0x1f, 0x1c, 0x3a, 0x91, 0x18, 0x83, 0xe9, - 0xe3, 0xa3, 0x4a, 0xe9, 0x31, 0x42, 0xb4, 0x29, 0x25, 0x70, 0xc8, 0x3d, 0x98, 0xb4, 0xfd, 0x4e, - 0x44, 0xb7, 0x7d, 0x39, 0x72, 0x83, 0x48, 0x75, 0xf9, 0xf8, 0xa8, 0x32, 0x17, 0xb0, 0x92, 0x7a, - 0xe4, 0xd7, 0xc5, 0x10, 0x6a, 0xf4, 0x09, 0x2a, 0xb2, 0x0c, 0x93, 0x55, 0x5c, 0xbd, 0x85, 0xd4, - 0xf8, 0x78, 0x8d, 0x2e, 0x5c, 0x3a, 0x3e, 0xaa, 0x9c, 0x77, 0xb0, 0xa4, 0x1e, 0x88, 0x22, 0x9d, - 0x8d, 0x49, 0x44, 0x36, 0xe0, 0xec, 0xc3, 0xce, 0x1e, 0x0d, 0x3c, 0x1a, 0xd1, 0x50, 0xb6, 0x68, - 0x18, 0x5b, 0x74, 0xe5, 0xf8, 0xa8, 0x72, 0xf1, 0x89, 0x2a, 0xcc, 0x68, 0x53, 0x9a, 0x94, 0x50, - 0x38, 0x23, 0x1a, 0xba, 0xe4, 0x44, 0xce, 0x9e, 0x13, 0x52, 0x5c, 0x94, 0xc6, 0xe6, 0xcf, 0x71, - 0x11, 0xdf, 0x4c, 0x94, 0x2e, 0x5c, 0x13, 0x52, 0xbe, 0xa0, 0xfa, 0xde, 0x14, 0x45, 0x5a, 0x45, - 0x49, 0x9e, 0x6c, 0x6d, 0x56, 0xfb, 0xce, 0x28, 0xb6, 0x16, 0xd7, 0x66, 0xb5, 0xef, 0xe8, 0xab, - 0x96, 0xda, 0x81, 0xd6, 0x60, 0x70, 0x87, 0xed, 0xce, 0xb8, 0x66, 0x4d, 0xce, 0x5f, 0x15, 0x2d, - 0x4a, 0xce, 0xbf, 0x9b, 0xec, 0x07, 0x22, 0xe2, 0x97, 0x77, 0x06, 0x77, 0x74, 0x7d, 0x2f, 0xc6, - 0x32, 0xf2, 0x39, 0x80, 0x68, 0x55, 0xb5, 0xdd, 0x2e, 0x8f, 0x61, 0x27, 0xcf, 0x9a, 0x9d, 0xac, - 0xb6, 0xdb, 0x0b, 0x97, 0x45, 0xff, 0xce, 0xa9, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, - 0x3e, 0x85, 0x71, 0x5c, 0xd2, 0xe4, 0x88, 0x8e, 0xe3, 0x88, 0x5e, 0x38, 0x3e, 0xaa, 0xcc, 0xe2, - 0x6a, 0x95, 0x31, 0x9e, 0x06, 0x01, 0xf9, 0x0d, 0x98, 0x11, 0xec, 0x1e, 0xb9, 0x5e, 0xd3, 0x7f, - 0x16, 0x2e, 0xd1, 0xf0, 0x49, 0xe4, 0xb7, 0x71, 0xf9, 0x1b, 0x9b, 0xbf, 0x68, 0x36, 0xcf, 0xc4, - 0x59, 0xb8, 0x21, 0x5a, 0x6a, 0xa9, 0x96, 0x3e, 0xe3, 0x08, 0xf5, 0x26, 0xc7, 0xd0, 0x17, 0xc8, - 0x4c, 0x16, 0x64, 0x15, 0xce, 0xec, 0x84, 0xd4, 0xe8, 0xc3, 0x24, 0xee, 0x0f, 0x15, 0x36, 0xc2, - 0x9d, 0x90, 0xd6, 0xf3, 0xfa, 0x91, 0xa4, 0x23, 0x36, 0x90, 0xa5, 0xc0, 0x6f, 0x27, 0xe6, 0xf8, - 0x19, 0x94, 0x88, 0x75, 0x7c, 0x54, 0xb9, 0xdc, 0x0c, 0xfc, 0x76, 0x3d, 0x7f, 0xa2, 0x67, 0x50, - 0x93, 0x1f, 0xc2, 0xb9, 0x45, 0xdf, 0xf3, 0x68, 0x83, 0xad, 0xa0, 0x4b, 0xae, 0xb3, 0xef, 0xf9, - 0x61, 0xe4, 0x36, 0x56, 0x97, 0xca, 0xa5, 0x78, 0x7b, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, - 0xdb, 0x43, 0x0e, 0x17, 0xf2, 0x03, 0x98, 0x10, 0x75, 0xd1, 0x00, 0xa7, 0xe6, 0xd9, 0xee, 0x13, - 0x4d, 0x21, 0xf3, 0x8d, 0x3e, 0x90, 0x3f, 0xb9, 0xea, 0x64, 0xf2, 0x22, 0x5f, 0xc3, 0xd8, 0xfa, - 0xbd, 0xaa, 0x4d, 0xc3, 0xb6, 0xef, 0x85, 0xb4, 0x4c, 0x70, 0x44, 0x2f, 0x0b, 0xd6, 0xeb, 0xf7, - 0xaa, 0xd5, 0x4e, 0x74, 0x40, 0xbd, 0xc8, 0x6d, 0x38, 0x11, 0x95, 0x58, 0x0b, 0x73, 0x6c, 0xe6, - 0x1d, 0x3e, 0x76, 0xea, 0x81, 0x80, 0x68, 0xbd, 0xd0, 0xd9, 0x91, 0x39, 0x18, 0xa9, 0xd5, 0x56, - 0xd6, 0xfc, 0x7d, 0xd7, 0x2b, 0x4f, 0x31, 0x61, 0xd8, 0xea, 0x37, 0x79, 0x0c, 0x33, 0xda, 0xd9, - 0xa0, 0xce, 0xfe, 0xa7, 0x87, 0xd4, 0x8b, 0xca, 0xd3, 0xd8, 0x86, 0xef, 0xaa, 0xc3, 0xcd, 0x4d, - 0xfd, 0x08, 0xf1, 0xf4, 0xce, 0xcd, 0x6a, 0xfc, 0xb3, 0x26, 0x89, 0x16, 0x8a, 0xe5, 0x82, 0x3d, - 0xed, 0x64, 0x94, 0x90, 0x6d, 0x18, 0xde, 0xea, 0x04, 0x6d, 0x3f, 0xa4, 0xe5, 0x19, 0x14, 0xdc, - 0xb5, 0x6e, 0x5f, 0xa8, 0x40, 0x5d, 0x98, 0x61, 0x4b, 0x74, 0x9b, 0xff, 0xd0, 0x7a, 0x27, 0x59, - 0x91, 0xcf, 0x60, 0xbc, 0x56, 0x5b, 0x89, 0x37, 0x94, 0x73, 0xb8, 0xa1, 0x5c, 0x3c, 0x3e, 0xaa, - 0x94, 0x99, 0x4a, 0x15, 0x6f, 0x2a, 0xfa, 0x57, 0xa5, 0x53, 0x30, 0x0e, 0xdb, 0x6b, 0xb5, 0x98, - 0xc3, 0x6c, 0xcc, 0x81, 0x29, 0x73, 0xd9, 0x1c, 0x74, 0x0a, 0xf2, 0xcf, 0x0a, 0x70, 0x45, 0x67, - 0x99, 0x25, 0x98, 0xf2, 0xf9, 0x17, 0x91, 0xe6, 0xfc, 0xf1, 0x51, 0xe5, 0xa6, 0xd9, 0x8f, 0x7a, - 0xe6, 0x60, 0x69, 0x6d, 0xeb, 0xd9, 0x14, 0x6c, 0xaf, 0xde, 0x81, 0xcc, 0xf6, 0xce, 0xbd, 0x70, - 0x7b, 0x4d, 0xa9, 0xf5, 0x6e, 0x6f, 0xaf, 0xa6, 0x58, 0x5f, 0xc0, 0xa8, 0x5a, 0xb4, 0xc9, 0x30, - 0xf4, 0x57, 0x5b, 0xad, 0x52, 0x1f, 0xfb, 0xa3, 0x56, 0x5b, 0x29, 0x15, 0xc8, 0x24, 0x40, 0xbc, - 0x53, 0x95, 0x8a, 0x64, 0x1c, 0x46, 0xe4, 0x4e, 0x52, 0xea, 0x47, 0xfc, 0x76, 0xbb, 0x34, 0x40, - 0x08, 0x4c, 0x9a, 0xeb, 0x59, 0x69, 0xd0, 0xfa, 0xdd, 0x02, 0x8c, 0xaa, 0xef, 0x90, 0x9c, 0x81, - 0xb1, 0x9d, 0x8d, 0xda, 0xd6, 0xf2, 0xe2, 0xea, 0xbd, 0xd5, 0xe5, 0xa5, 0x52, 0x1f, 0xb9, 0x04, - 0xe7, 0xb7, 0x6b, 0x2b, 0xf5, 0xa5, 0x85, 0xfa, 0xda, 0xe6, 0x62, 0x75, 0xad, 0xbe, 0x65, 0x6f, - 0x7e, 0xf1, 0x65, 0x7d, 0x7b, 0x67, 0x63, 0x63, 0x79, 0xad, 0x54, 0x20, 0x65, 0x98, 0x66, 0xc5, - 0x0f, 0x77, 0x16, 0x96, 0x75, 0x84, 0x52, 0x91, 0x5c, 0x85, 0x4b, 0x59, 0x25, 0xf5, 0x95, 0xe5, - 0xea, 0xd2, 0xda, 0x72, 0xad, 0x56, 0xea, 0x27, 0xb3, 0x30, 0xc5, 0x50, 0xaa, 0x5b, 0x5b, 0x06, - 0xed, 0x80, 0xd5, 0x82, 0x31, 0xed, 0x03, 0x20, 0x17, 0xa1, 0xbc, 0xb8, 0x6c, 0x6f, 0xd7, 0xb7, - 0x76, 0xec, 0xad, 0xcd, 0xda, 0x72, 0xdd, 0x6c, 0x61, 0xb2, 0x74, 0x6d, 0xf3, 0xfe, 0xea, 0x46, - 0x9d, 0x81, 0x6a, 0xa5, 0x02, 0x6b, 0x86, 0x51, 0x5a, 0x5b, 0xdd, 0xb8, 0xbf, 0xb6, 0x5c, 0xdf, - 0xa9, 0x2d, 0x0b, 0x94, 0xa2, 0xf5, 0xd3, 0x62, 0x6a, 0x4b, 0x27, 0xf3, 0x30, 0x56, 0xe3, 0xf6, - 0x0a, 0x5c, 0xe6, 0xf8, 0x01, 0x91, 0xe9, 0x68, 0xe3, 0xc2, 0x8c, 0xc1, 0x57, 0x30, 0x1d, 0x89, - 0x69, 0x69, 0x5b, 0xec, 0x6b, 0x6e, 0xf8, 0x2d, 0x5d, 0x4b, 0x6b, 0x0b, 0x98, 0xad, 0x4a, 0xc9, - 0xbc, 0xa6, 0xcf, 0xf1, 0xd3, 0x22, 0x9e, 0x48, 0xa4, 0x3e, 0xa7, 0xef, 0xed, 0x4a, 0xb3, 0x9b, - 0x8f, 0x87, 0x54, 0xa8, 0x61, 0x48, 0x93, 0xa1, 0x4b, 0x28, 0x3c, 0xf2, 0x96, 0xd4, 0x74, 0xf9, - 0xe9, 0x0e, 0x37, 0xfb, 0xc4, 0xb9, 0x44, 0x28, 0xb9, 0x56, 0x27, 0x67, 0x63, 0x25, 0x1f, 0x25, - 0xe7, 0x8c, 0x10, 0x06, 0x32, 0x4b, 0xec, 0x9f, 0x76, 0x02, 0x95, 0x54, 0x60, 0x90, 0xaf, 0xb8, - 0x5c, 0x1e, 0xa8, 0x5b, 0xb7, 0x18, 0xc0, 0xe6, 0x70, 0xeb, 0x4f, 0xfa, 0x75, 0x25, 0x83, 0xe9, - 0xd2, 0x9a, 0xbc, 0x51, 0x97, 0x46, 0x39, 0x23, 0x94, 0xa9, 0xcd, 0x35, 0x1a, 0x86, 0xfc, 0xbc, - 0x53, 0x54, 0x43, 0x02, 0x21, 0x07, 0xd6, 0xdd, 0x26, 0x53, 0x9b, 0x15, 0x0a, 0x3b, 0x3a, 0xf2, - 0xaf, 0x0a, 0x8f, 0x8e, 0xfd, 0xf1, 0xd1, 0x51, 0x7c, 0x9a, 0xfc, 0xe8, 0x18, 0xa3, 0xb0, 0x51, - 0x17, 0x6a, 0x1e, 0xb6, 0x62, 0x20, 0x1e, 0x75, 0xa1, 0x1a, 0x8a, 0x51, 0xd7, 0x90, 0xc8, 0x87, - 0x00, 0xd5, 0x47, 0x35, 0x3c, 0x23, 0xd9, 0x1b, 0x42, 0xd5, 0xc5, 0x4d, 0xc9, 0x79, 0x16, 0x8a, - 0x23, 0x58, 0xa0, 0x9f, 0x31, 0x35, 0x6c, 0xb2, 0x00, 0x13, 0xd5, 0x9f, 0x74, 0x02, 0xba, 0xda, - 0x64, 0xfb, 0x5a, 0xc4, 0x0f, 0xd3, 0xa3, 0x7c, 0xe1, 0x75, 0x58, 0x41, 0xdd, 0x15, 0x25, 0x1a, - 0x03, 0x93, 0x84, 0x6c, 0xc2, 0xd9, 0xfb, 0x8b, 0x5b, 0x62, 0x1e, 0x56, 0x1b, 0x0d, 0xbf, 0xe3, - 0x45, 0x42, 0xbf, 0xbd, 0x7a, 0x7c, 0x54, 0xb9, 0xb4, 0xdf, 0x68, 0xd7, 0xe5, 0x9c, 0x75, 0x78, - 0xb1, 0xae, 0xe0, 0xa6, 0x68, 0xc9, 0x35, 0xe8, 0xdf, 0xb1, 0x57, 0xc5, 0x49, 0xfb, 0xec, 0xf1, - 0x51, 0x65, 0xa2, 0x13, 0xb8, 0x1a, 0x09, 0x2b, 0xb5, 0x5a, 0x30, 0x79, 0x9f, 0x46, 0x6c, 0x72, - 0xca, 0x33, 0x4d, 0xf7, 0xa1, 0xfb, 0x18, 0xc6, 0x1e, 0xb9, 0xd1, 0x41, 0x8d, 0x36, 0x02, 0x1a, - 0x49, 0x7b, 0x0e, 0x8a, 0xe9, 0x99, 0x1b, 0x1d, 0xd4, 0x43, 0x0e, 0xd7, 0xf7, 0x6e, 0x0d, 0xdd, - 0x5a, 0x86, 0x33, 0xa2, 0x36, 0x75, 0x84, 0x9a, 0x37, 0x19, 0x16, 0x90, 0x21, 0x0e, 0x95, 0xce, - 0xd0, 0x64, 0xf3, 0x27, 0x45, 0x98, 0x59, 0x3c, 0x70, 0xbc, 0x7d, 0xba, 0xe5, 0x84, 0xe1, 0x33, - 0x3f, 0x68, 0x6a, 0x8d, 0xc7, 0xf3, 0x63, 0xaa, 0xf1, 0x78, 0x60, 0x9c, 0x87, 0xb1, 0xcd, 0x56, - 0x53, 0xd2, 0x88, 0xb3, 0x2d, 0xd6, 0xe5, 0xb7, 0x9a, 0xf5, 0xb6, 0xe4, 0xa5, 0x23, 0x31, 0x9a, - 0x0d, 0xfa, 0x4c, 0xd1, 0xf4, 0xc7, 0x34, 0x1e, 0x7d, 0xa6, 0xd1, 0x68, 0x48, 0x64, 0x19, 0xce, - 0xd6, 0x68, 0xc3, 0xf7, 0x9a, 0xf7, 0x9c, 0x46, 0xe4, 0x07, 0xdb, 0xfe, 0x13, 0xea, 0x89, 0x49, - 0x88, 0xca, 0x7f, 0x88, 0x85, 0xf5, 0xc7, 0x58, 0x5a, 0x8f, 0x58, 0xb1, 0x9d, 0xa6, 0x20, 0x9b, - 0x30, 0xf2, 0x48, 0x58, 0x05, 0xc5, 0x81, 0xf8, 0xf5, 0x9b, 0xca, 0x4c, 0xb8, 0x18, 0x50, 0x9c, - 0x39, 0x4e, 0x4b, 0x1d, 0xe9, 0x95, 0x2e, 0x85, 0xcb, 0x95, 0xc4, 0xb4, 0x15, 0x13, 0x6b, 0x07, - 0x26, 0xb6, 0x5a, 0x9d, 0x7d, 0xd7, 0x63, 0x0b, 0x4b, 0x8d, 0xfe, 0x98, 0x2c, 0x01, 0xc4, 0x00, - 0x61, 0xeb, 0x9b, 0x12, 0xc7, 0xe8, 0xb8, 0x60, 0xf7, 0xae, 0xf8, 0xda, 0x10, 0x82, 0xa7, 0x1e, - 0x5b, 0xa3, 0xb3, 0xfe, 0x67, 0x3f, 0x10, 0x31, 0x00, 0xb8, 0xd1, 0xd5, 0x68, 0xc4, 0xb6, 0xa0, - 0x73, 0x50, 0x54, 0x26, 0xb9, 0xa1, 0xe3, 0xa3, 0x4a, 0xd1, 0x6d, 0xda, 0xc5, 0xd5, 0x25, 0xf2, - 0x0e, 0x0c, 0x22, 0x1a, 0xca, 0x7f, 0x52, 0xd5, 0xa7, 0x73, 0xe0, 0x0b, 0x0c, 0xee, 0xb0, 0x36, - 0x47, 0x26, 0xef, 0xc2, 0xe8, 0x12, 0x6d, 0xd1, 0x7d, 0x27, 0xf2, 0xe5, 0x12, 0xc0, 0x8d, 0x5c, - 0x12, 0xa8, 0xcd, 0xb9, 0x18, 0x93, 0x1d, 0x79, 0x6d, 0xea, 0x84, 0xbe, 0xa7, 0x1f, 0x79, 0x03, - 0x84, 0xe8, 0x47, 0x5e, 0x8e, 0x43, 0x7e, 0xaf, 0x00, 0x63, 0x55, 0xcf, 0x13, 0xc6, 0xa3, 0x50, - 0x48, 0x7d, 0xe6, 0xa6, 0xb2, 0xb6, 0xae, 0x39, 0x7b, 0xb4, 0xb5, 0xeb, 0xb4, 0x3a, 0x34, 0x5c, - 0xf8, 0x9a, 0x9d, 0x42, 0xfe, 0xc3, 0x51, 0xe5, 0xa3, 0x53, 0x98, 0x83, 0x62, 0xbb, 0xed, 0x76, - 0xe0, 0xb8, 0x51, 0x78, 0x7c, 0x54, 0x99, 0x71, 0xe2, 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, - 0xfe, 0x0f, 0xf5, 0x5a, 0xff, 0xc9, 0x21, 0x9c, 0xa9, 0x86, 0x61, 0xe7, 0x90, 0xd6, 0x22, 0x27, - 0x88, 0xb6, 0xdd, 0x43, 0x8a, 0x8b, 0x48, 0x77, 0x03, 0xc2, 0x9b, 0x3f, 0x3b, 0xaa, 0x14, 0xd8, - 0xc1, 0xc7, 0x41, 0x52, 0xa6, 0xdb, 0x04, 0x51, 0x3d, 0x72, 0xf5, 0x2d, 0x0c, 0x4d, 0x09, 0x49, - 0xde, 0xd6, 0x35, 0xa5, 0x74, 0xac, 0x2e, 0xe5, 0x8d, 0xb8, 0xb5, 0x08, 0x17, 0xef, 0xd3, 0xc8, - 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0x36, 0xe0, 0x0e, 0xe3, 0x6f, 0x45, 0x8c, 0xc3, - 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x5f, 0x05, 0xa8, 0x2c, 0x06, 0x94, 0x9f, 0x19, 0x72, 0x18, - 0x75, 0x5f, 0xbb, 0x2e, 0xc2, 0xc0, 0xf6, 0xf3, 0xb6, 0xb4, 0xbc, 0x60, 0x29, 0x1b, 0x14, 0x1b, - 0xa1, 0x27, 0x34, 0x64, 0x59, 0x8f, 0x61, 0xc6, 0xa6, 0x1e, 0x7d, 0xe6, 0xec, 0xb5, 0xa8, 0x61, - 0x0b, 0xaa, 0xc0, 0x20, 0xff, 0xd0, 0x53, 0x5d, 0xe0, 0xf0, 0xd3, 0xd9, 0xd5, 0xac, 0x09, 0x18, - 0xdb, 0x72, 0xbd, 0x7d, 0xc1, 0xdd, 0xfa, 0xe3, 0x7e, 0x18, 0xe7, 0xbf, 0xc5, 0x31, 0x28, 0xb1, - 0xc5, 0x15, 0x4e, 0xb2, 0xc5, 0xbd, 0x0f, 0x13, 0x6c, 0x8f, 0xa0, 0xc1, 0x2e, 0x0d, 0xd8, 0xd6, - 0x2a, 0x24, 0x81, 0x47, 0xba, 0x10, 0x0b, 0xea, 0x4f, 0x79, 0x89, 0x6d, 0x22, 0x92, 0x35, 0x98, - 0xe4, 0x80, 0x7b, 0xd4, 0x89, 0x3a, 0xb1, 0x55, 0xea, 0x8c, 0x38, 0xf7, 0x48, 0x30, 0x9f, 0x9a, - 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x53, 0x38, 0xb3, 0x15, 0xf8, 0xdf, 0x3c, 0xd7, - 0x36, 0x75, 0xfe, 0x75, 0xf2, 0x13, 0x12, 0x2b, 0xaa, 0xeb, 0x5b, 0x7b, 0x12, 0x9b, 0xbc, 0x05, - 0x23, 0xab, 0xe1, 0x82, 0x1f, 0xb8, 0xde, 0x3e, 0x7e, 0xa3, 0x23, 0xdc, 0x98, 0xef, 0x86, 0xf5, - 0x3d, 0x04, 0xda, 0xaa, 0x38, 0x61, 0x76, 0x1e, 0xee, 0x6d, 0x76, 0xbe, 0x0d, 0xb0, 0xe6, 0x3b, - 0xcd, 0x6a, 0xab, 0xb5, 0x58, 0x0d, 0x71, 0xf7, 0x14, 0xfb, 0x51, 0xcb, 0x77, 0x9a, 0x75, 0xa7, - 0xd5, 0xaa, 0x37, 0x9c, 0xd0, 0xd6, 0x70, 0x1e, 0x0c, 0x8c, 0x0c, 0x95, 0x86, 0xed, 0x33, 0x6b, - 0x6e, 0x83, 0x7a, 0x21, 0x7d, 0xe4, 0x04, 0x9e, 0xeb, 0xed, 0x87, 0xd6, 0x3f, 0x3f, 0x0b, 0x23, - 0xaa, 0xcb, 0x37, 0x75, 0xc5, 0x5e, 0xec, 0x72, 0x38, 0xfa, 0xb1, 0xd9, 0xca, 0xd6, 0x30, 0xc8, - 0x79, 0x54, 0xf5, 0xc5, 0xfe, 0x3a, 0xcc, 0x66, 0xa3, 0xd3, 0x6e, 0xdb, 0x0c, 0xc6, 0xbe, 0xb2, - 0xa5, 0x05, 0x94, 0xff, 0x08, 0xff, 0xca, 0x9a, 0x7b, 0x76, 0x71, 0x69, 0x81, 0x4d, 0xef, 0xcd, - 0xd5, 0xa5, 0x45, 0x14, 0xe5, 0x08, 0x9f, 0xde, 0xbe, 0xdb, 0x6c, 0xd8, 0x08, 0x65, 0xa5, 0xb5, - 0xea, 0xfa, 0x9a, 0x10, 0x17, 0x96, 0x86, 0xce, 0x61, 0xcb, 0x46, 0x28, 0x53, 0x0e, 0xb9, 0x05, - 0x62, 0xd1, 0xf7, 0xa2, 0xc0, 0x6f, 0x85, 0xa8, 0xc1, 0x8c, 0xf0, 0xe1, 0x14, 0xa6, 0x8b, 0x86, - 0x28, 0xb2, 0x13, 0xa8, 0xe4, 0x11, 0xcc, 0x56, 0x9b, 0x4f, 0x1d, 0xaf, 0x41, 0x9b, 0xbc, 0xe4, - 0x91, 0x1f, 0x3c, 0x79, 0xdc, 0xf2, 0x9f, 0x85, 0x28, 0xef, 0x11, 0x61, 0xe9, 0x13, 0x28, 0xd2, - 0x12, 0xf2, 0x4c, 0x22, 0xd9, 0x79, 0xd4, 0xec, 0x93, 0x5a, 0x6c, 0xf9, 0x9d, 0xa6, 0x18, 0x05, - 0xfc, 0xa4, 0x1a, 0x0c, 0x60, 0x73, 0x38, 0x93, 0xd2, 0x4a, 0x6d, 0x1d, 0xed, 0x6a, 0x42, 0x4a, - 0x07, 0xe1, 0xa1, 0xcd, 0x60, 0xe4, 0x75, 0x18, 0x96, 0x7a, 0x2e, 0x37, 0xfc, 0xa3, 0xc1, 0x59, - 0xea, 0xb7, 0xb2, 0x8c, 0x7d, 0x12, 0x36, 0x6d, 0xf8, 0x4f, 0x69, 0xf0, 0x7c, 0xd1, 0x6f, 0x52, - 0x69, 0x05, 0x12, 0x56, 0x0e, 0x5e, 0x50, 0x6f, 0xb0, 0x12, 0xdb, 0x44, 0x64, 0x15, 0xf0, 0x3d, - 0x30, 0x2c, 0x9f, 0x89, 0x2b, 0xe0, 0x7b, 0x64, 0x68, 0xcb, 0x32, 0xb2, 0x04, 0x67, 0xab, 0x9d, - 0xc8, 0x3f, 0x74, 0x22, 0xb7, 0xb1, 0xd3, 0xde, 0x0f, 0x1c, 0x56, 0x49, 0x09, 0x09, 0x50, 0xef, - 0x77, 0x64, 0x61, 0xbd, 0x23, 0x4a, 0xed, 0x34, 0x01, 0x79, 0x0f, 0xc6, 0x57, 0x43, 0x6e, 0xe9, - 0x73, 0x42, 0xda, 0x44, 0x73, 0x8d, 0x68, 0xa5, 0x1b, 0xd6, 0xd1, 0xee, 0x57, 0x67, 0x27, 0x85, - 0xa6, 0x6d, 0xe0, 0x11, 0x0b, 0x86, 0xaa, 0x61, 0xe8, 0x86, 0x11, 0x5a, 0x61, 0x46, 0x16, 0xe0, - 0xf8, 0xa8, 0x32, 0xe4, 0x20, 0xc4, 0x16, 0x25, 0xe4, 0x11, 0x8c, 0x2d, 0x51, 0xa6, 0x38, 0x6e, - 0x07, 0x9d, 0x30, 0x42, 0x9b, 0xca, 0xd8, 0xfc, 0x79, 0xf1, 0x61, 0x6b, 0x25, 0x62, 0x2e, 0x73, - 0x6d, 0xaf, 0x89, 0xf0, 0x7a, 0xc4, 0x0a, 0xf4, 0x5d, 0x4b, 0xc3, 0x67, 0x5a, 0xb1, 0xa0, 0x59, - 0x71, 0x9b, 0xec, 0x53, 0x9d, 0xc6, 0x36, 0xa0, 0x56, 0x2c, 0xd6, 0x86, 0xfa, 0x01, 0x96, 0xe8, - 0x5a, 0xb1, 0x41, 0x42, 0x1a, 0x29, 0xe3, 0xf1, 0x8c, 0x61, 0x20, 0x34, 0x0b, 0x65, 0x13, 0x4f, - 0x69, 0x5a, 0xfe, 0x18, 0xc6, 0x16, 0x3b, 0x61, 0xe4, 0x1f, 0x6e, 0x1f, 0xd0, 0x43, 0x8a, 0x76, - 0x17, 0xa1, 0xfb, 0x37, 0x10, 0x5c, 0x8f, 0x18, 0x5c, 0xef, 0xa6, 0x86, 0x4e, 0x3e, 0x07, 0x22, - 0x95, 0xf8, 0xfb, 0x6c, 0x7e, 0x78, 0x6c, 0x2e, 0xa3, 0xe9, 0x65, 0x84, 0x6b, 0xee, 0x52, 0xf7, - 0xaf, 0xef, 0xab, 0x62, 0xdd, 0xfc, 0x97, 0x26, 0x66, 0x0d, 0xe2, 0x4d, 0xbc, 0x1f, 0x38, 0xed, - 0x83, 0x72, 0x39, 0xd6, 0xb2, 0x45, 0xa7, 0xf6, 0x19, 0xdc, 0xd0, 0x16, 0x62, 0x74, 0x52, 0x03, - 0xe0, 0x3f, 0xd7, 0xd8, 0xc0, 0x73, 0x63, 0x4d, 0xd9, 0x90, 0x17, 0x2b, 0x90, 0xb2, 0x3a, 0x8f, - 0x3a, 0x08, 0x67, 0xdb, 0x72, 0x8d, 0xd1, 0xd4, 0xd8, 0x90, 0x27, 0x50, 0xe2, 0xbf, 0xd6, 0x7d, - 0xcf, 0x8d, 0xf8, 0xd2, 0x3b, 0x67, 0x58, 0xf6, 0x92, 0xc5, 0xb2, 0x02, 0xb4, 0xa8, 0x8a, 0x0a, - 0x0e, 0x55, 0xa9, 0x56, 0x4d, 0x8a, 0x31, 0xd9, 0x82, 0xb1, 0xad, 0xc0, 0x6f, 0x76, 0x1a, 0x11, - 0x6e, 0xd8, 0x17, 0x50, 0x51, 0x24, 0xa2, 0x1e, 0xad, 0x84, 0xcb, 0xa4, 0xcd, 0x01, 0x75, 0xb6, - 0x99, 0xeb, 0x32, 0xd1, 0x10, 0xc9, 0x02, 0x0c, 0x6d, 0xf9, 0x2d, 0xb7, 0xf1, 0xbc, 0x7c, 0x11, - 0x1b, 0x3d, 0x2d, 0x99, 0x21, 0x50, 0x36, 0x15, 0xb5, 0xc3, 0x36, 0x82, 0x74, 0xed, 0x90, 0x23, - 0x91, 0x2a, 0x4c, 0x7c, 0xce, 0x26, 0x8c, 0xeb, 0x7b, 0x9e, 0xe3, 0x06, 0xb4, 0x7c, 0x09, 0xc7, - 0x05, 0xad, 0xde, 0x3f, 0xd6, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x55, 0x38, 0xb3, 0x1a, 0xd6, - 0xa2, 0xc0, 0x6d, 0xd3, 0x75, 0xc7, 0x73, 0xf6, 0x69, 0xb3, 0x7c, 0x39, 0x36, 0x3b, 0xbb, 0x61, - 0x3d, 0xc4, 0xb2, 0xfa, 0x21, 0x2f, 0xd4, 0xcd, 0xce, 0x09, 0x3a, 0xf2, 0x05, 0x4c, 0x2f, 0x7f, - 0x13, 0xb1, 0x19, 0xd3, 0xaa, 0x76, 0x9a, 0x6e, 0x54, 0x8b, 0xfc, 0xc0, 0xd9, 0xa7, 0xe5, 0x0a, - 0xf2, 0x7b, 0xed, 0xf8, 0xa8, 0x72, 0x85, 0x8a, 0xf2, 0xba, 0xc3, 0x10, 0xea, 0x21, 0xc7, 0xd0, - 0xaf, 0x93, 0xb3, 0x38, 0x30, 0xe9, 0xd7, 0x3a, 0x6d, 0xa6, 0xb8, 0xa2, 0xf4, 0xaf, 0x18, 0xd2, - 0xd7, 0x4a, 0xb8, 0xf4, 0x43, 0x0e, 0x48, 0x49, 0x5f, 0x43, 0x24, 0x36, 0x90, 0x07, 0xbe, 0xeb, - 0x55, 0x1b, 0x91, 0xfb, 0x94, 0x8a, 0x73, 0x7d, 0x58, 0xbe, 0x8a, 0x2d, 0x45, 0x13, 0xf9, 0xaf, - 0xfa, 0xae, 0x57, 0x77, 0xb0, 0xb8, 0x2e, 0xac, 0x00, 0x86, 0x89, 0x3c, 0x4d, 0x4d, 0x7e, 0x08, - 0xe7, 0xd6, 0xfd, 0x3d, 0xb7, 0x45, 0xf9, 0x92, 0xc3, 0xc5, 0x82, 0xe6, 0x3e, 0x0b, 0xf9, 0xa2, - 0x89, 0xfc, 0x10, 0x31, 0xea, 0x62, 0xb5, 0x3a, 0x54, 0x38, 0xba, 0x89, 0x3c, 0x9b, 0x0b, 0x59, - 0x86, 0x71, 0xfc, 0x2e, 0x5b, 0xf8, 0x33, 0x2c, 0x5f, 0xc3, 0xd3, 0xd1, 0xd5, 0x84, 0xc2, 0x73, - 0x73, 0x59, 0xc3, 0x59, 0xf6, 0xa2, 0xe0, 0xb9, 0x6d, 0x90, 0x91, 0x4f, 0x60, 0x2e, 0x39, 0xbd, - 0x17, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x09, 0x68, 0xb3, 0xfc, 0x1a, 0x6b, 0xaa, 0xdd, 0x05, 0x63, - 0xee, 0x11, 0x9c, 0x4d, 0x55, 0x41, 0x4a, 0xd0, 0xff, 0x44, 0xdc, 0x38, 0x8e, 0xda, 0xec, 0x4f, - 0xf2, 0x36, 0x0c, 0x3e, 0x65, 0xc7, 0x12, 0xd4, 0x18, 0xe2, 0x3b, 0x2c, 0x8d, 0x74, 0xd5, 0x7b, - 0xec, 0xdb, 0x1c, 0xe9, 0xc3, 0xe2, 0xfb, 0x85, 0x07, 0x03, 0x23, 0x63, 0xa5, 0x71, 0x7e, 0x51, - 0xfc, 0x60, 0x60, 0x64, 0xa2, 0x34, 0x69, 0x55, 0xe1, 0x4c, 0x02, 0x9f, 0x94, 0x61, 0x98, 0x7a, - 0x4c, 0xd5, 0x6d, 0x72, 0x9d, 0xc5, 0x96, 0x3f, 0xc9, 0x34, 0x0c, 0xb6, 0xdc, 0x43, 0x37, 0xc2, - 0x0a, 0x07, 0x6d, 0xfe, 0xc3, 0xfa, 0xfd, 0x02, 0x90, 0xf4, 0x96, 0x41, 0x6e, 0x25, 0xd8, 0x70, - 0x45, 0x4f, 0x80, 0x74, 0x53, 0xb8, 0xe4, 0xfe, 0x39, 0x4c, 0xf1, 0x31, 0x93, 0x9b, 0x9b, 0x56, - 0x17, 0x5f, 0x54, 0x33, 0x8a, 0x75, 0x73, 0x88, 0x28, 0xc6, 0xad, 0x70, 0x0d, 0x9b, 0xd6, 0x81, - 0x99, 0xcc, 0xcd, 0x82, 0xac, 0xc3, 0xcc, 0xa1, 0xef, 0x45, 0x07, 0xad, 0xe7, 0x72, 0xaf, 0x10, - 0xb5, 0x15, 0xb0, 0x36, 0x5c, 0x1f, 0x33, 0x11, 0xec, 0x29, 0x01, 0x16, 0x1c, 0xb1, 0x9e, 0x07, - 0x03, 0x23, 0xc5, 0x52, 0xbf, 0xea, 0x89, 0x65, 0xc3, 0xd9, 0xd4, 0x9a, 0x4b, 0xbe, 0x0f, 0xe3, - 0x0d, 0x3c, 0xca, 0x18, 0x35, 0xf1, 0x1d, 0x47, 0x83, 0xeb, 0x9f, 0x13, 0x87, 0xf3, 0xae, 0xfc, - 0x51, 0x01, 0x66, 0x73, 0x56, 0xdb, 0xd3, 0x8b, 0xfa, 0x4b, 0x38, 0x77, 0xe8, 0x7c, 0x53, 0x0f, - 0xf0, 0xa4, 0x5a, 0x0f, 0x1c, 0x2f, 0x21, 0x6d, 0x5c, 0x49, 0xb2, 0x31, 0x74, 0x6f, 0x9d, 0x43, - 0xe7, 0x1b, 0x1b, 0x11, 0x6c, 0x56, 0xce, 0xdb, 0xf9, 0x19, 0x4c, 0x18, 0xeb, 0xeb, 0xa9, 0x1b, - 0x67, 0xdd, 0x81, 0xb3, 0xec, 0x2c, 0x1f, 0xd1, 0x13, 0x5b, 0xa8, 0xac, 0x2d, 0x80, 0x1a, 0x3d, - 0x74, 0xda, 0x07, 0x3e, 0xd3, 0xbb, 0x17, 0xf4, 0x5f, 0xc2, 0xc2, 0x41, 0x84, 0xc5, 0x41, 0x15, - 0xec, 0xde, 0xe5, 0xba, 0x78, 0xa8, 0x30, 0x6d, 0x8d, 0xca, 0xfa, 0xf3, 0x22, 0x10, 0xb1, 0x40, - 0x06, 0xd4, 0x39, 0x94, 0xcd, 0xf8, 0x00, 0xc6, 0xf9, 0x79, 0x94, 0x83, 0xb1, 0x39, 0x63, 0xf3, - 0x53, 0xe2, 0xcb, 0xd3, 0x8b, 0x56, 0xfa, 0x6c, 0x03, 0x95, 0x91, 0xda, 0x94, 0x1f, 0xa4, 0x91, - 0xb4, 0x68, 0x90, 0xea, 0x45, 0x8c, 0x54, 0xff, 0x4d, 0x3e, 0x85, 0xc9, 0x45, 0xff, 0xb0, 0xcd, - 0x64, 0x22, 0x88, 0xfb, 0x85, 0x91, 0x42, 0xd4, 0x6b, 0x14, 0xae, 0xf4, 0xd9, 0x09, 0x74, 0xb2, - 0x01, 0x53, 0xf7, 0x5a, 0x9d, 0xf0, 0xa0, 0xea, 0x35, 0x17, 0x5b, 0x7e, 0x28, 0xb9, 0x0c, 0x08, - 0x23, 0x81, 0x58, 0xde, 0xd2, 0x18, 0x2b, 0x7d, 0x76, 0x16, 0x21, 0x79, 0x1d, 0x06, 0x97, 0x9f, - 0xb2, 0x65, 0x57, 0xfa, 0x6c, 0x08, 0x97, 0xb2, 0x4d, 0x8f, 0x6e, 0x3e, 0x5e, 0xe9, 0xb3, 0x79, - 0xe9, 0xc2, 0x28, 0x0c, 0xcb, 0xb3, 0xec, 0x2d, 0xa6, 0x12, 0x2b, 0x71, 0xd6, 0x22, 0x27, 0xea, - 0x84, 0x64, 0x0e, 0x46, 0x76, 0xda, 0xec, 0x88, 0x25, 0x8d, 0x00, 0xb6, 0xfa, 0x6d, 0xbd, 0x6d, - 0x4a, 0x9a, 0x5c, 0xd4, 0xed, 0xc7, 0x1c, 0x39, 0x06, 0x58, 0x2b, 0xa6, 0x70, 0xbb, 0x63, 0x1b, - 0xf5, 0x16, 0x13, 0xf5, 0x96, 0x92, 0xb2, 0xb6, 0x66, 0x32, 0x85, 0x67, 0x7d, 0x01, 0x97, 0x77, - 0xda, 0x21, 0x0d, 0xa2, 0x6a, 0xbb, 0xdd, 0x72, 0x1b, 0xfc, 0xce, 0x07, 0xcf, 0xbc, 0x72, 0xb2, - 0xbc, 0x07, 0x43, 0x1c, 0x20, 0xa6, 0x89, 0x9c, 0x83, 0xd5, 0x76, 0x5b, 0x9c, 0xb4, 0xef, 0x72, - 0xe5, 0x9c, 0x9f, 0x9d, 0x6d, 0x81, 0x6d, 0xfd, 0x4e, 0x01, 0x2e, 0xf3, 0x2f, 0x20, 0x97, 0xf5, - 0x77, 0x60, 0x14, 0x3d, 0xba, 0xda, 0x4e, 0x43, 0x7e, 0x13, 0xdc, 0xb5, 0x4d, 0x02, 0xed, 0xb8, - 0x5c, 0xf3, 0x95, 0x2b, 0xe6, 0xfb, 0xca, 0xc9, 0x0f, 0xac, 0x3f, 0xf3, 0x03, 0xfb, 0x1c, 0x2c, - 0xd1, 0xa2, 0x56, 0x2b, 0xd5, 0xa8, 0xf0, 0x45, 0x5a, 0x65, 0xfd, 0xd7, 0x22, 0xcc, 0xde, 0xa7, - 0x1e, 0x0d, 0x1c, 0xec, 0xa7, 0x61, 0xd3, 0xd1, 0x7d, 0x66, 0x0a, 0x5d, 0x7d, 0x66, 0x2a, 0xd2, - 0x4a, 0x56, 0x44, 0x2b, 0x59, 0xca, 0x01, 0x88, 0x1d, 0x17, 0x77, 0xec, 0x55, 0xd1, 0x2d, 0x3c, - 0x2e, 0x76, 0x02, 0x17, 0xed, 0xe0, 0x64, 0x35, 0xf6, 0xb7, 0x19, 0xe8, 0x69, 0x2e, 0x9b, 0x12, - 0xfe, 0x07, 0xc3, 0xc2, 0xdf, 0xc6, 0xf4, 0xb2, 0xd9, 0x80, 0x21, 0x6e, 0xdc, 0xc3, 0xdb, 0x9a, - 0xb1, 0xf9, 0x1b, 0xe2, 0x9b, 0xca, 0xe9, 0xa0, 0xb0, 0x04, 0xe2, 0xc6, 0xce, 0xa7, 0x40, 0x84, - 0x00, 0x5b, 0x70, 0x99, 0xfb, 0x1c, 0xc6, 0x34, 0x94, 0x93, 0xec, 0xfd, 0xca, 0xc8, 0xc8, 0x34, - 0x46, 0x6f, 0x9f, 0xdb, 0x2b, 0xb5, 0xbd, 0xdf, 0xfa, 0x08, 0xca, 0xe9, 0xd6, 0x08, 0xc3, 0x52, - 0x2f, 0x3b, 0x96, 0xb5, 0x04, 0xd3, 0xf7, 0x69, 0x84, 0x13, 0x17, 0x3f, 0x22, 0xcd, 0x6f, 0x2c, - 0xf1, 0x9d, 0xc9, 0x55, 0x55, 0xde, 0xea, 0xe8, 0x5f, 0x69, 0x0d, 0x66, 0x12, 0x5c, 0x44, 0xfd, - 0x1f, 0xc2, 0xb0, 0x00, 0xa9, 0x15, 0x55, 0x38, 0x9f, 0xd2, 0x3d, 0x51, 0xb0, 0x3b, 0xcf, 0xe7, - 0xad, 0xe0, 0x6c, 0x4b, 0x02, 0xeb, 0x00, 0xce, 0xb1, 0x6d, 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x05, - 0x18, 0x6d, 0x33, 0x45, 0x21, 0x74, 0x7f, 0xc2, 0xa7, 0xd1, 0xa0, 0x3d, 0xc2, 0x00, 0x35, 0xf7, - 0x27, 0x94, 0x5c, 0x02, 0xc0, 0x42, 0xec, 0xa6, 0x58, 0x05, 0x10, 0x9d, 0x1b, 0xee, 0x08, 0xa0, - 0xd7, 0x19, 0x9f, 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, 0x9b, 0xaa, 0x49, 0x74, 0xe0, 0x16, 0x8c, - 0x48, 0x15, 0x36, 0x61, 0x52, 0xd7, 0x7b, 0x60, 0x2b, 0x24, 0xf2, 0x06, 0x9c, 0xf1, 0xe8, 0x37, - 0x51, 0x3d, 0xd5, 0x86, 0x09, 0x06, 0xde, 0x92, 0xed, 0xb0, 0x7e, 0x05, 0xcd, 0xa8, 0x35, 0xcf, - 0x7f, 0xf6, 0xb8, 0xe5, 0x3c, 0xa1, 0xa9, 0x8a, 0xbf, 0x0f, 0x23, 0xb5, 0xde, 0x15, 0xf3, 0xcf, - 0x47, 0x56, 0x6e, 0x2b, 0x12, 0xab, 0x05, 0x73, 0xac, 0x4b, 0xb5, 0xea, 0xfa, 0xda, 0x6a, 0x73, - 0xeb, 0xdb, 0x16, 0xe0, 0x53, 0xb8, 0x90, 0x59, 0xdb, 0xb7, 0x2d, 0xc4, 0x7f, 0x39, 0x00, 0xb3, - 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0x93, 0x2f, 0x35, 0xbf, 0x94, 0x1b, 0xc9, 0xdb, 0x19, 0x37, 0x92, - 0x48, 0xa2, 0xdf, 0x48, 0x1a, 0xf7, 0x90, 0xef, 0x67, 0xdf, 0x43, 0xa2, 0x9d, 0xc8, 0xbc, 0x87, - 0x4c, 0xde, 0x3e, 0x2e, 0xe7, 0xdf, 0x3e, 0xe2, 0x35, 0x4b, 0xc6, 0xed, 0x63, 0xd6, 0x9d, 0x63, - 0xc2, 0xf5, 0x67, 0xe4, 0xd5, 0xba, 0xfe, 0xbc, 0x01, 0xc3, 0xd5, 0x76, 0x5b, 0x73, 0xa5, 0xc3, - 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0x3f, 0x00, 0x58, - 0x44, 0x87, 0x7f, 0x1c, 0xb8, 0x31, 0xc4, 0x40, 0x0d, 0x9f, 0x3f, 0x03, 0xc0, 0x81, 0xd3, 0x2d, - 0x20, 0x31, 0x32, 0x57, 0xec, 0xad, 0x5d, 0x28, 0xa7, 0xa7, 0xcf, 0x2b, 0x58, 0xba, 0xfe, 0xb4, - 0x00, 0x97, 0x84, 0x92, 0x93, 0xf8, 0xc0, 0x4f, 0x3f, 0x3b, 0xdf, 0x85, 0x71, 0x41, 0xbb, 0x1d, - 0x7f, 0x08, 0xfc, 0x0a, 0x58, 0x2e, 0xc6, 0x7c, 0x45, 0x37, 0xd0, 0xc8, 0xbb, 0x30, 0x82, 0x7f, - 0xc4, 0xd7, 0x20, 0x4c, 0x32, 0xa3, 0x88, 0x5a, 0x4f, 0x5e, 0x86, 0x28, 0x54, 0xeb, 0x6b, 0xb8, - 0x9c, 0xd7, 0xf0, 0x57, 0x20, 0x97, 0x7f, 0x55, 0x80, 0x0b, 0x82, 0xbd, 0xb1, 0x54, 0xbc, 0xd0, - 0xae, 0x73, 0x0a, 0x07, 0xdc, 0x07, 0x30, 0xc6, 0x2a, 0x94, 0xed, 0xee, 0x17, 0x5b, 0xab, 0x38, - 0x39, 0xc4, 0x25, 0x4b, 0x4e, 0xe4, 0x08, 0x87, 0x12, 0xe7, 0xb0, 0x25, 0x8d, 0x17, 0xb6, 0x4e, - 0x6c, 0x7d, 0x05, 0x17, 0xb3, 0xbb, 0xf0, 0x0a, 0xe4, 0xf3, 0x00, 0xe6, 0x32, 0x36, 0x85, 0x17, - 0xdb, 0x93, 0xbf, 0x84, 0x0b, 0x99, 0xbc, 0x5e, 0x41, 0x33, 0x57, 0x98, 0xc6, 0x11, 0xbd, 0x82, - 0x21, 0xb4, 0x1e, 0xc1, 0xf9, 0x0c, 0x4e, 0xaf, 0xa0, 0x89, 0xf7, 0x61, 0x56, 0x69, 0xda, 0x2f, - 0xd5, 0xc2, 0x75, 0xb8, 0xc4, 0x19, 0xbd, 0x9a, 0x51, 0x79, 0x08, 0x17, 0x04, 0xbb, 0x57, 0x20, - 0xbd, 0x15, 0xb8, 0x18, 0x1f, 0xa8, 0x33, 0xf4, 0xa4, 0x13, 0x2f, 0x32, 0xd6, 0x1a, 0x5c, 0x89, - 0x39, 0xe5, 0x28, 0x0d, 0x27, 0xe7, 0xc6, 0xd5, 0xc1, 0x78, 0x94, 0x5e, 0xc9, 0x88, 0x3e, 0x82, - 0x73, 0x06, 0xd3, 0x57, 0xa6, 0x2a, 0xad, 0xc2, 0x14, 0x67, 0x6c, 0xaa, 0xce, 0xf3, 0xba, 0xea, - 0x3c, 0x36, 0x7f, 0x36, 0x66, 0x89, 0xe0, 0xdd, 0xbb, 0x19, 0xda, 0xf4, 0x3a, 0x6a, 0xd3, 0x12, - 0x25, 0x6e, 0xe1, 0xbb, 0x30, 0xc4, 0x21, 0xa2, 0x7d, 0x19, 0xcc, 0xf8, 0x61, 0x81, 0x93, 0x09, - 0x64, 0xeb, 0x87, 0x70, 0x89, 0x9f, 0x44, 0xe3, 0xbb, 0x44, 0xf3, 0xb4, 0xf8, 0xfd, 0xc4, 0x41, - 0xf4, 0xbc, 0xe0, 0x9b, 0xc4, 0xcf, 0x39, 0x8f, 0xee, 0xc9, 0xb9, 0x9d, 0xc7, 0xff, 0x44, 0x8f, - 0xb1, 0xe4, 0x01, 0xb3, 0x98, 0x79, 0xc0, 0xbc, 0x06, 0x57, 0xd5, 0x01, 0x33, 0x59, 0x8d, 0x9c, - 0x5a, 0xd6, 0x57, 0x70, 0x81, 0x77, 0x54, 0x3a, 0xc9, 0x99, 0xcd, 0xf8, 0x28, 0xd1, 0xcd, 0x59, - 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x6f, 0x41, 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd9, 0x27, - 0xee, 0x0d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, 0xe3, 0xf6, 0x3a, 0xcc, 0xe8, 0x6c, 0xdc, - 0x06, 0xdd, 0xbd, 0x83, 0x97, 0x3c, 0xef, 0xb0, 0xcf, 0x02, 0x01, 0x72, 0xda, 0x95, 0x33, 0xe4, - 0x86, 0xf8, 0xb6, 0xc2, 0xb4, 0xea, 0x70, 0x31, 0x3d, 0x14, 0x6e, 0x43, 0x7a, 0xc8, 0x93, 0x4f, - 0xd9, 0x27, 0x8c, 0x10, 0x31, 0x18, 0xb9, 0x4c, 0xe5, 0x77, 0xcc, 0xc9, 0x25, 0x95, 0x65, 0xc9, - 0xa5, 0x26, 0xd1, 0x7f, 0x56, 0xbb, 0x9c, 0x0f, 0xbf, 0x0e, 0x44, 0x16, 0x2d, 0xd6, 0x6c, 0x59, - 0xf5, 0x79, 0xe8, 0x5f, 0xac, 0xd9, 0xe2, 0x69, 0x0e, 0x6a, 0x82, 0x8d, 0x30, 0xb0, 0x19, 0x2c, - 0xa9, 0x91, 0x17, 0x4f, 0xa0, 0x91, 0x3f, 0x18, 0x18, 0xe9, 0x2f, 0x0d, 0xd8, 0xa4, 0xe6, 0xee, - 0x7b, 0x8f, 0xdc, 0xe8, 0x40, 0x55, 0x58, 0xb5, 0x7e, 0x00, 0x53, 0x46, 0xf5, 0xe2, 0x2b, 0xee, - 0xfa, 0xa6, 0x88, 0xe9, 0xb3, 0x8b, 0x55, 0x74, 0x22, 0x41, 0x93, 0xc5, 0x38, 0x5f, 0x6f, 0x1a, - 0x4e, 0x1d, 0x1f, 0xac, 0xda, 0xb2, 0xd0, 0xfa, 0xc7, 0x03, 0x1a, 0x77, 0xed, 0xa5, 0x56, 0x97, - 0xde, 0xdd, 0x01, 0xe0, 0x33, 0x44, 0xeb, 0x1c, 0x53, 0x00, 0xc7, 0x84, 0x6f, 0x06, 0x5f, 0x92, - 0x6d, 0x0d, 0xe9, 0xa4, 0x2f, 0xb9, 0x84, 0x47, 0x2d, 0x27, 0x92, 0x8f, 0x17, 0x95, 0x47, 0xad, - 0x60, 0x1d, 0xda, 0x3a, 0x12, 0xf9, 0x61, 0xf2, 0xb9, 0xc1, 0x20, 0xde, 0x29, 0xbd, 0x26, 0x2f, - 0x99, 0xd3, 0x7d, 0x3b, 0xdd, 0x8b, 0x83, 0x67, 0x30, 0xc3, 0x68, 0xdd, 0xc7, 0x78, 0xb0, 0x58, - 0xfe, 0x26, 0xa2, 0x1e, 0x5f, 0xdb, 0x87, 0xb0, 0x9e, 0xd7, 0xbb, 0xd4, 0x13, 0x23, 0x0b, 0xfb, - 0x7b, 0xcc, 0xa7, 0x4e, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, 0x91, 0xbd, 0xb6, 0xec, 0x35, 0xdb, - 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xad, 0x3a, 0x15, 0x70, 0x5b, 0x47, 0xb2, 0xde, 0xe8, - 0xea, 0xa7, 0x3d, 0x02, 0x03, 0xdb, 0x8b, 0xdb, 0x6b, 0xa5, 0x82, 0x75, 0x0b, 0x40, 0xab, 0x09, - 0x60, 0x68, 0x63, 0xd3, 0x5e, 0xaf, 0xae, 0x95, 0xfa, 0xc8, 0x0c, 0x9c, 0x7d, 0xb4, 0xba, 0xb1, - 0xb4, 0xf9, 0xa8, 0x56, 0xaf, 0xad, 0x57, 0xed, 0xed, 0xc5, 0xaa, 0xbd, 0x54, 0x2a, 0x58, 0x5f, - 0xc3, 0xb4, 0xd9, 0xc3, 0x57, 0x3a, 0x09, 0x23, 0x98, 0x52, 0xfa, 0xcc, 0x83, 0x47, 0xdb, 0x9a, - 0xff, 0xa6, 0x38, 0xfc, 0x25, 0xfd, 0x90, 0xc4, 0x31, 0x51, 0x7c, 0x46, 0x1a, 0x12, 0x79, 0x8b, - 0xab, 0x05, 0xc9, 0xb7, 0xb8, 0x4c, 0x2d, 0xa8, 0xc7, 0x7a, 0x01, 0x2e, 0x7d, 0xdf, 0x83, 0x69, - 0xb3, 0xd6, 0x93, 0x5a, 0xa9, 0x5e, 0x43, 0xc7, 0x56, 0xed, 0xa1, 0x0e, 0x21, 0xfa, 0xb5, 0x81, - 0x58, 0x59, 0xbf, 0x07, 0x25, 0x81, 0x15, 0xef, 0xbc, 0xd7, 0xa4, 0x19, 0xb1, 0x90, 0xf1, 0xac, - 0x50, 0xba, 0x59, 0xfb, 0x50, 0x62, 0x2b, 0xa6, 0xa0, 0xe4, 0x15, 0x4c, 0xc3, 0xe0, 0x5a, 0x7c, - 0x9d, 0x63, 0xf3, 0x1f, 0xf8, 0x5e, 0x25, 0x72, 0x82, 0x48, 0x7a, 0x7d, 0x8d, 0xda, 0xea, 0x37, - 0x79, 0x0b, 0x86, 0xee, 0xb9, 0xad, 0x48, 0x98, 0x46, 0xe2, 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, - 0x40, 0xb0, 0x6c, 0x38, 0xab, 0x55, 0x78, 0x8a, 0xa6, 0x92, 0x32, 0x0c, 0x6f, 0xd0, 0x6f, 0xb4, - 0xfa, 0xe5, 0x4f, 0xeb, 0x3d, 0x38, 0x2b, 0x3c, 0xea, 0x34, 0x31, 0x5d, 0x15, 0xaf, 0x9f, 0x0b, - 0xc6, 0x13, 0x4c, 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x4e, 0xbb, 0xf9, 0x82, 0x74, 0x6c, 0xa3, 0x38, - 0x25, 0xdd, 0x9b, 0xf2, 0x16, 0xa8, 0xd7, 0x70, 0xfe, 0x79, 0x01, 0xca, 0x09, 0x2b, 0xc3, 0xe2, - 0x81, 0xd3, 0x6a, 0x51, 0x6f, 0x9f, 0x92, 0xeb, 0x30, 0xb0, 0xbd, 0xb9, 0xbd, 0x25, 0xac, 0xa4, - 0xd2, 0x01, 0x80, 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x21, 0x9c, 0x95, 0x3e, 0xb3, 0xaa, 0x48, - 0x8c, 0xd0, 0xa5, 0xee, 0x1e, 0xb8, 0x69, 0x3a, 0xf2, 0x8e, 0x30, 0x89, 0xfc, 0xb8, 0xe3, 0x06, - 0xb4, 0x89, 0x96, 0x9f, 0xf8, 0x36, 0x5d, 0x2b, 0xb1, 0x75, 0x34, 0xfe, 0x56, 0xd5, 0xfa, 0xbd, - 0x02, 0xcc, 0xe6, 0x58, 0x4d, 0xc8, 0x5b, 0x46, 0x77, 0xa6, 0xb4, 0xee, 0x48, 0x94, 0x95, 0x3e, - 0xd1, 0x9f, 0x45, 0xcd, 0x91, 0xb8, 0xff, 0x14, 0x8e, 0xc4, 0x2b, 0x7d, 0xb1, 0xf3, 0xf0, 0x02, - 0xc0, 0x88, 0x84, 0x5b, 0x67, 0x60, 0xc2, 0x90, 0x9b, 0x65, 0xc1, 0xb8, 0x5e, 0x33, 0x1b, 0x9c, - 0x45, 0xbf, 0xa9, 0x06, 0x87, 0xfd, 0x6d, 0xfd, 0x6e, 0x01, 0xa6, 0xb1, 0x8b, 0xfb, 0x2e, 0x5b, - 0xfa, 0x62, 0x09, 0xcd, 0x1b, 0x3d, 0xb9, 0x68, 0xf4, 0x24, 0x81, 0xab, 0xba, 0xf4, 0x61, 0xaa, - 0x4b, 0x17, 0xb3, 0xba, 0x84, 0xd3, 0xdb, 0xf5, 0x3d, 0xa3, 0x27, 0xda, 0x55, 0xd4, 0xef, 0x17, - 0x60, 0x4a, 0x6b, 0x93, 0x6a, 0xff, 0x1d, 0xa3, 0x49, 0x17, 0x32, 0x9a, 0x94, 0x12, 0xf2, 0x42, - 0xaa, 0x45, 0xaf, 0x75, 0x6b, 0x51, 0x4f, 0x19, 0xff, 0xe7, 0x02, 0xcc, 0x64, 0xca, 0x80, 0x9c, - 0x63, 0xba, 0x6d, 0x23, 0xa0, 0x91, 0x10, 0xaf, 0xf8, 0xc5, 0xe0, 0xab, 0x61, 0xd8, 0xa1, 0x81, - 0xf8, 0xce, 0xc5, 0x2f, 0xf2, 0x1a, 0x4c, 0x6c, 0xd1, 0xc0, 0xf5, 0x9b, 0xdc, 0xc5, 0x9c, 0xfb, - 0x6e, 0x4e, 0xd8, 0x26, 0x90, 0x5c, 0x84, 0xd1, 0x6a, 0x6b, 0xdf, 0x0f, 0xdc, 0xe8, 0x80, 0xdf, - 0x06, 0x8e, 0xda, 0x31, 0x80, 0xf1, 0x5e, 0x72, 0xf7, 0xf9, 0xa5, 0x06, 0x23, 0x16, 0xbf, 0xd8, - 0xe2, 0x22, 0xad, 0x85, 0x43, 0x7c, 0x71, 0x91, 0xa6, 0xc0, 0x73, 0x30, 0xf4, 0xb9, 0x8d, 0x93, - 0x00, 0x23, 0x04, 0xd8, 0xe2, 0x17, 0x99, 0x44, 0x27, 0x61, 0x7c, 0x95, 0x80, 0xce, 0xc1, 0x1f, - 0xc2, 0x74, 0x96, 0x5c, 0xb3, 0xa6, 0x90, 0xa0, 0x2d, 0x2a, 0xda, 0xaf, 0x60, 0xaa, 0xda, 0x6c, - 0xae, 0xdf, 0xab, 0x72, 0x9f, 0x03, 0x31, 0xaa, 0xfc, 0xe3, 0xe1, 0xf6, 0x3a, 0xa1, 0xb2, 0x0d, - 0xac, 0x7a, 0x6e, 0x64, 0x4f, 0x2d, 0x7f, 0xe3, 0x86, 0x91, 0xeb, 0xed, 0x6b, 0x46, 0x45, 0xfb, - 0xdc, 0x06, 0x7d, 0x96, 0x31, 0x05, 0xd8, 0x6e, 0x6a, 0xf2, 0xe6, 0xf0, 0x0c, 0xe6, 0xd3, 0x1a, - 0xdb, 0x78, 0x29, 0x99, 0x35, 0xf9, 0xc6, 0x05, 0xfd, 0xd5, 0xc6, 0x13, 0xeb, 0x7b, 0x70, 0x8e, - 0x2f, 0x69, 0xdd, 0x1a, 0x2f, 0x9a, 0xad, 0xdb, 0x40, 0xad, 0xf7, 0xa5, 0x95, 0xa2, 0x6b, 0xcb, - 0xec, 0x71, 0xa3, 0x2d, 0x58, 0xe5, 0x7f, 0x29, 0xc0, 0x5c, 0x82, 0xb4, 0xf6, 0xdc, 0x6b, 0xc8, - 0xf5, 0xf4, 0x8d, 0xa4, 0x13, 0x36, 0xea, 0x01, 0xdc, 0xf8, 0xe7, 0x36, 0x95, 0x1f, 0x36, 0xb9, - 0x05, 0xc0, 0x89, 0xb5, 0xed, 0x1b, 0x4d, 0xdf, 0xc2, 0xc9, 0x06, 0x37, 0x70, 0x0d, 0x85, 0x74, - 0x20, 0x4b, 0xee, 0xe2, 0x1b, 0xe9, 0x65, 0x1b, 0xc6, 0xa8, 0x18, 0x54, 0x90, 0xd7, 0x73, 0x8c, - 0xc4, 0x59, 0xfc, 0xad, 0xff, 0xaf, 0x1f, 0x66, 0xf5, 0x01, 0x7c, 0x91, 0xbe, 0x6e, 0xc1, 0xd8, - 0xa2, 0xef, 0x45, 0xf4, 0x9b, 0x48, 0x8b, 0x4a, 0x40, 0xd4, 0x4d, 0xbb, 0x2a, 0x11, 0xaa, 0x23, - 0x07, 0xd4, 0x99, 0x1e, 0x63, 0x38, 0x0b, 0xc6, 0x88, 0x64, 0x11, 0x26, 0x36, 0xe8, 0xb3, 0x94, - 0x00, 0xd1, 0x61, 0xd1, 0xa3, 0xcf, 0xea, 0x9a, 0x10, 0x75, 0x2f, 0x32, 0x83, 0x86, 0xec, 0xc1, - 0xa4, 0x9c, 0x5c, 0x86, 0x30, 0xe7, 0xf4, 0x5d, 0xc5, 0x9c, 0xce, 0xfc, 0xd5, 0x3e, 0xab, 0x21, - 0x47, 0x86, 0x09, 0x8e, 0xac, 0xeb, 0xbc, 0x46, 0xfe, 0x10, 0xdd, 0xdc, 0xb6, 0xb4, 0x12, 0xc3, - 0x1d, 0x34, 0xf9, 0x00, 0x5d, 0x67, 0x61, 0x6d, 0x41, 0x39, 0x3d, 0x1e, 0xa2, 0xb6, 0x77, 0x60, - 0x88, 0x43, 0x85, 0x1a, 0x20, 0x03, 0xce, 0x28, 0x6c, 0x7e, 0x4e, 0xe7, 0xd5, 0xd8, 0x02, 0xd7, - 0x5a, 0x41, 0xdb, 0x89, 0xc2, 0x51, 0x8a, 0xd8, 0xed, 0xe4, 0xf0, 0xa2, 0xa7, 0xad, 0x1c, 0x5e, - 0xdd, 0xcf, 0x44, 0x3e, 0x2e, 0x58, 0x44, 0xf3, 0x93, 0xce, 0x49, 0x34, 0xec, 0x06, 0x0c, 0x0b, - 0x50, 0x22, 0x14, 0x4e, 0xfc, 0xf9, 0x49, 0x04, 0xeb, 0x43, 0x38, 0x8f, 0xb6, 0x30, 0xd7, 0xdb, - 0x6f, 0xd1, 0x9d, 0xd0, 0x78, 0x1e, 0xd0, 0xeb, 0xb3, 0xfe, 0x18, 0xe6, 0xb2, 0x68, 0x7b, 0x7e, - 0xd9, 0x3c, 0x38, 0xc5, 0x5f, 0x15, 0x61, 0x7a, 0x35, 0xd4, 0x95, 0x09, 0x15, 0xa0, 0x22, 0x23, - 0x68, 0x02, 0xca, 0x64, 0xa5, 0x2f, 0x2b, 0x28, 0xc2, 0x3b, 0xda, 0xe3, 0xc4, 0x62, 0xb7, 0x68, - 0x08, 0x6c, 0xdb, 0x52, 0xcf, 0x13, 0xdf, 0x80, 0x81, 0x0d, 0xb6, 0x54, 0xf7, 0x8b, 0xb1, 0xe3, - 0x14, 0x0c, 0x84, 0x8f, 0x03, 0xd9, 0x16, 0xc9, 0x7e, 0x90, 0x7b, 0xa9, 0x27, 0x88, 0x03, 0xbd, - 0x5f, 0xfb, 0xaf, 0xf4, 0xa5, 0x5e, 0x23, 0xbe, 0x07, 0x63, 0xd5, 0xe6, 0x21, 0xf7, 0x08, 0xf4, - 0xbd, 0xc4, 0x67, 0xa9, 0x95, 0xac, 0xf4, 0xd9, 0x3a, 0x22, 0x3b, 0xe1, 0x56, 0xdb, 0x6d, 0xdc, - 0xa8, 0xb2, 0x22, 0x20, 0xac, 0xf4, 0xa1, 0x83, 0xfd, 0xc2, 0x08, 0x0c, 0x6d, 0x3b, 0xc1, 0x3e, - 0x8d, 0xac, 0xaf, 0x60, 0x4e, 0x38, 0xa9, 0x70, 0xcb, 0x1f, 0xba, 0xb2, 0x84, 0xb1, 0x1f, 0x52, - 0x37, 0xc7, 0x92, 0xcb, 0x00, 0xa8, 0xe7, 0xaf, 0x7a, 0x4d, 0xfa, 0x8d, 0xf0, 0x92, 0xd3, 0x20, - 0xd6, 0xbb, 0x30, 0xaa, 0x24, 0x84, 0xca, 0xac, 0xb6, 0xd9, 0xa1, 0xb4, 0xa6, 0x8d, 0x37, 0x97, - 0xf2, 0xa1, 0xe5, 0x79, 0xa3, 0xef, 0x22, 0xa6, 0x09, 0xd7, 0x7e, 0x5d, 0x98, 0x49, 0x4c, 0x82, - 0xf8, 0xc9, 0xbc, 0xd2, 0x3f, 0xb9, 0x1b, 0x9f, 0xfa, 0x9d, 0x54, 0x4f, 0x8b, 0x27, 0x52, 0x4f, - 0xad, 0x7f, 0x5a, 0xc4, 0x83, 0x53, 0x4a, 0x1e, 0x09, 0x1b, 0x94, 0x6e, 0x07, 0x5b, 0x80, 0x51, - 0xec, 0xfd, 0x92, 0x7c, 0xfa, 0xd5, 0xdd, 0xc7, 0x62, 0xe4, 0x67, 0x47, 0x95, 0x3e, 0x74, 0xac, - 0x88, 0xc9, 0xc8, 0x27, 0x30, 0xbc, 0xec, 0x35, 0x91, 0x43, 0xff, 0x29, 0x38, 0x48, 0x22, 0x36, - 0x26, 0xd8, 0xe4, 0x6d, 0xf6, 0x09, 0x73, 0xd3, 0x85, 0xad, 0x41, 0xe2, 0x13, 0xdc, 0x60, 0xde, - 0x09, 0x6e, 0x28, 0x71, 0x82, 0xb3, 0x60, 0x70, 0x33, 0x68, 0x8a, 0x48, 0x24, 0x93, 0xf3, 0xe3, - 0x42, 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0xdf, 0x0a, 0x30, 0x7b, 0x9f, 0x46, 0x99, 0x73, 0xc8, - 0x90, 0x4a, 0xe1, 0xa5, 0xa5, 0x52, 0x7c, 0x11, 0xa9, 0xa8, 0x5e, 0xf7, 0xe7, 0xf5, 0x7a, 0x20, - 0xaf, 0xd7, 0x83, 0xf9, 0xbd, 0xbe, 0x0f, 0x43, 0xbc, 0xab, 0xec, 0x94, 0xba, 0x1a, 0xd1, 0xc3, - 0xf8, 0x94, 0xaa, 0x7b, 0x88, 0xd9, 0xbc, 0x8c, 0x29, 0x92, 0x6b, 0x4e, 0xa8, 0x9f, 0x52, 0xc5, - 0x4f, 0xeb, 0x47, 0xf8, 0x68, 0x74, 0xcd, 0x6f, 0x3c, 0xd1, 0xac, 0x9d, 0xc3, 0xfc, 0x0b, 0x4d, - 0x5a, 0xc7, 0x19, 0x16, 0x2f, 0xb1, 0x25, 0x06, 0xb9, 0x02, 0x63, 0xab, 0xde, 0x3d, 0x3f, 0x68, - 0xd0, 0x4d, 0xaf, 0xc5, 0xb9, 0x8f, 0xd8, 0x3a, 0x48, 0x58, 0x01, 0x44, 0x0d, 0xf1, 0xd1, 0x1a, - 0x01, 0x89, 0xa3, 0x35, 0x83, 0xed, 0xce, 0xdb, 0xbc, 0x4c, 0x18, 0x19, 0xd8, 0xdf, 0xdd, 0x4e, - 0xa5, 0xea, 0xf8, 0xda, 0x0b, 0x71, 0x0f, 0xce, 0xdb, 0xb4, 0xdd, 0x72, 0x98, 0x4e, 0x77, 0xe8, - 0x73, 0x7c, 0xd5, 0xe7, 0x2b, 0x19, 0x0f, 0xbe, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0x62, 0x97, 0x26, - 0x1f, 0xc2, 0xd5, 0xfb, 0x34, 0x32, 0x17, 0xd4, 0xd8, 0x96, 0x2a, 0x3a, 0xbf, 0x02, 0x23, 0xa1, - 0x69, 0x07, 0xbe, 0x2c, 0xaf, 0x1f, 0xb2, 0x08, 0x77, 0xef, 0xca, 0x9b, 0x12, 0xc1, 0x47, 0xfd, - 0x65, 0x7d, 0x0a, 0x95, 0xbc, 0xea, 0x4e, 0xe6, 0xce, 0xe9, 0xc2, 0x95, 0x7c, 0x06, 0xa2, 0xb9, - 0xcb, 0x20, 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd5, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, 0x16, 0xa4, - 0x63, 0xdb, 0x4b, 0x34, 0xb7, 0x8e, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x55, 0x18, 0x91, 0x30, - 0x21, 0xd7, 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x25, 0x03, 0x45, 0x66, 0xfd, 0x48, 0x5e, 0x4d, - 0x98, 0x14, 0x27, 0x7b, 0x01, 0x79, 0x92, 0xbb, 0x08, 0xcb, 0x87, 0xf3, 0x26, 0x6f, 0xdd, 0xe4, - 0x5c, 0xd2, 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xc5, 0x34, 0x81, 0x16, 0xc5, 0xbc, 0x8c, 0x41, 0xe4, - 0xb2, 0x6e, 0x58, 0x1e, 0x4f, 0x3f, 0xa9, 0xbc, 0x0d, 0x73, 0x59, 0x15, 0x6a, 0xe7, 0x40, 0x65, - 0xbd, 0x14, 0xfa, 0xce, 0x12, 0x5c, 0x96, 0xb1, 0x80, 0x7c, 0x3f, 0x0a, 0xa3, 0xc0, 0x69, 0xd7, - 0x1a, 0x81, 0xdb, 0x8e, 0xa9, 0x2c, 0x18, 0xe2, 0x10, 0x21, 0x09, 0x7e, 0xcd, 0xc3, 0x71, 0x44, - 0x89, 0xf5, 0x9b, 0x05, 0xb0, 0x0c, 0x1f, 0x24, 0x1c, 0xe7, 0xad, 0xc0, 0x7f, 0xea, 0x36, 0xb5, - 0xab, 0x95, 0xb7, 0x0c, 0xb3, 0x1e, 0x7f, 0x12, 0x97, 0x74, 0x7f, 0x16, 0x6b, 0xe6, 0xed, 0x84, - 0xa9, 0x8d, 0x2b, 0x9e, 0xe8, 0x97, 0x64, 0x06, 0x5d, 0x51, 0x26, 0xb8, 0xff, 0x51, 0x80, 0x6b, - 0x5d, 0xdb, 0x20, 0xfa, 0xb3, 0x07, 0xa5, 0x64, 0x99, 0x98, 0x41, 0x15, 0xcd, 0x27, 0x21, 0xcd, - 0x61, 0xf7, 0x0e, 0xf7, 0xb1, 0x96, 0xbe, 0x3b, 0x6d, 0xc5, 0x39, 0xc5, 0xef, 0xf4, 0xad, 0x27, - 0x1f, 0x00, 0x6c, 0xfb, 0x91, 0xd3, 0x5a, 0x44, 0x03, 0x40, 0x7f, 0xec, 0x2f, 0x1f, 0x31, 0x68, - 0x3d, 0x19, 0xa4, 0x40, 0x43, 0xb6, 0x3e, 0xc3, 0xef, 0x3a, 0xbb, 0xd1, 0x27, 0xfb, 0xd4, 0x16, - 0xe1, 0x5a, 0xe2, 0x5e, 0xfc, 0x05, 0x98, 0x44, 0x30, 0xc3, 0xc4, 0xcf, 0x74, 0xef, 0xfb, 0x81, - 0xdf, 0x69, 0xff, 0x72, 0x46, 0xfd, 0xcf, 0x0a, 0xdc, 0x51, 0x51, 0xaf, 0x56, 0x0c, 0xf4, 0x22, - 0x40, 0x0c, 0x4d, 0x38, 0xac, 0xab, 0x82, 0xdd, 0x3b, 0xfc, 0xc8, 0x8d, 0x16, 0xf3, 0x7d, 0xce, - 0x40, 0x23, 0xfb, 0xe5, 0x8e, 0xe4, 0x5d, 0xbc, 0x0c, 0x57, 0xb5, 0x9f, 0x4c, 0xee, 0xef, 0x49, - 0xfb, 0xc7, 0x29, 0xe9, 0x0e, 0x60, 0x9a, 0xad, 0x00, 0xd5, 0x4e, 0x74, 0xe0, 0x07, 0x6e, 0x24, - 0x9f, 0x5e, 0x90, 0x2d, 0xf1, 0xb6, 0x9b, 0x53, 0x7d, 0xfc, 0x8b, 0xa3, 0xca, 0xfb, 0xa7, 0x89, - 0xd2, 0x28, 0x79, 0x6e, 0xab, 0xf7, 0xe0, 0xd6, 0x2c, 0xf4, 0x2f, 0xda, 0x6b, 0xb8, 0xe0, 0xd9, - 0x6b, 0x6a, 0xc1, 0xb3, 0xd7, 0xac, 0xbf, 0x29, 0x42, 0x85, 0x47, 0x9f, 0x40, 0x1f, 0x8a, 0xd8, - 0x6a, 0xa1, 0x39, 0x65, 0x9c, 0xd4, 0xc0, 0x90, 0x88, 0x2e, 0x51, 0x3c, 0x49, 0x74, 0x89, 0x5f, - 0x83, 0x1c, 0x93, 0xd5, 0x09, 0xac, 0x00, 0x6f, 0x1e, 0x1f, 0x55, 0xae, 0xc5, 0x56, 0x00, 0x5e, - 0x9a, 0x65, 0x0e, 0xc8, 0xa9, 0x22, 0x6d, 0xbf, 0x18, 0x78, 0x01, 0xfb, 0xc5, 0x6d, 0x18, 0xc6, - 0xc3, 0xcc, 0xea, 0x96, 0xf0, 0x6a, 0xc4, 0xe9, 0x89, 0xf1, 0x64, 0xea, 0xae, 0x1e, 0xbc, 0x4d, - 0xa2, 0x59, 0x7f, 0xbf, 0x08, 0x57, 0xf2, 0x65, 0x2e, 0xda, 0xb6, 0x04, 0x10, 0x7b, 0x6f, 0x74, - 0xf3, 0x16, 0xc1, 0x6f, 0xe7, 0x19, 0xdd, 0x53, 0xde, 0x5a, 0x1a, 0x1d, 0xd3, 0x7d, 0xe4, 0x43, - 0xdf, 0xc4, 0x55, 0x81, 0xf1, 0xfe, 0x57, 0xc4, 0x1e, 0x15, 0x20, 0x23, 0xf6, 0xa8, 0x80, 0x91, - 0x3d, 0x98, 0xdd, 0x0a, 0xdc, 0xa7, 0x4e, 0x44, 0x1f, 0xd2, 0xe7, 0xfc, 0x21, 0xcc, 0xb2, 0x78, - 0xfd, 0xc2, 0x5f, 0x6f, 0x5f, 0x3f, 0x3e, 0xaa, 0xbc, 0xd6, 0xe6, 0x28, 0x18, 0x5f, 0x8a, 0x3f, - 0x3d, 0xac, 0xa7, 0x1f, 0xc4, 0xe4, 0x31, 0xb2, 0xfe, 0x4d, 0x01, 0x2e, 0xa0, 0x5a, 0x2e, 0xcc, - 0xae, 0xb2, 0xf2, 0x17, 0x72, 0x1a, 0xd4, 0x3b, 0x28, 0xe6, 0x22, 0x3a, 0x0d, 0x1a, 0x0f, 0xa1, - 0x6d, 0x03, 0x8d, 0xac, 0xc2, 0x98, 0xf8, 0x8d, 0xdf, 0x5f, 0x3f, 0x1e, 0x08, 0x66, 0xb4, 0x05, - 0x0b, 0xa7, 0x3a, 0x37, 0x15, 0xe1, 0xc4, 0x16, 0xcc, 0xf0, 0xbd, 0xa0, 0xad, 0xd3, 0x5a, 0x3f, - 0x2f, 0xc2, 0xc5, 0x5d, 0x1a, 0xb8, 0x8f, 0x9f, 0xe7, 0x74, 0x66, 0x13, 0xa6, 0x25, 0x88, 0x47, - 0xa0, 0x30, 0x3e, 0x31, 0x1e, 0x7d, 0x50, 0x36, 0x55, 0x84, 0xb0, 0x90, 0x5f, 0x5c, 0x26, 0xe1, - 0x29, 0xdc, 0x01, 0xdf, 0x81, 0x91, 0x44, 0x0c, 0x18, 0x1c, 0x7f, 0xf9, 0x85, 0xc6, 0x43, 0xb5, - 0xd2, 0x67, 0x2b, 0x4c, 0xf2, 0x5b, 0xf9, 0xf7, 0x37, 0xc2, 0xf4, 0xd1, 0xcb, 0xfe, 0x89, 0x1f, - 0x2c, 0xfb, 0x58, 0x1d, 0xad, 0x34, 0xe3, 0x83, 0x5d, 0xe9, 0xb3, 0xf3, 0x6a, 0x5a, 0x18, 0x83, - 0xd1, 0x2a, 0xde, 0x49, 0xb1, 0x93, 0xfb, 0x7f, 0x2f, 0xc2, 0x65, 0xf9, 0xa8, 0x25, 0x47, 0xcc, - 0x5f, 0xc0, 0xac, 0x04, 0x55, 0xdb, 0x4c, 0x61, 0xa0, 0x4d, 0x53, 0xd2, 0x3c, 0x02, 0xa8, 0x94, - 0xb4, 0x23, 0x70, 0x62, 0x61, 0xe7, 0x91, 0xbf, 0x1a, 0xeb, 0xe7, 0x27, 0x59, 0x11, 0x79, 0xd0, - 0x0a, 0xa9, 0xaf, 0x99, 0x86, 0x68, 0x8c, 0xf5, 0xb3, 0x99, 0xb2, 0x9e, 0x0e, 0xbc, 0xac, 0xf5, - 0x74, 0xa5, 0x2f, 0x69, 0x3f, 0x5d, 0x98, 0x84, 0xf1, 0x0d, 0xfa, 0x2c, 0x96, 0xfb, 0xff, 0x5d, - 0x48, 0x44, 0x1a, 0x60, 0x1a, 0x06, 0x0f, 0x39, 0x50, 0x88, 0x83, 0xba, 0x60, 0xa4, 0x01, 0x5d, - 0xc3, 0xe0, 0xa8, 0xab, 0x30, 0xcc, 0x2f, 0x6a, 0x9b, 0x27, 0x38, 0xe1, 0xab, 0xd7, 0x29, 0xfc, - 0xc9, 0x60, 0x93, 0x1f, 0xf6, 0x05, 0xbd, 0xf5, 0x10, 0xae, 0x0a, 0xff, 0x65, 0x73, 0xf0, 0xb1, - 0xa2, 0x53, 0x6e, 0x5f, 0x96, 0x03, 0x97, 0xef, 0xd3, 0xe4, 0xd2, 0x63, 0xbc, 0xde, 0xf9, 0x14, - 0xce, 0x18, 0x70, 0xc5, 0x11, 0xb5, 0x52, 0x35, 0x87, 0x14, 0xeb, 0x24, 0xb6, 0x75, 0x25, 0xab, - 0x0a, 0xbd, 0xb1, 0x16, 0xc5, 0x50, 0x9e, 0x41, 0x7c, 0xc5, 0x16, 0x9e, 0x62, 0xd5, 0xbb, 0xae, - 0x7d, 0xd7, 0x7c, 0xc5, 0xe3, 0xb1, 0xde, 0xe4, 0xce, 0xab, 0x4a, 0xad, 0x09, 0xe3, 0x2e, 0xc0, - 0x9a, 0x84, 0x71, 0x59, 0xd4, 0xa2, 0x61, 0x68, 0xfd, 0x74, 0x10, 0x2c, 0x21, 0xd8, 0xac, 0xdb, - 0x67, 0x29, 0x8f, 0xbd, 0x54, 0x63, 0xc5, 0x46, 0x75, 0x4e, 0x8f, 0x20, 0x19, 0x97, 0xf2, 0x99, - 0x87, 0x7a, 0x5e, 0x23, 0x86, 0x1a, 0x33, 0x2f, 0xd5, 0xfb, 0x1f, 0xe4, 0x2c, 0x93, 0xfc, 0x63, - 0x7b, 0xfd, 0xf8, 0xa8, 0x72, 0x35, 0x67, 0x99, 0x34, 0xf8, 0x66, 0x2f, 0x99, 0xb6, 0x79, 0x25, - 0xd2, 0xff, 0x22, 0x57, 0x22, 0xec, 0x8b, 0xd4, 0x2f, 0x45, 0x76, 0x4c, 0x59, 0x8a, 0xef, 0x51, - 0x5e, 0x69, 0xeb, 0x45, 0xe2, 0xc1, 0xbf, 0x06, 0x31, 0xb8, 0x1a, 0x6c, 0x88, 0x0b, 0x25, 0xcd, - 0x66, 0xb9, 0x78, 0x40, 0x1b, 0x4f, 0x84, 0xad, 0x58, 0x5e, 0xe8, 0x66, 0xd9, 0xcc, 0x79, 0x34, - 0x61, 0xfe, 0x9d, 0xf3, 0x82, 0x7a, 0x83, 0x91, 0xea, 0x01, 0x0b, 0x92, 0x6c, 0xc9, 0x4f, 0x60, - 0x4a, 0x0d, 0x75, 0xc2, 0xfd, 0x68, 0x6c, 0xfe, 0xb5, 0x38, 0xf0, 0xe4, 0xe1, 0x63, 0xe7, 0xe6, - 0xd3, 0x3b, 0x37, 0x33, 0x70, 0xf9, 0x3b, 0xf8, 0x86, 0x2c, 0xd0, 0x7c, 0x8f, 0xf4, 0x8b, 0xae, - 0x2c, 0x42, 0xed, 0x3a, 0xfb, 0xef, 0x29, 0x67, 0x79, 0xa6, 0x2f, 0xb8, 0x2d, 0x2a, 0x5e, 0xbd, - 0xc8, 0xd9, 0x97, 0x73, 0x15, 0x57, 0xf8, 0x96, 0xaf, 0xe2, 0xfe, 0xb8, 0x28, 0x9f, 0x08, 0xa4, - 0x6f, 0x43, 0x4f, 0x7d, 0x23, 0x97, 0xd9, 0x83, 0x13, 0x6d, 0xa6, 0x99, 0x8d, 0x23, 0x0b, 0xf2, - 0x3e, 0x53, 0xc5, 0x86, 0x9a, 0x54, 0x77, 0x03, 0x71, 0x81, 0x71, 0xc5, 0x89, 0xaa, 0x8b, 0x46, - 0x95, 0xbc, 0x2c, 0xeb, 0x7f, 0xf9, 0xcb, 0xb2, 0x7f, 0x31, 0x0a, 0x67, 0xb7, 0x9c, 0x7d, 0xd7, - 0x63, 0x8b, 0xb6, 0x4d, 0x43, 0xbf, 0x13, 0x34, 0x28, 0xa9, 0xc2, 0xa4, 0xe9, 0xff, 0xd9, 0xc3, - 0xbb, 0x95, 0xed, 0x4b, 0x26, 0x8c, 0xcc, 0xc3, 0xa8, 0x7a, 0x73, 0x2a, 0x36, 0x93, 0x8c, 0xb7, - 0xa8, 0x2b, 0x7d, 0x76, 0x8c, 0x46, 0x3e, 0x30, 0xee, 0x77, 0xce, 0xa8, 0xe7, 0xd3, 0x88, 0x3b, - 0xcf, 0x1d, 0xf4, 0x3c, 0xbf, 0x69, 0x6e, 0x88, 0xfc, 0x12, 0xe3, 0x47, 0xa9, 0x2b, 0x9f, 0x41, - 0xa3, 0xc5, 0x29, 0xbb, 0x17, 0xea, 0x02, 0xb9, 0xe1, 0x9c, 0x33, 0x2e, 0x83, 0xbe, 0x82, 0xb1, - 0x87, 0x9d, 0x3d, 0x2a, 0x2f, 0xb7, 0x86, 0xc4, 0xfe, 0x98, 0xf4, 0x6a, 0x16, 0xe5, 0xbb, 0x77, - 0xf9, 0x18, 0x3c, 0xe9, 0xec, 0xd1, 0x74, 0x9c, 0x70, 0xb6, 0x30, 0x69, 0xcc, 0xc8, 0x01, 0x94, - 0x92, 0x0e, 0xc8, 0x22, 0x9a, 0x5a, 0x17, 0xb7, 0x69, 0x0c, 0xe5, 0xa1, 0x45, 0x23, 0xe7, 0x6e, - 0x91, 0x46, 0x25, 0x29, 0xae, 0xe4, 0xd7, 0x61, 0x26, 0xd3, 0xea, 0xa8, 0x9e, 0x50, 0x75, 0x37, - 0x68, 0xe2, 0xa2, 0x9e, 0x90, 0x9a, 0x7c, 0xaf, 0x65, 0xd4, 0x9c, 0x5d, 0x0b, 0x69, 0xc2, 0x99, - 0x84, 0x63, 0xad, 0x48, 0xb9, 0x90, 0xef, 0xaa, 0x8b, 0x1b, 0x93, 0x8c, 0x5a, 0x9a, 0x59, 0x57, - 0x92, 0x25, 0x59, 0x83, 0x51, 0x75, 0xdc, 0xc7, 0xd7, 0x59, 0xd9, 0xa6, 0x8d, 0xf2, 0xf1, 0x51, - 0x65, 0x3a, 0x36, 0x6d, 0x18, 0x3c, 0x63, 0x06, 0xe4, 0x37, 0xe0, 0xaa, 0x9a, 0xa2, 0x9b, 0x41, - 0xb6, 0x11, 0x48, 0x44, 0x3b, 0xbf, 0x91, 0x9c, 0xe1, 0x79, 0xf8, 0xbb, 0x77, 0x16, 0x8a, 0xe5, - 0xc2, 0x4a, 0x9f, 0xdd, 0x9b, 0x35, 0xf9, 0x69, 0x01, 0xce, 0xe5, 0xd4, 0x3a, 0x8e, 0xb5, 0xf6, - 0xb4, 0xcc, 0xa1, 0x72, 0x8f, 0xcf, 0x86, 0xdc, 0x66, 0xfc, 0xbc, 0x4e, 0x9a, 0xe8, 0x8c, 0x7e, - 0xe7, 0xd4, 0x44, 0xde, 0x86, 0x21, 0x3c, 0x23, 0x87, 0xe5, 0x09, 0xd4, 0x22, 0x31, 0x82, 0x0d, - 0x9e, 0xa4, 0xf5, 0x7d, 0x43, 0xe0, 0x90, 0x15, 0xa6, 0x8d, 0xe1, 0xbe, 0x25, 0xb5, 0x27, 0x11, - 0xef, 0x4a, 0x68, 0xf4, 0xbc, 0x48, 0x46, 0xb9, 0x30, 0xc2, 0xda, 0x9b, 0x64, 0x0b, 0x00, 0x23, - 0x81, 0x58, 0x95, 0x1e, 0x0c, 0x8c, 0x0c, 0x94, 0x06, 0xf9, 0x87, 0x23, 0x3d, 0xb6, 0x7f, 0x7b, - 0x84, 0x3f, 0xef, 0xdc, 0xf1, 0xdc, 0xc7, 0x6e, 0xbc, 0x80, 0xe9, 0xd6, 0xb5, 0x38, 0xbf, 0x8c, - 0xd0, 0x7d, 0x73, 0x32, 0xc9, 0x28, 0x43, 0x5c, 0xb1, 0xa7, 0x21, 0xee, 0xae, 0x76, 0x65, 0xa5, - 0x85, 0x88, 0xe4, 0x3a, 0x8e, 0x69, 0xf8, 0x8a, 0xef, 0xb2, 0xbe, 0x86, 0x21, 0x8c, 0xea, 0xc8, - 0xef, 0x03, 0xc7, 0xe6, 0x6f, 0x8a, 0x65, 0xbb, 0x4b, 0xf3, 0x79, 0x18, 0x48, 0xf1, 0x64, 0x9b, - 0x4b, 0x1c, 0x01, 0x86, 0xc4, 0x11, 0x42, 0xb6, 0x61, 0x6a, 0x2b, 0xa0, 0x4d, 0xe1, 0x37, 0xdc, - 0x0e, 0x84, 0x71, 0x82, 0x9b, 0x3d, 0x70, 0xcb, 0x6f, 0xcb, 0xe2, 0x3a, 0x55, 0xe5, 0xfa, 0x86, - 0x9a, 0x41, 0x4e, 0x96, 0x61, 0xb2, 0x46, 0x9d, 0xa0, 0x71, 0xf0, 0x90, 0x3e, 0x67, 0xea, 0x8e, - 0x91, 0x52, 0x21, 0xc4, 0x12, 0xd6, 0x5f, 0x2c, 0xd2, 0x7d, 0x3c, 0x4c, 0x22, 0xf2, 0x19, 0x0c, - 0xd5, 0xfc, 0x20, 0x5a, 0x78, 0x2e, 0x16, 0x35, 0x79, 0x63, 0xc4, 0x81, 0x0b, 0xe7, 0x65, 0x5a, - 0x89, 0xd0, 0x0f, 0xa2, 0xfa, 0x9e, 0x11, 0x12, 0x89, 0xa3, 0x90, 0xe7, 0x30, 0x6d, 0x2e, 0x28, - 0xc2, 0x9d, 0x75, 0x44, 0xa8, 0x59, 0x59, 0xab, 0x16, 0x47, 0x59, 0xb8, 0x2e, 0xb8, 0x5f, 0x49, - 0x2e, 0x5b, 0x8f, 0xb1, 0x5c, 0x8f, 0x52, 0x94, 0x45, 0x4f, 0xd6, 0x31, 0x1f, 0x07, 0xef, 0x51, - 0x35, 0xe4, 0x6e, 0xb0, 0xa3, 0x71, 0xd0, 0xad, 0x0e, 0x2e, 0x4a, 0x28, 0x09, 0x27, 0x4c, 0x26, - 0x71, 0xb1, 0x53, 0xa4, 0x64, 0x0b, 0xce, 0xee, 0x84, 0x74, 0x2b, 0xa0, 0x4f, 0x5d, 0xfa, 0x4c, - 0xf2, 0x83, 0x38, 0x42, 0x11, 0xe3, 0xd7, 0xe6, 0xa5, 0x59, 0x0c, 0xd3, 0xc4, 0xe4, 0x03, 0x80, - 0x2d, 0xd7, 0xf3, 0x68, 0x13, 0xaf, 0x1d, 0xc7, 0x90, 0x15, 0x9a, 0x54, 0xdb, 0x08, 0xad, 0xfb, - 0x5e, 0x4b, 0x17, 0xa9, 0x86, 0x4c, 0x16, 0x60, 0x62, 0xd5, 0x6b, 0xb4, 0x3a, 0xc2, 0x3d, 0x20, - 0xc4, 0x05, 0x45, 0x44, 0x4e, 0x73, 0x79, 0x41, 0x3d, 0xf5, 0x91, 0x9b, 0x24, 0xe4, 0x21, 0x10, - 0x01, 0x10, 0xb3, 0xd6, 0xd9, 0x6b, 0x51, 0xf1, 0xb9, 0xa3, 0xa9, 0x44, 0x32, 0xc2, 0xe9, 0x6e, - 0x04, 0x24, 0x4b, 0x91, 0xcd, 0x7d, 0x00, 0x63, 0xda, 0x9c, 0xcf, 0x88, 0x41, 0x30, 0xad, 0xc7, - 0x20, 0x18, 0xd5, 0x63, 0x0d, 0xfc, 0xa3, 0x02, 0x5c, 0xcc, 0xfe, 0x96, 0x84, 0x02, 0xb6, 0x09, - 0xa3, 0x0a, 0xa8, 0x5e, 0x9d, 0x48, 0xd5, 0x3f, 0xa1, 0x01, 0xf1, 0x0f, 0x5a, 0xae, 0x3c, 0x7a, - 0xef, 0x63, 0x1e, 0x2f, 0x60, 0x8f, 0xff, 0x7f, 0x46, 0x60, 0x1a, 0xbd, 0xab, 0x93, 0xeb, 0xd4, - 0xa7, 0x18, 0x4b, 0x04, 0x61, 0x9a, 0x79, 0x59, 0x58, 0x9a, 0x38, 0x3c, 0x19, 0xf8, 0xca, 0x20, - 0x20, 0xef, 0xea, 0x3e, 0x11, 0x45, 0x2d, 0xff, 0x87, 0x04, 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, - 0x32, 0xae, 0xe4, 0x4f, 0xbc, 0xe8, 0x0d, 0x9c, 0x74, 0xd1, 0xdb, 0x51, 0x8b, 0x1e, 0x8f, 0x51, - 0xf1, 0xa6, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xe8, 0x55, 0xaf, 0x76, 0xc3, 0x2f, 0xb7, 0xda, - 0x8d, 0xbc, 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x37, 0x28, 0x6d, 0x6a, 0x17, 0x25, 0xa3, 0xf1, 0xee, - 0xe9, 0x51, 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, 0x57, 0x4d, 0xf8, 0xbb, 0x59, 0x35, - 0xc7, 0x5e, 0xf1, 0xaa, 0x39, 0xfe, 0x32, 0xab, 0x66, 0x6a, 0xe9, 0x9b, 0x38, 0xf5, 0xd2, 0xf7, - 0x32, 0xab, 0xd5, 0x27, 0xe8, 0x52, 0x58, 0xab, 0xad, 0x08, 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xc5, - 0x0f, 0xa5, 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0x5b, 0x7e, 0x20, 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x01, - 0x1d, 0x09, 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x2c, 0x9e, 0xec, 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, - 0x65, 0xb9, 0xf5, 0x57, 0x05, 0x7e, 0x29, 0xf9, 0xbf, 0xe3, 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, - 0x15, 0x3f, 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xf1, 0x24, 0xbe, 0xa9, 0xfd, 0x21, 0xfb, 0xce, - 0xf5, 0x02, 0x0c, 0xac, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xdd, 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, - 0x38, 0xd8, 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x3b, 0x63, 0xd9, 0xfc, 0x25, 0x7a, 0x66, 0x0b, - 0xde, 0x4b, 0xbf, 0xa5, 0xc6, 0xc3, 0x48, 0xfc, 0x96, 0x5a, 0x17, 0x63, 0xfc, 0xaa, 0x7a, 0x07, - 0x2e, 0xd8, 0xf4, 0xd0, 0x7f, 0x4a, 0x5f, 0x2d, 0xdb, 0x1f, 0xc0, 0x79, 0x93, 0x21, 0x7f, 0x75, - 0xc3, 0x03, 0xa2, 0x7f, 0x92, 0x1d, 0x46, 0x5d, 0x10, 0xf0, 0x30, 0xea, 0x3c, 0x1a, 0x33, 0xfb, - 0x53, 0xdf, 0x37, 0xb0, 0xcc, 0xf2, 0xe1, 0xa2, 0xc9, 0xbc, 0xda, 0x6c, 0x62, 0xb6, 0xc5, 0x86, - 0xdb, 0x76, 0xbc, 0x88, 0x6c, 0xc2, 0x98, 0xf6, 0x33, 0x61, 0x2a, 0xd0, 0x4a, 0x84, 0x4e, 0x13, - 0x03, 0x8c, 0x10, 0x9c, 0x31, 0xd8, 0xa2, 0x50, 0x49, 0x8a, 0x87, 0x89, 0x4c, 0xaf, 0x73, 0x01, - 0x26, 0xb4, 0x9f, 0xca, 0x64, 0x89, 0x1f, 0xbf, 0x56, 0x83, 0x29, 0x30, 0x93, 0xc4, 0x6a, 0xc0, - 0x5c, 0x96, 0xd0, 0x30, 0x3a, 0xd3, 0x73, 0xb2, 0x1c, 0xc7, 0x79, 0xea, 0xed, 0x6d, 0x77, 0x26, - 0x2f, 0xc6, 0x93, 0xf5, 0xff, 0x0f, 0xc0, 0x05, 0x31, 0x18, 0xaf, 0x72, 0xc4, 0xc9, 0x8f, 0x60, - 0x4c, 0x1b, 0x63, 0x21, 0xf4, 0x2b, 0x32, 0xf4, 0x66, 0xde, 0x5c, 0xe0, 0x26, 0x8d, 0x0e, 0x02, - 0xea, 0x89, 0xe1, 0x5e, 0xe9, 0xb3, 0x75, 0x96, 0xa4, 0x05, 0x93, 0xe6, 0x40, 0x0b, 0xab, 0xce, - 0xb5, 0xcc, 0x4a, 0x4c, 0x54, 0x19, 0xc8, 0xb9, 0x59, 0xcf, 0x1c, 0xee, 0x95, 0x3e, 0x3b, 0xc1, - 0x9b, 0x7c, 0x03, 0x67, 0x53, 0xa3, 0x2c, 0x8c, 0x75, 0x6f, 0x64, 0x56, 0x98, 0xc2, 0xe6, 0xe6, - 0xd8, 0x00, 0xc1, 0xb9, 0xd5, 0xa6, 0x2b, 0x21, 0x4d, 0x18, 0xd7, 0x07, 0x5e, 0x98, 0x9d, 0xae, - 0x76, 0x11, 0x25, 0x47, 0xe4, 0xca, 0x9d, 0x90, 0x25, 0x8e, 0xfd, 0x73, 0xd3, 0xc4, 0x6c, 0x20, - 0x8f, 0xc0, 0x10, 0xff, 0xcd, 0x96, 0x80, 0xad, 0x80, 0x86, 0xd4, 0x6b, 0x50, 0xc3, 0x41, 0xfb, - 0x25, 0x97, 0x80, 0x7f, 0x5d, 0x80, 0x72, 0x16, 0xdf, 0x1a, 0xf5, 0x9a, 0x64, 0x0b, 0x4a, 0xc9, - 0x8a, 0xc4, 0xac, 0xb6, 0x54, 0xac, 0xdc, 0xdc, 0x26, 0xad, 0xf4, 0xd9, 0x29, 0x6a, 0xb2, 0x01, - 0x67, 0x35, 0x98, 0x30, 0xae, 0x16, 0x4f, 0x62, 0x5c, 0x65, 0xa3, 0x90, 0x22, 0xd5, 0x6d, 0xd3, - 0x2b, 0xb8, 0x33, 0x2e, 0xf9, 0x87, 0x8e, 0xeb, 0x31, 0x45, 0x57, 0x0b, 0xf5, 0x04, 0x31, 0x54, - 0xc8, 0x86, 0x5b, 0x5b, 0x11, 0x2a, 0x1f, 0x94, 0x28, 0x14, 0xeb, 0x63, 0x5c, 0xc1, 0x85, 0x8d, - 0x8e, 0x3f, 0x4f, 0x55, 0xcc, 0xae, 0xc0, 0xe0, 0xf6, 0x5a, 0x6d, 0xb1, 0x2a, 0x1e, 0xbb, 0xf2, - 0x10, 0x09, 0xad, 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, 0x04, 0xe4, 0x3e, 0x8d, 0x44, 0xb0, - 0x76, 0x45, 0xf7, 0x3a, 0x0c, 0x0b, 0x90, 0xa0, 0x44, 0xd7, 0xb8, 0x96, 0xc0, 0x92, 0x65, 0xd6, - 0x96, 0x3c, 0x27, 0xb4, 0xa8, 0x13, 0x6a, 0x1b, 0xf3, 0xfb, 0x30, 0x12, 0x08, 0x98, 0xd8, 0x97, - 0x27, 0x55, 0x5a, 0x0b, 0x04, 0x73, 0x7b, 0xb6, 0xc4, 0xb1, 0xd5, 0x5f, 0xd6, 0x1a, 0x86, 0x33, - 0xd9, 0x5c, 0x5d, 0x5a, 0x64, 0x52, 0x15, 0xc2, 0x92, 0xc3, 0x71, 0x0b, 0x7d, 0xc8, 0x23, 0xaa, - 0x3f, 0x75, 0x45, 0xd1, 0xe0, 0x47, 0x2e, 0x82, 0xf8, 0x68, 0x28, 0xd6, 0x5d, 0x15, 0x1c, 0x25, - 0x83, 0x5b, 0x5e, 0x7a, 0x86, 0x0d, 0x0c, 0xfb, 0x72, 0x1f, 0xdd, 0x65, 0x5e, 0x45, 0x23, 0x1c, - 0x98, 0xe3, 0xdb, 0x3c, 0xeb, 0x95, 0x48, 0x40, 0xe7, 0xab, 0xa5, 0x71, 0x11, 0x46, 0x15, 0x4c, - 0xdd, 0x7d, 0x71, 0x59, 0x19, 0xf8, 0xbb, 0x77, 0xf9, 0xab, 0xe0, 0x86, 0x62, 0x10, 0xd3, 0xb1, - 0x2a, 0xf8, 0x77, 0xf7, 0x2d, 0x57, 0x11, 0xd2, 0x20, 0xfa, 0x56, 0xab, 0x88, 0xe3, 0x02, 0x9d, - 0xa6, 0x0a, 0x03, 0x7f, 0x77, 0xfe, 0x24, 0x82, 0xfa, 0x96, 0xab, 0x60, 0x82, 0xfa, 0xf6, 0xaa, - 0xa0, 0x32, 0x80, 0x12, 0x9f, 0xa4, 0xa9, 0x4a, 0x96, 0xd3, 0x95, 0x48, 0xc3, 0x75, 0x82, 0xa2, - 0xeb, 0x78, 0x50, 0xb8, 0xc8, 0x85, 0xf5, 0x4b, 0xa8, 0x86, 0x09, 0xec, 0xdb, 0xad, 0xe6, 0x1f, - 0x14, 0x78, 0x38, 0xa7, 0xda, 0xa6, 0x96, 0xfa, 0xd1, 0x7b, 0xec, 0x6b, 0x57, 0xf3, 0xda, 0xd7, - 0xfe, 0xd0, 0xf5, 0x9a, 0xfa, 0xd5, 0xbc, 0xd3, 0x89, 0x0e, 0x54, 0xb8, 0xe3, 0x27, 0xae, 0xd7, - 0xb4, 0x93, 0xd8, 0xe4, 0x03, 0x98, 0xd0, 0x40, 0x4a, 0x5b, 0xe3, 0x39, 0x23, 0x74, 0x72, 0xb7, - 0x69, 0x9b, 0x98, 0xd6, 0xdf, 0x16, 0x60, 0x2a, 0x23, 0x29, 0x31, 0x1a, 0x33, 0xf0, 0x14, 0xa4, - 0x16, 0x2a, 0x91, 0x30, 0x09, 0x23, 0x4b, 0x18, 0x9b, 0xa4, 0x42, 0xc4, 0x68, 0xf9, 0x5a, 0x02, - 0xe5, 0xa2, 0x96, 0xba, 0x2b, 0x3b, 0x69, 0xb2, 0x8e, 0x4e, 0x42, 0x80, 0xb8, 0x25, 0xc2, 0x6c, - 0x5c, 0x63, 0x2a, 0xad, 0x96, 0x7d, 0xf9, 0x95, 0xa4, 0x7f, 0xd6, 0xaa, 0xb1, 0x7e, 0xab, 0x08, - 0xe7, 0x32, 0xfa, 0x5f, 0xa3, 0xd1, 0xdf, 0x85, 0x08, 0x12, 0x39, 0xb0, 0xfb, 0x7f, 0x49, 0x39, - 0xb0, 0xad, 0x7f, 0x5f, 0x84, 0x73, 0x3b, 0xed, 0x10, 0x5f, 0x58, 0xad, 0x7a, 0x4f, 0xa9, 0x17, - 0xf9, 0xc1, 0x73, 0x7c, 0x15, 0x42, 0xde, 0x85, 0xc1, 0x15, 0xda, 0x6a, 0xf9, 0x62, 0xfe, 0x5f, - 0x92, 0xde, 0x11, 0x49, 0x6c, 0x44, 0x5a, 0xe9, 0xb3, 0x39, 0x36, 0xf9, 0x00, 0x46, 0x57, 0xa8, - 0x13, 0x44, 0x7b, 0xd4, 0x91, 0x47, 0x16, 0x99, 0xc9, 0x42, 0x23, 0x11, 0x08, 0x2b, 0x7d, 0x76, - 0x8c, 0x4d, 0xe6, 0xd9, 0x69, 0xde, 0xdb, 0x57, 0xaf, 0xc9, 0x73, 0x2a, 0x64, 0x38, 0x2b, 0x7d, - 0x36, 0xe2, 0x92, 0x75, 0x98, 0xa8, 0xee, 0x53, 0x2f, 0x5a, 0xa7, 0x91, 0xd3, 0x74, 0x22, 0x47, - 0xa8, 0xb6, 0xaf, 0xe7, 0x11, 0x1b, 0xc8, 0x2b, 0x7d, 0xb6, 0x49, 0x4d, 0x3e, 0x82, 0xe1, 0xfb, - 0xbe, 0xdf, 0xdc, 0x7b, 0x4e, 0x85, 0xba, 0x5a, 0xc9, 0x63, 0x24, 0xd0, 0x56, 0xfa, 0x6c, 0x49, - 0xb1, 0x30, 0x08, 0xfd, 0xeb, 0xe1, 0xbe, 0x75, 0x54, 0x80, 0xf2, 0x92, 0xff, 0xcc, 0xcb, 0x94, - 0xea, 0xf7, 0x4c, 0xa9, 0x4a, 0xf6, 0x19, 0xf8, 0x09, 0xb9, 0xbe, 0x03, 0x03, 0x5b, 0xae, 0xb7, - 0x9f, 0x50, 0x05, 0x33, 0xe8, 0x18, 0x16, 0x8a, 0xc7, 0xf5, 0xf6, 0xc9, 0x9a, 0xd4, 0xc1, 0x85, - 0xad, 0xb1, 0xdf, 0x50, 0xfc, 0x33, 0xa8, 0x75, 0xec, 0x58, 0xd7, 0xe6, 0xbf, 0x65, 0x07, 0xdf, - 0x82, 0xd9, 0x9c, 0x7a, 0xc5, 0xf3, 0x70, 0xd6, 0xb7, 0x01, 0x54, 0x6c, 0xde, 0x84, 0x99, 0xcc, - 0xf1, 0x4b, 0x21, 0xfe, 0x93, 0xac, 0x89, 0xc8, 0x7b, 0x5e, 0x86, 0x61, 0x99, 0x2d, 0x89, 0xdb, - 0x7e, 0xe4, 0x4f, 0x7c, 0x20, 0x25, 0x3f, 0x54, 0x19, 0xd8, 0x43, 0x7e, 0x8f, 0xbb, 0x5a, 0x20, - 0x25, 0xfe, 0x39, 0x7d, 0xf8, 0x12, 0x1f, 0x8d, 0xe2, 0xc5, 0xea, 0x5c, 0xf1, 0xc3, 0xc8, 0x53, - 0x9e, 0xb7, 0xb6, 0xfa, 0x4d, 0x6e, 0x40, 0x49, 0xa6, 0x73, 0x10, 0x79, 0x63, 0x44, 0xc6, 0x6e, - 0x3b, 0x05, 0x27, 0xef, 0xc3, 0x6c, 0x12, 0x26, 0x7b, 0xc9, 0x5f, 0xb8, 0xe5, 0x15, 0x5b, 0x7f, - 0x59, 0xc4, 0x58, 0xd7, 0x5d, 0xe6, 0x35, 0x93, 0xee, 0x66, 0x4d, 0x48, 0xab, 0xb8, 0x59, 0x23, - 0x17, 0x61, 0x74, 0xb3, 0x66, 0xa4, 0x9c, 0xb2, 0x63, 0x00, 0x6b, 0x36, 0xeb, 0x42, 0x35, 0x68, - 0x1c, 0xb8, 0x11, 0x6d, 0x44, 0x9d, 0x40, 0xac, 0xc2, 0x76, 0x0a, 0x4e, 0x2c, 0x18, 0xbf, 0xdf, - 0x72, 0xf7, 0x1a, 0x92, 0x19, 0x17, 0x81, 0x01, 0x23, 0x6f, 0xc0, 0xe4, 0xaa, 0x17, 0x46, 0x4e, - 0xab, 0xb5, 0x4e, 0xa3, 0x03, 0xbf, 0x29, 0x92, 0x66, 0xda, 0x09, 0x28, 0xab, 0x77, 0xd1, 0xf7, - 0x22, 0xc7, 0xf5, 0x68, 0x60, 0x77, 0xbc, 0xc8, 0x3d, 0xa4, 0xa2, 0xef, 0x29, 0x38, 0x79, 0x07, - 0x66, 0x14, 0x6c, 0x33, 0x68, 0x1c, 0xd0, 0x30, 0x0a, 0x30, 0x11, 0x1d, 0x06, 0xfc, 0xb1, 0xb3, - 0x0b, 0xb1, 0x86, 0x96, 0xdf, 0x69, 0x2e, 0x7b, 0x4f, 0xdd, 0xc0, 0xf7, 0x30, 0x37, 0xc5, 0x88, - 0xa8, 0x21, 0x01, 0xb7, 0xfe, 0x70, 0x24, 0xf3, 0xb3, 0x7d, 0x99, 0x39, 0xf8, 0x25, 0x8c, 0x2f, - 0x3a, 0x6d, 0x67, 0xcf, 0x6d, 0xb9, 0x91, 0xab, 0x32, 0x76, 0xbd, 0xdb, 0xe3, 0x9b, 0x97, 0x09, - 0x3e, 0x68, 0x53, 0x27, 0xb6, 0x0d, 0x56, 0x73, 0x7f, 0x33, 0x04, 0x33, 0x99, 0x78, 0xe4, 0xba, - 0x48, 0xed, 0xa5, 0xd6, 0x55, 0x91, 0xec, 0xca, 0x4e, 0x82, 0xd9, 0x58, 0x22, 0x68, 0xb1, 0x45, - 0x1d, 0xaf, 0x23, 0x52, 0x5d, 0xd9, 0x06, 0x8c, 0x8d, 0x25, 0xd3, 0x1b, 0x34, 0x66, 0xe8, 0x38, - 0x6d, 0x27, 0xa0, 0xe4, 0x0a, 0x8c, 0x31, 0x88, 0x64, 0x35, 0xc0, 0x9f, 0xf8, 0x69, 0x20, 0xc6, - 0x69, 0xc3, 0x6f, 0x52, 0x8d, 0xd3, 0x20, 0xe7, 0x64, 0x42, 0x19, 0x27, 0x06, 0x91, 0x9c, 0x86, - 0x38, 0x27, 0x0d, 0x44, 0x5e, 0x83, 0x89, 0x6a, 0xbb, 0xad, 0x31, 0xc2, 0x1c, 0x57, 0xb6, 0x09, - 0x24, 0x97, 0x01, 0xaa, 0xed, 0xb6, 0x64, 0x83, 0xf9, 0xab, 0x6c, 0x0d, 0x42, 0x6e, 0xc6, 0xe1, - 0xca, 0x34, 0x56, 0x78, 0x9d, 0x60, 0x67, 0x94, 0x30, 0xb9, 0xaa, 0xd8, 0x4e, 0x82, 0x29, 0x70, - 0xb9, 0x26, 0xc0, 0xe4, 0x63, 0x38, 0x9f, 0xf0, 0xbb, 0xd0, 0x2a, 0x40, 0x53, 0xbf, 0x9d, 0x8f, - 0x40, 0xde, 0x83, 0x73, 0x89, 0x42, 0x59, 0x1d, 0x5a, 0xf5, 0xed, 0x9c, 0x52, 0xf2, 0x21, 0x94, - 0x13, 0xcf, 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, - 0x54, 0x89, 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x81, 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0xe6, - 0xe5, 0xb2, 0x7b, 0xa1, 0x91, 0x05, 0xb8, 0x98, 0x89, 0x22, 0x9b, 0x81, 0xd9, 0xba, 0xec, 0xae, - 0x38, 0x64, 0x1e, 0xa6, 0x63, 0x9f, 0x1e, 0xad, 0x09, 0x98, 0xa8, 0xcb, 0xce, 0x2c, 0x23, 0x6f, - 0x9b, 0x8f, 0xf3, 0x79, 0x65, 0x98, 0xa7, 0xcb, 0x4e, 0x17, 0x58, 0xc7, 0x05, 0xb8, 0x98, 0xb9, - 0x51, 0x4a, 0x7d, 0x7e, 0x2e, 0xa9, 0x38, 0x6a, 0x6b, 0xc1, 0x0d, 0x18, 0x40, 0x05, 0x9f, 0xdb, - 0x8a, 0xa5, 0xaf, 0x29, 0xd2, 0x73, 0x56, 0xac, 0xd4, 0x46, 0x1c, 0x72, 0x5f, 0xdd, 0x0d, 0xf6, - 0xa3, 0x25, 0xe3, 0x56, 0x52, 0x81, 0xca, 0xa8, 0x5c, 0xbf, 0x23, 0x94, 0xb7, 0x81, 0x2f, 0x73, - 0x0d, 0xf3, 0x97, 0x05, 0xa8, 0xf4, 0xd0, 0x0f, 0x54, 0x9f, 0x0a, 0x27, 0xe8, 0xd3, 0x03, 0xd5, - 0x27, 0xfe, 0x36, 0x76, 0xfe, 0x64, 0x3a, 0xc8, 0xab, 0xee, 0x56, 0x07, 0x48, 0x5a, 0x0d, 0x25, - 0xdf, 0x85, 0xd1, 0x5a, 0x6d, 0xc5, 0x70, 0xe8, 0x4b, 0x5d, 0x0e, 0xc5, 0x18, 0xe4, 0xf6, 0x89, - 0x3c, 0xf8, 0x34, 0xff, 0x3d, 0x6b, 0x09, 0xca, 0x79, 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, - 0x76, 0xb1, 0xc4, 0x17, 0x16, 0x13, 0x6c, 0xbd, 0x07, 0xe7, 0x14, 0x35, 0x4f, 0xda, 0xa1, 0x3d, - 0xfc, 0x17, 0xc7, 0x4e, 0x15, 0x60, 0x20, 0x06, 0x58, 0x7f, 0x31, 0x90, 0x22, 0xac, 0x75, 0x0e, - 0x0f, 0x9d, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0xfd, 0x3d, 0x35, 0xfd, 0x85, 0x81, 0x9f, 0x1d, 0x55, - 0xfa, 0x34, 0xee, 0x6c, 0x39, 0xc6, 0x8d, 0xdd, 0x6b, 0x50, 0x7e, 0x25, 0x55, 0xe4, 0xc1, 0x8d, - 0x0c, 0x20, 0xd9, 0x85, 0x09, 0xb1, 0x65, 0xe2, 0x6f, 0x39, 0xb5, 0x6f, 0x27, 0xa7, 0xb6, 0xd1, - 0xbc, 0x9b, 0x06, 0x09, 0x9f, 0x04, 0x26, 0x1b, 0xf2, 0x25, 0x4c, 0x4a, 0x05, 0x49, 0x30, 0xe6, - 0x4e, 0x44, 0x77, 0xba, 0x33, 0x36, 0x69, 0x38, 0xe7, 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, - 0xce, 0x83, 0x27, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, 0xc0, 0xe6, 0x3e, 0x03, 0x92, 0xee, 0x57, - 0xaf, 0x59, 0x3c, 0xa1, 0xcd, 0xe2, 0xb9, 0x2a, 0x4c, 0x65, 0x74, 0xe0, 0x54, 0x2c, 0x3e, 0x03, - 0x92, 0x6e, 0xe9, 0x69, 0x38, 0x58, 0xd7, 0xe1, 0x0d, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, - 0xf0, 0xfc, 0x9b, 0x45, 0xa8, 0xf4, 0x40, 0x25, 0x7f, 0x50, 0x48, 0x4a, 0x9b, 0xcf, 0xc6, 0x0f, - 0x92, 0xd2, 0xce, 0xa6, 0xcf, 0x10, 0xfb, 0xc2, 0x87, 0x3f, 0xfd, 0xeb, 0x17, 0x56, 0xf8, 0xd3, - 0x43, 0x76, 0x7a, 0x69, 0x0d, 0xe8, 0xd2, 0xb2, 0x61, 0xda, 0x38, 0x2a, 0x9d, 0x64, 0xcf, 0xb8, - 0x0c, 0x20, 0x52, 0x7c, 0xae, 0xf9, 0xfb, 0x42, 0x3d, 0xd3, 0x20, 0xd6, 0x3d, 0x98, 0x49, 0xf0, - 0x14, 0xc6, 0xf0, 0xef, 0x82, 0x7a, 0xe0, 0x8d, 0x4c, 0xfb, 0x17, 0xce, 0xfe, 0xe2, 0xa8, 0x32, - 0xc1, 0x34, 0xe9, 0x9b, 0x71, 0xfc, 0x78, 0xf9, 0x97, 0xb5, 0xae, 0x9b, 0xf3, 0xab, 0x2d, 0x3d, - 0xf0, 0x0d, 0xb9, 0x03, 0x43, 0x1c, 0x92, 0x88, 0xd2, 0xac, 0x63, 0x8b, 0x35, 0x41, 0x20, 0x5a, - 0x33, 0xf8, 0x1c, 0x15, 0x7f, 0x54, 0xe3, 0xf0, 0x09, 0xd6, 0x0e, 0xcf, 0x5a, 0x12, 0x83, 0x55, - 0x24, 0xe8, 0x81, 0x6a, 0x1c, 0xe6, 0x41, 0xfa, 0x5e, 0x48, 0x3c, 0xcf, 0x7f, 0xd6, 0xa2, 0x4d, - 0x9e, 0x11, 0x6e, 0x61, 0x5c, 0xf8, 0x5e, 0x0c, 0x38, 0x8c, 0x01, 0x92, 0x59, 0x9f, 0xc2, 0x0c, - 0xdb, 0xa0, 0x83, 0x64, 0x7d, 0x98, 0xab, 0x80, 0xc1, 0x4c, 0x87, 0x76, 0x87, 0x81, 0xd0, 0xa1, - 0x5d, 0x14, 0x5a, 0x6b, 0x70, 0x9e, 0x1b, 0x03, 0xf5, 0x2e, 0xc5, 0xa6, 0xf7, 0x41, 0xfc, 0x9d, - 0x78, 0xcc, 0x98, 0xd1, 0x7b, 0x8e, 0x67, 0x7d, 0x82, 0xaf, 0x65, 0xc4, 0x24, 0x75, 0x7d, 0x2f, - 0xb6, 0xfc, 0x9d, 0xec, 0x79, 0xed, 0xff, 0x09, 0x17, 0xab, 0xed, 0x36, 0xf5, 0x9a, 0x31, 0xe1, - 0x76, 0xe0, 0x9c, 0x30, 0xf8, 0x01, 0xa9, 0xc2, 0x20, 0x62, 0xab, 0x7b, 0x4b, 0xd1, 0xdc, 0x8c, - 0xe6, 0x20, 0x9e, 0x08, 0xdb, 0x89, 0x15, 0x70, 0x4a, 0xab, 0x09, 0xb3, 0xb5, 0xce, 0xde, 0xa1, - 0x1b, 0xa1, 0x1b, 0x3c, 0x06, 0x10, 0x91, 0x75, 0xaf, 0xca, 0x44, 0x53, 0x5c, 0x18, 0xd7, 0xe3, - 0x57, 0x15, 0xe8, 0x49, 0x2f, 0x82, 0x8a, 0x3c, 0xbd, 0x73, 0x33, 0x26, 0x45, 0xab, 0x07, 0xaf, - 0x05, 0x8b, 0x45, 0x32, 0x2a, 0x6b, 0x0a, 0xce, 0xea, 0x77, 0x40, 0x7c, 0x86, 0xcc, 0xc0, 0x94, - 0x79, 0xb7, 0xc3, 0xc1, 0x5f, 0xc3, 0x34, 0xb7, 0x3d, 0xf3, 0xb0, 0xdb, 0xf3, 0x71, 0x84, 0xe9, - 0xe2, 0xee, 0x7c, 0xc2, 0xff, 0x1e, 0xdd, 0x72, 0x55, 0x42, 0x85, 0xdd, 0x79, 0xfe, 0xe2, 0xf1, - 0xe9, 0xbc, 0x71, 0x83, 0x58, 0xdc, 0x9d, 0x5f, 0x18, 0x16, 0xe1, 0x4b, 0x19, 0x77, 0x3e, 0xfc, - 0xdf, 0x0a, 0xf7, 0x79, 0x7c, 0x64, 0xbf, 0x42, 0x1d, 0x7c, 0x10, 0x93, 0xfd, 0x54, 0x79, 0x12, - 0x8a, 0x6e, 0x53, 0x9e, 0xd6, 0xdd, 0xa6, 0xf5, 0xa7, 0x05, 0xb8, 0xce, 0x75, 0xa0, 0x6c, 0x3a, - 0xbc, 0xe8, 0xc9, 0x21, 0x26, 0xef, 0x03, 0xcf, 0xda, 0x2e, 0x14, 0x4d, 0x4b, 0xb4, 0xbc, 0x1b, - 0x27, 0x4e, 0x40, 0xaa, 0x30, 0xae, 0x3f, 0x29, 0x39, 0x59, 0x78, 0x38, 0x7b, 0xec, 0xf0, 0xb1, - 0xa3, 0x9e, 0x99, 0x3c, 0x81, 0x0b, 0xcb, 0xdf, 0xb0, 0x09, 0x21, 0x76, 0x27, 0xa1, 0xb0, 0xc7, - 0x4f, 0x61, 0xcf, 0x6c, 0x8b, 0x19, 0x63, 0x9e, 0xa6, 0x93, 0x60, 0x76, 0x34, 0x95, 0x1b, 0x9c, - 0xd2, 0x9a, 0x47, 0x6d, 0x03, 0x66, 0xfd, 0x45, 0x01, 0x2e, 0x66, 0xd7, 0x26, 0x16, 0x96, 0x55, - 0x38, 0xbb, 0xe8, 0x78, 0xbe, 0xe7, 0x36, 0x9c, 0x56, 0xad, 0x71, 0x40, 0x9b, 0x1d, 0x15, 0xe4, - 0x54, 0xad, 0x32, 0xfb, 0xd4, 0x93, 0xe4, 0x12, 0xc5, 0x4e, 0x53, 0xb1, 0x43, 0x19, 0xbe, 0x4a, - 0xe0, 0x6b, 0x6f, 0x8b, 0x06, 0x8a, 0x1f, 0x6f, 0x59, 0x4e, 0x29, 0xb9, 0x2d, 0x8d, 0xec, 0xcd, - 0x1d, 0xcf, 0x8d, 0x14, 0x11, 0xb7, 0xae, 0x64, 0x15, 0x59, 0xff, 0xb6, 0x00, 0xe7, 0x31, 0xaf, - 0x91, 0x91, 0x29, 0x31, 0x8e, 0xf5, 0x2b, 0xc3, 0xd5, 0x16, 0x8c, 0x57, 0x16, 0x06, 0xb6, 0x19, - 0xb7, 0x96, 0xbc, 0x0d, 0x03, 0x35, 0xe9, 0x24, 0x35, 0x99, 0x48, 0x43, 0x2b, 0x53, 0xfe, 0xfb, - 0x41, 0x64, 0x23, 0x16, 0xdb, 0x73, 0x96, 0x68, 0xd8, 0xa0, 0x1e, 0xe6, 0x0b, 0xe6, 0x87, 0x7d, - 0x0d, 0x12, 0x87, 0x2a, 0x1a, 0xc8, 0x0b, 0x55, 0x34, 0x68, 0x86, 0x2a, 0xb2, 0x9e, 0xf2, 0xac, - 0x46, 0xc9, 0x0e, 0x89, 0x41, 0xfa, 0x24, 0x95, 0x5e, 0x98, 0xef, 0x03, 0xe7, 0xb2, 0x7a, 0xb6, - 0x7b, 0x37, 0x95, 0x39, 0x38, 0x3f, 0xb6, 0xee, 0x16, 0xbc, 0x66, 0xe0, 0x56, 0x5b, 0x2d, 0xff, - 0x19, 0x6d, 0x6e, 0x05, 0xfe, 0xa1, 0x1f, 0x19, 0x59, 0x5d, 0x44, 0x7e, 0xed, 0xf8, 0x1a, 0x45, - 0xcc, 0xca, 0x04, 0xd8, 0xfa, 0x3f, 0xe0, 0xf5, 0x1e, 0x1c, 0x45, 0xa7, 0x6a, 0x70, 0xd6, 0x49, - 0x94, 0x49, 0x6f, 0x97, 0xd7, 0xb3, 0xfa, 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0x1b, 0xdb, 0x46, - 0x4a, 0x5e, 0x52, 0x86, 0xe9, 0x2d, 0x7b, 0x73, 0x69, 0x67, 0x71, 0xbb, 0xbe, 0xfd, 0xe5, 0xd6, - 0x72, 0x7d, 0x67, 0xe3, 0xe1, 0xc6, 0xe6, 0xa3, 0x0d, 0x1e, 0x9c, 0xda, 0x28, 0xd9, 0x5e, 0xae, - 0xae, 0x97, 0x0a, 0x64, 0x1a, 0x4a, 0x06, 0x78, 0x79, 0x67, 0xa1, 0x54, 0xbc, 0xf1, 0xb5, 0x91, - 0x6a, 0x96, 0x5c, 0x84, 0x72, 0x6d, 0x67, 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0xd0, 0xd8, 0x33, - 0x70, 0xd6, 0x28, 0xbd, 0x67, 0x2f, 0x2f, 0x97, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, 0x5e, 0x5e, - 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0x6f, 0xd4, 0xf5, 0xa7, 0x5d, 0xe4, 0x02, 0xcc, 0x2e, 0x2d, 0xef, - 0xae, 0x2e, 0x2e, 0x67, 0xf1, 0x9e, 0x86, 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, 0x59, 0xeb, - 0xd0, 0x47, 0xcb, 0x0b, 0xd5, 0x9d, 0xed, 0x95, 0x8d, 0x52, 0xbf, 0x35, 0x30, 0x52, 0x2c, 0x15, - 0x6f, 0xfc, 0xc8, 0x78, 0xf7, 0xc5, 0x9a, 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0xfb, 0xf9, 0x55, 0xf0, - 0xd2, 0xf5, 0x7b, 0xd5, 0x52, 0x81, 0x5c, 0x82, 0xf3, 0x06, 0x74, 0xab, 0x5a, 0xab, 0x3d, 0xda, - 0xb4, 0x97, 0xd6, 0x96, 0x6b, 0xb5, 0x52, 0xf1, 0xc6, 0xae, 0x11, 0x9e, 0x8d, 0xd5, 0xb0, 0x7e, - 0xaf, 0x5a, 0xb7, 0x97, 0x3f, 0xdf, 0x59, 0xb5, 0x97, 0x97, 0xd2, 0x35, 0x18, 0xa5, 0x5f, 0x2e, - 0xd7, 0x4a, 0x05, 0x32, 0x05, 0x67, 0x0c, 0xe8, 0xc6, 0x66, 0xa9, 0x78, 0xe3, 0x0d, 0x11, 0xc1, - 0x8b, 0x4c, 0x02, 0x2c, 0x2d, 0xd7, 0x16, 0x97, 0x37, 0x96, 0x56, 0x37, 0xee, 0x97, 0xfa, 0xc8, - 0x04, 0x8c, 0x56, 0xd5, 0xcf, 0xc2, 0x8d, 0x0f, 0xe1, 0x4c, 0xe2, 0x44, 0xcd, 0x30, 0xd4, 0x61, - 0xb4, 0xd4, 0x87, 0xe2, 0x97, 0x3f, 0xd1, 0xac, 0xc9, 0x0f, 0xc7, 0xa5, 0xc2, 0x8d, 0x05, 0x99, - 0xfa, 0x54, 0xfb, 0xce, 0xc9, 0x18, 0x0c, 0x2f, 0x2d, 0xdf, 0xab, 0xee, 0xac, 0x6d, 0x97, 0xfa, - 0xd8, 0x8f, 0x45, 0x7b, 0xb9, 0xba, 0xbd, 0xbc, 0x54, 0x2a, 0x90, 0x51, 0x18, 0xac, 0x6d, 0x57, - 0xb7, 0x97, 0x4b, 0x45, 0x32, 0x02, 0x03, 0x3b, 0xb5, 0x65, 0xbb, 0xd4, 0x3f, 0xff, 0x47, 0x7f, - 0x50, 0xe0, 0xb6, 0x3d, 0xf9, 0x86, 0xe8, 0x6b, 0xed, 0x30, 0x29, 0x96, 0x3c, 0x91, 0xe7, 0x31, - 0xf7, 0xe4, 0x88, 0x5a, 0xc0, 0x5c, 0x97, 0xcb, 0x0e, 0x44, 0xb8, 0x5e, 0xb8, 0x5d, 0x20, 0x36, - 0x3a, 0x87, 0x24, 0xce, 0x56, 0x8a, 0x73, 0xf6, 0xf1, 0x77, 0xee, 0x52, 0xd7, 0x23, 0x19, 0xf9, - 0x35, 0xb0, 0x74, 0x9e, 0x39, 0x27, 0x90, 0xef, 0x9e, 0xec, 0xa4, 0x21, 0xeb, 0x7c, 0xe3, 0x64, - 0xe8, 0xe4, 0x01, 0x4c, 0x30, 0xdd, 0x5c, 0xa1, 0x91, 0x0b, 0x49, 0x42, 0xed, 0x38, 0x30, 0x77, - 0x31, 0xbb, 0x50, 0xa5, 0x62, 0x19, 0xc7, 0x8e, 0xf0, 0x83, 0x75, 0x48, 0x64, 0x94, 0x07, 0x09, - 0xe1, 0x2b, 0xfe, 0xdc, 0xd9, 0x04, 0x78, 0xf7, 0xce, 0xed, 0x02, 0xa9, 0x61, 0x88, 0x35, 0x43, - 0xc9, 0x27, 0xf2, 0x51, 0x5b, 0x5a, 0xfb, 0xe7, 0xad, 0xa9, 0xa8, 0xc4, 0x89, 0x39, 0xa7, 0x83, - 0x0d, 0x20, 0x69, 0xdd, 0x99, 0x5c, 0x89, 0xe7, 0x41, 0xb6, 0x5a, 0x3d, 0x77, 0x2e, 0xe5, 0xf3, - 0xb7, 0xcc, 0xb4, 0x27, 0xb2, 0x0c, 0x93, 0xe2, 0x09, 0xb7, 0xd0, 0xe6, 0x49, 0xb7, 0xf3, 0x40, - 0x2e, 0x9b, 0xfb, 0x28, 0x27, 0x75, 0x22, 0x20, 0x73, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xb9, 0x0b, - 0x99, 0x65, 0xa2, 0x7f, 0xf7, 0x60, 0xd2, 0x3c, 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, - 0x06, 0xd5, 0x61, 0x76, 0xdd, 0x71, 0xf1, 0x8a, 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0xe9, - 0xe2, 0x28, 0x56, 0xa3, 0x5e, 0x53, 0x0d, 0x42, 0x5e, 0x58, 0x75, 0xfc, 0x6c, 0x6a, 0x52, 0x47, - 0x36, 0xfd, 0xea, 0x88, 0x65, 0x26, 0xc3, 0xcd, 0x72, 0x95, 0x9c, 0xcb, 0xf3, 0xee, 0x25, 0xeb, - 0xa8, 0xa4, 0x27, 0x38, 0x6a, 0x73, 0xe2, 0xd4, 0xec, 0xca, 0x18, 0x48, 0x40, 0x4b, 0x22, 0x2e, - 0x0a, 0x43, 0x92, 0x23, 0xb8, 0x5c, 0x66, 0xb7, 0x0b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, - 0x72, 0xa3, 0x03, 0xa1, 0xfd, 0x5c, 0xc8, 0x64, 0x20, 0x3e, 0x94, 0x2e, 0xdc, 0x6d, 0x98, 0xce, - 0x72, 0x28, 0x56, 0x02, 0xed, 0xe2, 0x6d, 0x9c, 0x3b, 0x0b, 0x6c, 0x76, 0xd4, 0x68, 0xe6, 0x0f, - 0x52, 0x17, 0x7f, 0xd6, 0x5c, 0x9e, 0x1f, 0xc3, 0x24, 0x9b, 0x25, 0x0f, 0x29, 0x6d, 0x57, 0x5b, - 0xee, 0x53, 0x1a, 0x12, 0x19, 0x1f, 0x57, 0x81, 0xf2, 0x68, 0xaf, 0x17, 0xc8, 0x77, 0x60, 0xec, - 0x91, 0x13, 0x35, 0x0e, 0x44, 0x9c, 0x48, 0x19, 0x46, 0x12, 0x61, 0x73, 0xf2, 0x17, 0x16, 0xde, - 0x2e, 0x90, 0xef, 0xc3, 0xf0, 0x7d, 0x1a, 0xe1, 0xa3, 0xe2, 0xab, 0xca, 0xb7, 0x8e, 0xdb, 0x26, - 0x57, 0x3d, 0xf5, 0x72, 0x46, 0x36, 0x38, 0x69, 0x40, 0x25, 0xb7, 0x00, 0xf8, 0x82, 0x80, 0x1c, - 0x92, 0xc5, 0x73, 0xa9, 0x66, 0x93, 0xfb, 0x4c, 0x79, 0x68, 0xd1, 0x88, 0x9e, 0xb4, 0xca, 0x3c, - 0x19, 0xad, 0xc1, 0xa4, 0xca, 0x5e, 0xb3, 0x81, 0xe1, 0x3c, 0xac, 0x04, 0xb3, 0xf0, 0x14, 0xdc, - 0x3e, 0x64, 0x5f, 0x05, 0x4f, 0xdd, 0x8a, 0x71, 0x1f, 0x70, 0x25, 0x9d, 0xd5, 0x83, 0x47, 0xe8, - 0x4b, 0xa8, 0x14, 0x22, 0x47, 0xd3, 0x68, 0x57, 0xfc, 0x30, 0x32, 0x69, 0x15, 0x24, 0x9b, 0xf6, - 0x57, 0x61, 0x4e, 0xaf, 0xd7, 0x0c, 0x54, 0x1c, 0xaf, 0xb9, 0x79, 0xf1, 0x8f, 0xe7, 0xae, 0x76, - 0xc1, 0x10, 0xe7, 0xb7, 0xfe, 0xdf, 0x2e, 0x16, 0x70, 0x39, 0x59, 0x82, 0x29, 0x59, 0xd7, 0x66, - 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0x66, 0x2a, 0x91, 0x9e, 0x1c, 0x1a, 0x4c, 0x72, 0x27, 0xe9, 0x22, - 0xb6, 0xf5, 0x19, 0xf1, 0x1d, 0x48, 0xb7, 0xa8, 0x0f, 0xf1, 0xd6, 0x97, 0x19, 0x41, 0xf7, 0x21, - 0x37, 0x2a, 0x19, 0xca, 0xff, 0xee, 0x3c, 0xe9, 0x72, 0x00, 0x9a, 0xcb, 0x39, 0x42, 0xdc, 0x2e, - 0x90, 0x2f, 0x81, 0xa4, 0x8f, 0x24, 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x2e, 0xe7, 0x99, - 0x65, 0x98, 0x52, 0xd1, 0x5d, 0xe2, 0x72, 0x92, 0xd3, 0x96, 0x2e, 0x3b, 0xd8, 0x4c, 0x06, 0x9b, - 0xdd, 0xf9, 0x2e, 0x8c, 0x32, 0xe1, 0xe4, 0x53, 0x98, 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x49, 0x2d, - 0x63, 0xe2, 0x70, 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, 0x4b, 0x08, 0x9e, 0xfb, 0xb1, 0x9f, 0x37, - 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, - 0xd4, 0xa5, 0xcf, 0xc8, 0xa5, 0x44, 0xd3, 0x19, 0x10, 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x36, - 0xcf, 0x5f, 0x8c, 0x50, 0xe3, 0x06, 0xfc, 0x8a, 0x41, 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0x3c, 0x9f, - 0x8b, 0x41, 0x7e, 0x03, 0xa3, 0xb3, 0x76, 0x3f, 0x9d, 0x91, 0xef, 0x64, 0x1d, 0xa2, 0x73, 0xce, - 0x97, 0x73, 0x6f, 0x9f, 0x0c, 0x59, 0x9d, 0x87, 0x27, 0xee, 0xd3, 0x68, 0xab, 0xd5, 0xd9, 0x77, - 0x31, 0xb3, 0x25, 0x51, 0xb6, 0x27, 0x05, 0x12, 0xd3, 0x5b, 0x06, 0x45, 0x8b, 0x0b, 0x6a, 0xf4, - 0xc7, 0x64, 0x15, 0x4a, 0x7c, 0x1b, 0xd1, 0x58, 0x5c, 0x4a, 0xb1, 0x10, 0x28, 0x4e, 0xe0, 0x1c, - 0x86, 0xb9, 0xa3, 0x75, 0x8b, 0xbb, 0x1c, 0x11, 0xf9, 0x69, 0xeb, 0x7a, 0xea, 0x94, 0x01, 0x53, - 0x11, 0xeb, 0xd9, 0x88, 0xd8, 0x34, 0xa4, 0x91, 0x0c, 0x03, 0xc3, 0xf3, 0x9a, 0x5e, 0x8b, 0x75, - 0x86, 0x74, 0x69, 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, 0xde, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, - 0x37, 0x0c, 0xd5, 0xe6, 0x74, 0x7c, 0xdf, 0xc1, 0xad, 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, - 0xbf, 0x25, 0xd5, 0x84, 0x46, 0xb5, 0x3b, 0x8f, 0x2b, 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x09, - 0x02, 0xea, 0x71, 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, 0x13, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, - 0xae, 0x17, 0x0b, 0x9e, 0x87, 0xe7, 0x76, 0x81, 0xbc, 0x0f, 0x23, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, - 0x74, 0xd8, 0xa5, 0xd5, 0x48, 0x09, 0x5c, 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, 0xf4, 0x79, 0x9b, - 0xdf, 0x67, 0x7b, 0x76, 0xf3, 0x45, 0x28, 0x17, 0xe5, 0xe6, 0x8d, 0x94, 0x65, 0x15, 0x89, 0x45, - 0x82, 0x7a, 0xec, 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, - 0x03, 0xdc, 0x6b, 0xcb, 0x5e, 0x85, 0x52, 0xb5, 0x81, 0x1b, 0x4a, 0x8d, 0x1e, 0x3a, 0xed, 0x03, - 0x3f, 0xa0, 0xea, 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa8, 0x83, - 0x81, 0x99, 0x67, 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, 0xe8, 0x72, 0xd6, 0x99, 0x5e, 0x64, 0xa7, - 0xb3, 0xd6, 0xcb, 0xb1, 0xf9, 0x10, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0xa9, - 0x50, 0xbe, 0xbc, 0x51, 0xa8, 0x55, 0x79, 0xf5, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, - 0xc1, 0xe4, 0x32, 0x5b, 0xd0, 0x3b, 0x4d, 0x97, 0x07, 0xa3, 0x27, 0x66, 0x74, 0xf1, 0x5c, 0xc2, - 0x15, 0x99, 0xfa, 0x0a, 0x49, 0x85, 0x05, 0x41, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0xb4, 0x64, - 0x2b, 0xf2, 0x01, 0xe0, 0x09, 0x5f, 0x98, 0x0c, 0x66, 0xb9, 0x62, 0x59, 0x6d, 0xb7, 0x5b, 0xd2, - 0xb2, 0xcd, 0x6f, 0xea, 0x5f, 0x37, 0x4e, 0xa2, 0xa9, 0x72, 0xc9, 0x3b, 0xad, 0x7b, 0x7e, 0xa1, - 0xa5, 0xa2, 0xcd, 0xe1, 0x99, 0x53, 0xde, 0x6b, 0x2e, 0xaa, 0xf0, 0xd1, 0xd5, 0x56, 0x2b, 0x45, - 0x1c, 0x92, 0xb7, 0x4c, 0xee, 0x59, 0x38, 0xbd, 0x6a, 0xc0, 0x93, 0x3e, 0x57, 0xde, 0xaa, 0xed, - 0x36, 0x5f, 0x2c, 0x2f, 0xab, 0x05, 0xc3, 0x2c, 0x48, 0x9f, 0xf4, 0x93, 0xe5, 0x62, 0x6d, 0x7f, - 0x80, 0xd3, 0x2c, 0xce, 0x57, 0x4b, 0xf4, 0x73, 0x73, 0x32, 0x5d, 0xaf, 0xd2, 0xe5, 0x12, 0x85, - 0x6a, 0x9f, 0x38, 0x93, 0x48, 0xdd, 0xaf, 0x0c, 0x3c, 0xa9, 0x94, 0xfe, 0x9c, 0xdf, 0xe5, 0xbc, - 0x62, 0x65, 0x70, 0x2d, 0x25, 0x73, 0x82, 0xab, 0x2e, 0xe7, 0xe4, 0x9a, 0x57, 0x5d, 0xce, 0x4d, - 0x26, 0xfe, 0x00, 0x4a, 0xc9, 0x74, 0xc4, 0x8a, 0x69, 0x4e, 0x9e, 0xe2, 0xdc, 0x31, 0xb9, 0x07, - 0xd3, 0xfa, 0x88, 0xaa, 0x7e, 0xe7, 0xad, 0xfe, 0x79, 0x7c, 0xb6, 0x61, 0x26, 0x33, 0x7b, 0xb0, - 0xda, 0x62, 0xbb, 0xe5, 0x16, 0xce, 0xe5, 0x4a, 0xe1, 0x5c, 0x76, 0x02, 0x71, 0xf2, 0x9a, 0x69, - 0x3f, 0xc8, 0x4e, 0xa7, 0x3c, 0xf7, 0x7a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, 0x4c, 0xd5, - 0x71, 0x55, 0xb3, 0x28, 0xe4, 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, - 0xc4, 0xd7, 0xf2, 0x79, 0xc6, 0x13, 0x6b, 0x57, 0x46, 0x49, 0xce, 0x95, 0x4c, 0xd7, 0x44, 0xd3, - 0x5d, 0x8e, 0xa4, 0x73, 0x6a, 0x3e, 0x9c, 0xbc, 0xc9, 0xf9, 0xe6, 0xa5, 0xe9, 0xac, 0xf4, 0xe6, - 0x49, 0xeb, 0x4f, 0x56, 0xf6, 0x6a, 0x25, 0x86, 0xae, 0xf9, 0xd1, 0x77, 0xb9, 0x25, 0xc8, 0xe4, - 0xae, 0x5b, 0x82, 0x32, 0x59, 0x5f, 0xc9, 0x47, 0x88, 0x67, 0x84, 0x11, 0x7b, 0x5d, 0xf4, 0x5f, - 0x3f, 0x67, 0x65, 0x27, 0xb6, 0x56, 0x33, 0x22, 0x13, 0x45, 0x70, 0xb7, 0xe5, 0x47, 0x97, 0x23, - 0x96, 0x2e, 0x49, 0xbd, 0xbb, 0x1c, 0x87, 0xca, 0xf1, 0xc0, 0x25, 0x9a, 0x7d, 0xda, 0x61, 0xfb, - 0x1a, 0xce, 0xe7, 0x26, 0xf0, 0x26, 0x6f, 0xa6, 0x3e, 0xe8, 0x1c, 0x49, 0xe4, 0xb7, 0x74, 0xc2, - 0xc8, 0xbd, 0xad, 0x4c, 0x61, 0x89, 0x34, 0xdf, 0xa9, 0x15, 0x3b, 0x23, 0x07, 0xf8, 0x7d, 0xd4, - 0x7c, 0xb5, 0x3c, 0xde, 0xb9, 0x7d, 0xbd, 0x94, 0xc5, 0x27, 0x4c, 0xaf, 0xa9, 0x5a, 0xbb, 0xa4, - 0x26, 0x96, 0x2c, 0x38, 0xcd, 0x9a, 0x7a, 0x92, 0xa6, 0xe5, 0xf1, 0x59, 0x82, 0x31, 0x2d, 0x01, - 0x38, 0x39, 0x6f, 0x88, 0xc9, 0xd8, 0x25, 0xe7, 0x8c, 0xce, 0x99, 0x1b, 0xe4, 0x22, 0xda, 0x9c, - 0x55, 0x1a, 0xf1, 0xdc, 0x56, 0x5c, 0x48, 0xf3, 0x30, 0xec, 0xcd, 0x4a, 0x0a, 0xbc, 0x35, 0x17, - 0x93, 0xc2, 0x31, 0x1a, 0x94, 0xdf, 0x25, 0xa2, 0x8b, 0xa6, 0x47, 0x93, 0xf2, 0x35, 0xd4, 0x29, - 0x91, 0x65, 0x14, 0x93, 0xa1, 0xc8, 0x98, 0x7c, 0xe7, 0x94, 0xf1, 0x4c, 0x83, 0x76, 0xb1, 0x65, - 0x6c, 0xe1, 0xd3, 0x8e, 0x8c, 0x8c, 0xe8, 0x6a, 0x0d, 0xed, 0x9a, 0x30, 0x3d, 0x43, 0x3b, 0x53, - 0xab, 0x72, 0x2e, 0xc7, 0xae, 0x29, 0xd2, 0x73, 0x5b, 0xfa, 0x43, 0x6d, 0x55, 0x4e, 0xe5, 0x3d, - 0x27, 0xd7, 0x93, 0xaa, 0x59, 0x5e, 0x6a, 0xf4, 0x2e, 0xab, 0xfe, 0x74, 0x56, 0xca, 0x74, 0xcd, - 0x00, 0x9c, 0x9b, 0x4f, 0x3d, 0x43, 0x0a, 0x6a, 0x79, 0xcb, 0xe1, 0xd6, 0x25, 0x81, 0x7a, 0x6e, - 0x0b, 0xbf, 0xd2, 0x96, 0xb7, 0x44, 0xa2, 0x73, 0x75, 0xe0, 0xee, 0x91, 0x09, 0x3d, 0x97, 0xf7, - 0x06, 0x3e, 0x06, 0x4a, 0x67, 0x29, 0x57, 0xba, 0x4b, 0xb7, 0x1c, 0xe6, 0x99, 0xf6, 0xe1, 0x99, - 0x74, 0x17, 0x19, 0xbf, 0x73, 0x09, 0xeb, 0x6e, 0xaf, 0x86, 0xa9, 0x75, 0x38, 0x23, 0xbb, 0x79, - 0x62, 0x1d, 0xce, 0xcf, 0x7f, 0xde, 0xe5, 0xa0, 0x73, 0xa6, 0xe6, 0xee, 0x7b, 0x5a, 0x72, 0x72, - 0x75, 0xcc, 0x49, 0xe7, 0x4b, 0x57, 0x4b, 0x4c, 0x56, 0x2e, 0xf3, 0x4d, 0xa6, 0xe1, 0x70, 0xfd, - 0x5c, 0x4f, 0x33, 0x4d, 0xe6, 0xf2, 0xb3, 0x6b, 0xab, 0xe5, 0x26, 0x33, 0x2f, 0xb5, 0xc6, 0x50, - 0xcf, 0xf1, 0xac, 0x18, 0x66, 0xa4, 0x9b, 0x56, 0x0c, 0x33, 0x93, 0x42, 0xdf, 0x42, 0xbb, 0x8a, - 0xed, 0xb7, 0xa8, 0x6e, 0x57, 0xd1, 0x92, 0x06, 0x27, 0xcc, 0x1a, 0xe4, 0x23, 0x34, 0x6a, 0x74, - 0xb7, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x51, 0x95, 0x91, 0x59, 0x59, 0xd1, 0x93, 0x49, - 0xa1, 0xe7, 0xca, 0xe9, 0x02, 0x41, 0xff, 0xae, 0xb4, 0x8b, 0x60, 0x83, 0xcb, 0xa6, 0x3d, 0x29, - 0xbf, 0xcd, 0xef, 0x4a, 0xa3, 0x88, 0x41, 0x96, 0xca, 0xc7, 0x9c, 0x24, 0xfb, 0x1e, 0x8c, 0xc7, - 0xb9, 0x97, 0x77, 0xe7, 0x35, 0xc2, 0x44, 0x42, 0xe6, 0x24, 0xe1, 0xfb, 0xf2, 0xe2, 0x04, 0xeb, - 0x33, 0x0b, 0xbb, 0xdb, 0x4f, 0x3e, 0x91, 0x46, 0x18, 0xa3, 0xa5, 0xa9, 0x4c, 0xce, 0x5d, 0x56, - 0xee, 0x71, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, 0xbc, 0xc8, 0x4a, 0xd9, 0x1a, - 0x5f, 0x2c, 0x7c, 0x29, 0x2d, 0x0e, 0x31, 0xd3, 0x4b, 0x46, 0xb3, 0x52, 0x7c, 0x2f, 0xe7, 0x15, - 0x27, 0x59, 0xd7, 0xa0, 0x94, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, 0x69, 0x48, 0xd5, 0x19, 0x30, - 0x37, 0x2d, 0xe6, 0x96, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x66, 0x37, 0x4a, 0x67, 0xdd, 0x5d, 0x2d, - 0x8b, 0x13, 0x5d, 0xea, 0x07, 0xe9, 0x54, 0x22, 0x4d, 0x5d, 0x2d, 0xcb, 0xc8, 0x8d, 0xe9, 0xca, - 0x70, 0x4e, 0xd9, 0xf9, 0xb6, 0xdf, 0x32, 0x4f, 0xb8, 0x5d, 0xa2, 0xa2, 0xf7, 0xbc, 0x64, 0x26, - 0xbf, 0x02, 0xb3, 0x39, 0x01, 0xa4, 0xc9, 0xeb, 0x09, 0x43, 0x6c, 0x76, 0x80, 0x69, 0x35, 0x41, - 0x32, 0x33, 0x50, 0xaf, 0xa3, 0x77, 0x82, 0x11, 0xb8, 0x21, 0x75, 0xe3, 0xf7, 0xc8, 0x8d, 0x0e, - 0x78, 0xa2, 0x65, 0x6d, 0xcd, 0xcd, 0x8c, 0xf8, 0x40, 0x6a, 0x78, 0x5e, 0x31, 0xa0, 0x19, 0x97, - 0x7e, 0x19, 0x0c, 0xe7, 0xb2, 0x19, 0xb2, 0xb5, 0x83, 0xcd, 0x85, 0x8c, 0xa8, 0x1a, 0x6a, 0x2e, - 0xe4, 0x47, 0xdc, 0xc8, 0x6d, 0xe6, 0x96, 0x54, 0xb0, 0xb2, 0x39, 0xe6, 0x07, 0xd8, 0xc8, 0xe5, - 0xf8, 0x80, 0x71, 0x4c, 0xc5, 0xcc, 0x20, 0x39, 0xe8, 0xdd, 0x57, 0x0f, 0x5b, 0xee, 0xd7, 0x26, - 0xd5, 0xbc, 0xd6, 0xbe, 0xbc, 0xe8, 0x1c, 0xb9, 0xed, 0x5b, 0x96, 0xdf, 0x53, 0x76, 0xfb, 0x4e, - 0xba, 0x63, 0xab, 0xeb, 0xb1, 0x44, 0xd8, 0x16, 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, 0x36, - 0xd0, 0xdd, 0x28, 0x09, 0xd5, 0x0e, 0xae, 0xd9, 0x71, 0x61, 0x72, 0xf9, 0xf1, 0x79, 0x6c, 0xc4, - 0xd5, 0x38, 0xcd, 0x3c, 0x4e, 0x04, 0xe4, 0x10, 0xf3, 0xd8, 0x80, 0x9e, 0x6e, 0x1e, 0x27, 0x18, - 0x9a, 0xf3, 0x38, 0xd9, 0xcc, 0xa4, 0x21, 0x20, 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, 0x9b, - 0x63, 0x7e, 0xfc, 0x93, 0x5c, 0x8e, 0x6a, 0x1e, 0x9b, 0x1c, 0x73, 0xd0, 0x4f, 0x38, 0x8f, 0x93, - 0x95, 0x98, 0xf3, 0xf8, 0x54, 0xed, 0x53, 0xf3, 0x38, 0xbb, 0x7d, 0xa7, 0x9e, 0xc7, 0x89, 0x80, - 0x41, 0x46, 0x47, 0xb3, 0xe6, 0x71, 0x12, 0x9f, 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x80, 0xe9, 0x32, - 0x8f, 0x93, 0x94, 0x9f, 0x23, 0xbf, 0x44, 0xb0, 0x93, 0x93, 0xcc, 0xe4, 0xdc, 0x38, 0x29, 0xe4, - 0x11, 0x5a, 0xff, 0x12, 0xf0, 0x93, 0xcd, 0xe6, 0x8b, 0x79, 0x4c, 0x71, 0x3e, 0xef, 0x4a, 0x21, - 0x26, 0x9b, 0x6b, 0x9a, 0xb6, 0xb2, 0x63, 0xbd, 0x74, 0x69, 0xf0, 0x2e, 0x9b, 0x37, 0xcd, 0x2e, - 0x7c, 0xbb, 0x85, 0xaa, 0xe9, 0xc2, 0x57, 0x9d, 0x83, 0x92, 0x7c, 0x73, 0x49, 0xba, 0xcf, 0xef, - 0x2f, 0xe4, 0xfd, 0x47, 0x92, 0x6e, 0x3e, 0x71, 0xb2, 0x3a, 0x75, 0x4b, 0xd5, 0x09, 0x2b, 0xd9, - 0xd2, 0xd3, 0xce, 0xf3, 0x75, 0xa9, 0x3d, 0xa4, 0x62, 0x5c, 0x25, 0x3a, 0xad, 0xcf, 0xf5, 0xdc, - 0x12, 0xb2, 0x8d, 0xa6, 0xde, 0x34, 0x5c, 0x33, 0x13, 0xe7, 0x05, 0xd3, 0xea, 0xc9, 0x35, 0x15, - 0xad, 0x47, 0xe7, 0x9a, 0x17, 0xca, 0x47, 0x71, 0x4d, 0x53, 0x7f, 0x8a, 0xa6, 0x33, 0xf1, 0xa6, - 0xcb, 0x7b, 0xec, 0xe7, 0x9f, 0x73, 0xa6, 0x0c, 0x97, 0x28, 0x86, 0x8b, 0x9e, 0x68, 0x1f, 0x8b, - 0x0b, 0x3e, 0x09, 0xcc, 0x15, 0x7e, 0x16, 0x3d, 0xf9, 0x14, 0x4a, 0x62, 0x79, 0x8b, 0x19, 0x64, - 0x21, 0xe6, 0x0e, 0xdd, 0x82, 0xb4, 0xd8, 0x9d, 0xa0, 0x05, 0x27, 0xb1, 0xd4, 0x9d, 0x44, 0x12, - 0xf9, 0x66, 0x2d, 0xb6, 0x1d, 0x6e, 0x07, 0x9d, 0x30, 0xa2, 0xcd, 0xb4, 0x39, 0xca, 0x6c, 0x8c, - 0x74, 0x9c, 0x30, 0xd1, 0x77, 0xe7, 0xc9, 0x2a, 0xae, 0x6d, 0x26, 0xb8, 0x9b, 0xbd, 0x2e, 0x9b, - 0x0d, 0x2e, 0x3d, 0x2b, 0xea, 0xf1, 0x90, 0xd9, 0xa6, 0xbc, 0xba, 0xf3, 0x1b, 0xa5, 0x44, 0x74, - 0xc2, 0xde, 0xe5, 0x89, 0x88, 0x1f, 0xa8, 0xb9, 0xed, 0xb0, 0x97, 0x64, 0x92, 0xcf, 0x99, 0xc8, - 0x67, 0x30, 0x2a, 0x89, 0x7b, 0x0b, 0x24, 0x49, 0x8d, 0x02, 0x59, 0x82, 0x09, 0xe3, 0xad, 0x96, - 0x3a, 0xdd, 0x64, 0xbd, 0xe0, 0xea, 0x32, 0xce, 0x13, 0xc6, 0x9b, 0x2c, 0xc5, 0x25, 0xeb, 0xa5, - 0x56, 0x2e, 0x97, 0xef, 0xc3, 0x98, 0x10, 0x69, 0x57, 0x69, 0xe4, 0x1b, 0xeb, 0x66, 0x34, 0xbf, - 0xe7, 0x4e, 0xd3, 0x8d, 0x16, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x53, 0x30, 0x69, 0x92, 0xdd, 0x79, - 0xf2, 0x03, 0x4c, 0x4b, 0x2c, 0x93, 0x45, 0xd3, 0xe8, 0x99, 0x1f, 0x3c, 0x71, 0xbd, 0xfd, 0x1e, - 0x2c, 0xaf, 0x98, 0x2c, 0x93, 0x74, 0xd2, 0xb5, 0xe4, 0x07, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x93, - 0x49, 0xf7, 0xed, 0xa5, 0x06, 0x17, 0xd1, 0xb9, 0xe6, 0xb4, 0x6d, 0xef, 0xca, 0xf4, 0x4b, 0x1e, - 0x26, 0x51, 0x1a, 0xfa, 0x1b, 0x7e, 0xd0, 0xec, 0xcd, 0xb1, 0x62, 0xba, 0xeb, 0x26, 0xc8, 0xa4, - 0x30, 0xbe, 0x84, 0xf3, 0xb5, 0x5c, 0xd6, 0xbd, 0x58, 0xf4, 0xd2, 0x24, 0x2f, 0xa0, 0x28, 0x4e, - 0xd9, 0xee, 0xae, 0x3c, 0x57, 0x71, 0x4d, 0x63, 0xfb, 0xd0, 0x56, 0x40, 0x1f, 0xd3, 0x00, 0x9d, - 0xc2, 0x7b, 0xb9, 0x43, 0x9b, 0xe8, 0xb2, 0xe7, 0xab, 0x70, 0xb6, 0x96, 0x62, 0x95, 0x47, 0xd2, - 0xbd, 0x55, 0x0f, 0x60, 0x0a, 0x7b, 0x7a, 0xc2, 0x76, 0xf5, 0x70, 0x22, 0x1a, 0xbb, 0x4f, 0xa3, - 0x9d, 0xd5, 0x1e, 0x52, 0x92, 0xaf, 0x16, 0x24, 0xe2, 0xee, 0x1d, 0x46, 0x59, 0xd3, 0x28, 0xd3, - 0x18, 0xb9, 0x1f, 0xef, 0x67, 0xf2, 0x22, 0xa5, 0x67, 0xb5, 0x79, 0x1c, 0xee, 0xe2, 0x5a, 0x28, - 0x1c, 0xa3, 0x35, 0x13, 0x24, 0x87, 0xc4, 0xa6, 0x3a, 0xcd, 0x47, 0x3a, 0x24, 0x55, 0x7e, 0xfc, - 0xe3, 0xd3, 0x43, 0xc0, 0x2e, 0xa7, 0x1c, 0xe6, 0xbb, 0xb2, 0xe0, 0x26, 0xd4, 0x35, 0xbf, 0xf1, - 0x44, 0x37, 0xa1, 0x6a, 0x89, 0xeb, 0xe7, 0xcc, 0xb4, 0xf2, 0x62, 0xc5, 0xc7, 0xdc, 0xf2, 0xba, - 0x5f, 0x98, 0x9e, 0xba, 0x5e, 0x37, 0xa1, 0x9a, 0x49, 0xf6, 0xef, 0x4a, 0xdb, 0x22, 0x56, 0x68, - 0x72, 0xce, 0x15, 0x8d, 0x32, 0x2b, 0x22, 0x91, 0x69, 0x56, 0xd4, 0x1b, 0x9a, 0x7f, 0x11, 0x40, - 0xd2, 0x59, 0xf6, 0xd5, 0x61, 0x25, 0x37, 0x01, 0x7f, 0x17, 0xf7, 0xae, 0x29, 0xe1, 0x14, 0x64, - 0x08, 0x5e, 0x85, 0x1a, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x7d, 0x95, 0x6e, 0x17, 0xc8, 0x06, 0x9c, - 0xbb, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x75, 0xbd, 0x55, 0x94, 0x67, - 0x93, 0x0c, 0x9a, 0xdd, 0x77, 0x18, 0xbf, 0x5a, 0x36, 0xbf, 0xae, 0x74, 0x5d, 0x3c, 0x68, 0xc5, - 0x55, 0xc5, 0x69, 0x9a, 0x98, 0x3f, 0xc5, 0x87, 0xb9, 0x83, 0x4e, 0x3e, 0x69, 0x29, 0x8e, 0x6b, - 0x22, 0x4e, 0x5b, 0x37, 0x61, 0x88, 0x13, 0xe5, 0x6e, 0xa8, 0xe3, 0x3a, 0x0d, 0xb9, 0x03, 0xa3, - 0xca, 0xc3, 0x86, 0x18, 0x45, 0xb9, 0xed, 0xba, 0x03, 0xa3, 0xfc, 0x68, 0x75, 0x72, 0x92, 0x8f, - 0x60, 0x54, 0xb9, 0xe4, 0x9c, 0x7a, 0xa7, 0xff, 0x14, 0x26, 0x74, 0xe7, 0x9c, 0xd3, 0x0b, 0xf2, - 0xfb, 0x78, 0xf7, 0x2b, 0xaf, 0x58, 0xf2, 0xe9, 0x67, 0x12, 0xb9, 0xbc, 0x84, 0x48, 0xf9, 0x02, - 0x29, 0x81, 0xb9, 0xcd, 0x3f, 0x9b, 0xa2, 0x26, 0x1f, 0xc9, 0xf7, 0x52, 0x8a, 0x38, 0x8d, 0xd4, - 0x45, 0x66, 0x93, 0x5c, 0xcc, 0x2f, 0x42, 0xac, 0x16, 0xd8, 0x9e, 0xcd, 0x3e, 0xc9, 0x1d, 0x75, - 0x6f, 0xd1, 0xe5, 0x71, 0xd9, 0x44, 0x2d, 0x2d, 0x95, 0x65, 0x2e, 0x9f, 0xd1, 0xe5, 0xfc, 0xc4, - 0x74, 0x38, 0x18, 0x0f, 0xf0, 0x14, 0x98, 0x2a, 0xcd, 0xed, 0x5e, 0x97, 0x44, 0x77, 0xf1, 0xb1, - 0x37, 0xcd, 0xae, 0x0b, 0x59, 0xb7, 0x53, 0xb4, 0x78, 0x05, 0xfa, 0x4a, 0xd8, 0xad, 0x4a, 0x1f, - 0xc7, 0x93, 0x77, 0x36, 0xbf, 0x65, 0x17, 0x32, 0x6e, 0xc5, 0x7b, 0x8e, 0x45, 0x1e, 0xbb, 0x5f, - 0x41, 0xed, 0x30, 0x33, 0xdc, 0x57, 0x3e, 0xb3, 0xeb, 0x9a, 0x63, 0x45, 0x26, 0xa5, 0xda, 0xf4, - 0x9e, 0xe0, 0x43, 0xb4, 0xec, 0x3c, 0x7c, 0x6f, 0xf4, 0xe0, 0x22, 0x25, 0xf1, 0x66, 0x4f, 0x3c, - 0x75, 0xc7, 0x7a, 0x81, 0xef, 0xb0, 0xd9, 0xf5, 0xf5, 0xc8, 0x2b, 0x98, 0x71, 0xed, 0xad, 0x1c, - 0x48, 0xb3, 0x19, 0x9a, 0x0e, 0xa4, 0x5d, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa1, 0x12, 0x7b, 0x8f, - 0x9c, 0x6e, 0x10, 0xf2, 0xfd, 0x16, 0x49, 0x4a, 0x52, 0x21, 0xe9, 0x96, 0x68, 0x67, 0xee, 0x6a, - 0x9e, 0x84, 0x43, 0xcd, 0x2d, 0x49, 0xf8, 0xbd, 0x25, 0x32, 0x52, 0xe6, 0xe5, 0xb6, 0xec, 0x62, - 0x87, 0x15, 0x2f, 0xf3, 0x5e, 0x09, 0xa3, 0xf4, 0x68, 0x9f, 0x9e, 0x91, 0x72, 0xee, 0x48, 0x30, - 0xb2, 0xba, 0x0c, 0xef, 0x69, 0x7c, 0xd7, 0x92, 0x43, 0x71, 0xda, 0x01, 0x75, 0xe2, 0xd7, 0x68, - 0x89, 0xe8, 0x80, 0xfa, 0x0b, 0xe0, 0x74, 0x51, 0xf2, 0x29, 0x55, 0x16, 0x86, 0xf2, 0xa8, 0x2a, - 0xcb, 0x2a, 0x18, 0x9c, 0x1d, 0x45, 0xfc, 0xc0, 0x8d, 0x9e, 0x2f, 0xda, 0x6b, 0xb1, 0x59, 0x41, - 0x2f, 0x90, 0xbc, 0x41, 0x16, 0xda, 0x6b, 0xe4, 0x2b, 0x5c, 0x4a, 0x04, 0xfb, 0x05, 0xdf, 0x8f, - 0xc2, 0x28, 0x70, 0xda, 0xb5, 0x46, 0xe0, 0xb6, 0xa3, 0xdc, 0x4e, 0xc7, 0x2e, 0xde, 0x59, 0x64, - 0x9a, 0xc7, 0xa9, 0x88, 0x1e, 0x9f, 0x15, 0x5f, 0x47, 0xbd, 0xba, 0xc9, 0x2a, 0xec, 0x72, 0x72, - 0xa9, 0xc9, 0x78, 0xf1, 0xaf, 0x92, 0x69, 0x1d, 0x66, 0x73, 0xa2, 0x12, 0xa9, 0xdb, 0xdb, 0xee, - 0x51, 0x8b, 0xe6, 0xba, 0x57, 0x4c, 0x7e, 0x00, 0x33, 0x99, 0x61, 0x8b, 0x94, 0x05, 0xba, 0x5b, - 0x50, 0xa3, 0x5e, 0xcc, 0x9f, 0x40, 0x99, 0xbf, 0xf7, 0x40, 0xb7, 0x66, 0x23, 0x82, 0x4d, 0xfc, - 0x0a, 0x28, 0x07, 0x21, 0xb9, 0x5e, 0xe7, 0xe3, 0xa9, 0x27, 0xed, 0xd3, 0x18, 0xba, 0x24, 0x91, - 0xf0, 0x5c, 0x7d, 0x78, 0x59, 0x85, 0xdd, 0x9e, 0x1a, 0x6d, 0xc1, 0xcc, 0x2e, 0x0d, 0xdc, 0xc7, - 0xcf, 0x93, 0x0c, 0xa5, 0x64, 0x32, 0x4b, 0xbb, 0x71, 0xfc, 0x02, 0x66, 0x17, 0xfd, 0xc3, 0xb6, - 0x78, 0xd4, 0x67, 0xf0, 0x54, 0x57, 0xf1, 0xd9, 0xe5, 0xbd, 0x1d, 0xa1, 0xe6, 0xf2, 0x53, 0xd3, - 0x2b, 0xff, 0xb7, 0x9e, 0xd9, 0xeb, 0xd5, 0xd3, 0x34, 0x93, 0x7e, 0x1b, 0x27, 0x61, 0x56, 0xae, - 0x7a, 0x7d, 0x12, 0x76, 0xc9, 0x65, 0x9f, 0xf3, 0x44, 0x6c, 0x36, 0x27, 0x3d, 0x7d, 0x17, 0xae, - 0x27, 0x68, 0xed, 0x86, 0xdc, 0x5b, 0xcc, 0x44, 0xde, 0x09, 0x9f, 0xea, 0xcc, 0x2c, 0xdf, 0x99, - 0xed, 0xd4, 0x62, 0x37, 0xb4, 0x5a, 0x5d, 0x54, 0x2c, 0xa2, 0x07, 0x6f, 0x60, 0x98, 0x68, 0xc4, - 0x9f, 0xd0, 0x69, 0xbb, 0xad, 0xd6, 0x29, 0x62, 0x54, 0x6a, 0x3f, 0x84, 0xf1, 0x9a, 0x5e, 0x79, - 0x46, 0x25, 0xb9, 0x93, 0x42, 0x3d, 0x12, 0xea, 0xdd, 0xf6, 0x2e, 0x8e, 0xa4, 0x6a, 0xe3, 0x39, - 0x51, 0x2f, 0x72, 0x5d, 0x67, 0x8c, 0xac, 0x6c, 0x6a, 0x17, 0xc8, 0x4a, 0x9a, 0xa8, 0x5c, 0x67, - 0xb2, 0x13, 0xb9, 0xd5, 0x79, 0x1e, 0x99, 0x64, 0x4e, 0x4c, 0x62, 0xf5, 0x4e, 0x3e, 0xab, 0x5c, - 0xe6, 0xbb, 0x26, 0xd5, 0xe4, 0x7e, 0x3e, 0x71, 0x1e, 0x3a, 0xdd, 0xcf, 0x27, 0x95, 0xdd, 0x4e, - 0xf7, 0xf3, 0xc9, 0x48, 0x5d, 0xb7, 0x8c, 0xbc, 0xe2, 0x04, 0x3c, 0x5d, 0x8c, 0x11, 0x8a, 0x4d, - 0x46, 0x9e, 0x9f, 0x87, 0x7a, 0x08, 0x10, 0x9e, 0xb6, 0xa7, 0x8b, 0xad, 0x35, 0x19, 0xfa, 0x23, - 0x91, 0xe7, 0xe7, 0x1e, 0x94, 0x78, 0x06, 0x83, 0x38, 0x6a, 0x62, 0xec, 0x37, 0x98, 0x4e, 0xac, - 0xd0, 0x65, 0x50, 0x4b, 0xc9, 0x78, 0x73, 0xca, 0x64, 0x96, 0x13, 0x88, 0xae, 0xcb, 0x54, 0x85, - 0x38, 0xaa, 0x9c, 0x32, 0x4c, 0xa5, 0x02, 0xcd, 0xcd, 0x9d, 0xcf, 0x28, 0x51, 0x2a, 0xe5, 0xb8, - 0x1e, 0x83, 0x4e, 0x75, 0x29, 0x23, 0x30, 0xdd, 0xdc, 0x85, 0xcc, 0x32, 0xc1, 0x28, 0xe2, 0xf9, - 0x97, 0xb3, 0xb3, 0x46, 0xc7, 0xef, 0xbc, 0xba, 0xe0, 0xc8, 0x6a, 0x6e, 0x9c, 0x04, 0x55, 0xd4, - 0x4a, 0x55, 0xfa, 0xa1, 0x8c, 0x54, 0xd5, 0x6f, 0x66, 0xbc, 0xc7, 0x30, 0x30, 0x62, 0x6f, 0xb0, - 0xee, 0x79, 0xb3, 0xc9, 0x23, 0x99, 0x0e, 0x26, 0xa7, 0xa6, 0x5e, 0x0c, 0x72, 0x47, 0xf0, 0x91, - 0x4c, 0x00, 0xf3, 0xaa, 0x19, 0xef, 0xc1, 0xc5, 0xc4, 0x73, 0x0f, 0x93, 0xf1, 0x8d, 0xec, 0x37, - 0x21, 0x99, 0xe2, 0xc9, 0xd7, 0xd9, 0xaf, 0xa4, 0xdf, 0x86, 0x24, 0xc6, 0xfd, 0xb4, 0x6b, 0xde, - 0x3a, 0x4c, 0xe2, 0x32, 0x23, 0x93, 0xae, 0xc7, 0x11, 0x68, 0x4c, 0x70, 0x32, 0x14, 0x52, 0xb2, - 0x54, 0xb9, 0xcc, 0x8e, 0x8b, 0x37, 0xc3, 0x3c, 0x85, 0xfb, 0x9c, 0xf9, 0x90, 0x18, 0x81, 0x59, - 0xbb, 0x98, 0xc8, 0x0c, 0x4f, 0xbe, 0x0f, 0x67, 0xe2, 0xa7, 0xc4, 0x9c, 0x45, 0x06, 0x5a, 0x17, - 0x43, 0xd9, 0x99, 0xf8, 0x3d, 0xf1, 0xe9, 0xc9, 0x57, 0xe4, 0x56, 0x14, 0x93, 0x5f, 0x4a, 0x3d, - 0x93, 0x31, 0xfa, 0x70, 0x92, 0x1d, 0x49, 0x93, 0xed, 0x69, 0x47, 0xa7, 0x81, 0x9f, 0x5b, 0x76, - 0x70, 0x45, 0xfd, 0x73, 0xeb, 0x1a, 0x00, 0x52, 0xa9, 0xbf, 0x39, 0x7c, 0xd6, 0xe1, 0x1a, 0x06, - 0x64, 0xd9, 0xe2, 0x21, 0xf8, 0xb2, 0xb1, 0xf2, 0xdb, 0x9e, 0x0c, 0xe3, 0xd2, 0x82, 0xab, 0x3d, - 0xa3, 0x4b, 0x92, 0x5b, 0x86, 0x8b, 0x4b, 0xef, 0x38, 0x94, 0xdd, 0x9e, 0xa6, 0x65, 0x05, 0x69, - 0x54, 0xfb, 0x6c, 0x97, 0x78, 0x91, 0x6a, 0x9f, 0xed, 0x1a, 0xe5, 0xf1, 0x0b, 0xcc, 0xb1, 0x24, - 0xf6, 0x28, 0x0c, 0xb2, 0x44, 0x3d, 0x1e, 0x76, 0xba, 0xeb, 0xb5, 0xcf, 0x55, 0xf3, 0x52, 0x34, - 0x45, 0x88, 0x67, 0x9a, 0xcb, 0xe2, 0x24, 0x96, 0xc7, 0xbc, 0x37, 0x93, 0x2e, 0xae, 0xd5, 0x97, - 0xf9, 0x04, 0x3c, 0x75, 0xcb, 0x73, 0xe0, 0x0b, 0x4b, 0x3f, 0xfb, 0x4f, 0x97, 0x0b, 0x3f, 0xfb, - 0xf9, 0xe5, 0xc2, 0xbf, 0xfb, 0xf9, 0xe5, 0xc2, 0x7f, 0xfc, 0xf9, 0xe5, 0xc2, 0x57, 0xf3, 0x27, - 0x0b, 0x7e, 0xdc, 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0x71, 0x76, 0x43, 0xf8, 0xdf, 0xdd, 0xff, 0x15, - 0x00, 0x00, 0xff, 0xff, 0x3a, 0x0f, 0x03, 0x99, 0x86, 0xe8, 0x00, 0x00, + // 14854 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x5c, 0x49, + 0x76, 0x18, 0xbb, 0xf9, 0x3e, 0x7c, 0xa8, 0x55, 0x24, 0xc5, 0x16, 0xf5, 0x68, 0xe9, 0x6a, 0x1e, + 0x1a, 0xed, 0xac, 0x1e, 0xd4, 0xcc, 0xec, 0xbc, 0x76, 0x66, 0x9a, 0x0f, 0x89, 0x94, 0xf8, 0x9a, + 0xdb, 0x24, 0x35, 0x2f, 0x6f, 0xef, 0x65, 0x77, 0x89, 0xbc, 0x56, 0xf3, 0xde, 0xde, 0x7b, 0x6f, + 0x4b, 0xa3, 0x75, 0xec, 0xc0, 0xeb, 0x04, 0xf1, 0x4f, 0x12, 0x1b, 0x88, 0x03, 0x07, 0xfe, 0x70, + 0x02, 0x24, 0x40, 0x10, 0x20, 0x81, 0x7f, 0x0c, 0xff, 0x24, 0x1f, 0x41, 0x3e, 0xb2, 0x31, 0x60, + 0x24, 0x81, 0xed, 0x9f, 0x7c, 0xd0, 0xc9, 0x02, 0xf9, 0x21, 0x92, 0x0f, 0x23, 0x48, 0x80, 0x2c, + 0x60, 0x20, 0xa8, 0x53, 0x8f, 0x5b, 0x75, 0x1f, 0xdd, 0xa4, 0x46, 0xb3, 0xce, 0x8f, 0xc4, 0x3e, + 0x75, 0xce, 0xa9, 0xaa, 0x53, 0x75, 0xab, 0x4e, 0x9d, 0x3a, 0x75, 0x0e, 0xdc, 0x8c, 0x68, 0x8b, + 0xb6, 0xfd, 0x20, 0xba, 0xd5, 0xa2, 0xfb, 0x4e, 0xe3, 0xf9, 0xad, 0x46, 0xcb, 0xa5, 0x5e, 0x74, + 0xab, 0x1d, 0xf8, 0x91, 0x7f, 0xcb, 0xe9, 0x44, 0x07, 0x21, 0x0d, 0x9e, 0xba, 0x0d, 0x7a, 0x13, + 0x21, 0x64, 0x10, 0xff, 0x9b, 0x9b, 0xde, 0xf7, 0xf7, 0x7d, 0x8e, 0xc3, 0xfe, 0xe2, 0x85, 0x73, + 0x17, 0xf6, 0x7d, 0x7f, 0xbf, 0x45, 0x39, 0xf1, 0x5e, 0xe7, 0xf1, 0x2d, 0x7a, 0xd8, 0x8e, 0x9e, + 0x8b, 0xc2, 0x4a, 0xb2, 0x30, 0x72, 0x0f, 0x69, 0x18, 0x39, 0x87, 0x6d, 0x81, 0xf0, 0x86, 0x6a, + 0x8a, 0x13, 0x45, 0xac, 0x24, 0x72, 0x7d, 0xef, 0xd6, 0xd3, 0x3b, 0xfa, 0x4f, 0x81, 0x7a, 0xbd, + 0x6b, 0xab, 0x1b, 0x34, 0x88, 0xc2, 0x13, 0x61, 0xd2, 0xa7, 0xd4, 0x8b, 0x52, 0xd5, 0x0b, 0xcc, + 0xe8, 0x79, 0x9b, 0x86, 0x1c, 0x45, 0xfe, 0x27, 0x50, 0xaf, 0x66, 0xa3, 0xe2, 0xbf, 0x02, 0xe5, + 0xbb, 0xd9, 0x28, 0xcf, 0xe8, 0x1e, 0x93, 0xa9, 0xa7, 0xfe, 0xe8, 0x81, 0x1e, 0x38, 0xed, 0x36, + 0x0d, 0xe2, 0x3f, 0x04, 0xfa, 0x79, 0x85, 0x7e, 0xf8, 0xd8, 0x61, 0x22, 0x3a, 0x7c, 0xec, 0xa4, + 0xba, 0xd1, 0x09, 0x9d, 0x7d, 0x2a, 0x9a, 0xff, 0xf4, 0x8e, 0xfe, 0x93, 0xa3, 0x5a, 0xbf, 0x5f, + 0x80, 0xc1, 0x47, 0x4e, 0xd4, 0x38, 0x20, 0x1f, 0xc3, 0xe0, 0x43, 0xd7, 0x6b, 0x86, 0xe5, 0xc2, + 0x95, 0xfe, 0xeb, 0x63, 0xf3, 0xa5, 0x9b, 0xbc, 0x2b, 0x58, 0xc8, 0x0a, 0x16, 0x66, 0x7f, 0x7a, + 0x54, 0xe9, 0x3b, 0x3e, 0xaa, 0x9c, 0x79, 0xc2, 0xd0, 0xde, 0xf4, 0x0f, 0xdd, 0x08, 0xc7, 0xd6, + 0xe6, 0x74, 0x64, 0x07, 0xa6, 0xaa, 0xad, 0x96, 0xff, 0x6c, 0xcb, 0x09, 0x22, 0xd7, 0x69, 0xd5, + 0x3a, 0x8d, 0x06, 0x0d, 0xc3, 0x72, 0xf1, 0x4a, 0xe1, 0xfa, 0xc8, 0xc2, 0xb5, 0xe3, 0xa3, 0x4a, + 0xc5, 0x61, 0xc5, 0xf5, 0x36, 0x2f, 0xaf, 0x87, 0x1c, 0x41, 0x63, 0x94, 0x45, 0x6f, 0xfd, 0xf1, + 0x10, 0x94, 0x56, 0xfc, 0x30, 0x5a, 0x64, 0x23, 0x6a, 0xd3, 0x1f, 0x75, 0x68, 0x18, 0x91, 0x6b, + 0x30, 0xc4, 0x60, 0xab, 0x4b, 0xe5, 0xc2, 0x95, 0xc2, 0xf5, 0xd1, 0x85, 0xb1, 0xe3, 0xa3, 0xca, + 0xf0, 0x81, 0x1f, 0x46, 0x75, 0xb7, 0x69, 0x8b, 0x22, 0xf2, 0x06, 0x8c, 0x6c, 0xf8, 0x4d, 0xba, + 0xe1, 0x1c, 0x52, 0x6c, 0xc5, 0xe8, 0xc2, 0xc4, 0xf1, 0x51, 0x65, 0xd4, 0xf3, 0x9b, 0xb4, 0xee, + 0x39, 0x87, 0xd4, 0x56, 0xc5, 0x64, 0x17, 0x06, 0x6c, 0xbf, 0x45, 0xcb, 0xfd, 0x88, 0xb6, 0x70, + 0x7c, 0x54, 0x19, 0x08, 0xfc, 0x16, 0xfd, 0xf9, 0x51, 0xe5, 0x9d, 0x7d, 0x37, 0x3a, 0xe8, 0xec, + 0xdd, 0x6c, 0xf8, 0x87, 0xb7, 0xf6, 0x03, 0xe7, 0xa9, 0xcb, 0x27, 0xa1, 0xd3, 0xba, 0x15, 0x4f, + 0xd5, 0xb6, 0x2b, 0xc6, 0xbd, 0xf6, 0x3c, 0x8c, 0xe8, 0x21, 0xe3, 0x64, 0x23, 0x3f, 0xf2, 0x08, + 0xa6, 0xab, 0xcd, 0xa6, 0xcb, 0x29, 0xb6, 0x02, 0xd7, 0x6b, 0xb8, 0x6d, 0xa7, 0x15, 0x96, 0x07, + 0xae, 0xf4, 0x5f, 0x1f, 0x15, 0x42, 0x51, 0xe5, 0xf5, 0xb6, 0x42, 0xd0, 0x84, 0x92, 0xc9, 0x80, + 0xdc, 0x85, 0x91, 0xa5, 0x8d, 0x1a, 0x6b, 0x7b, 0x58, 0x1e, 0x44, 0x66, 0xb3, 0xc7, 0x47, 0x95, + 0xa9, 0xa6, 0x17, 0x62, 0xd7, 0x74, 0x06, 0x0a, 0x91, 0xbc, 0x03, 0xe3, 0x5b, 0x9d, 0xbd, 0x96, + 0xdb, 0xd8, 0x5e, 0xab, 0x3d, 0xa4, 0xcf, 0xcb, 0x43, 0x57, 0x0a, 0xd7, 0xc7, 0x17, 0xc8, 0xf1, + 0x51, 0x65, 0xb2, 0x8d, 0xf0, 0x7a, 0xd4, 0x0a, 0xeb, 0x4f, 0xe8, 0x73, 0xdb, 0xc0, 0x8b, 0xe9, + 0x6a, 0xb5, 0x15, 0x46, 0x37, 0x9c, 0xa2, 0x0b, 0xc3, 0x03, 0x9d, 0x8e, 0xe3, 0x91, 0x5b, 0x00, + 0x36, 0x3d, 0xf4, 0x23, 0x5a, 0x6d, 0x36, 0x83, 0xf2, 0x08, 0xca, 0xf6, 0xcc, 0xf1, 0x51, 0x65, + 0x2c, 0x40, 0x68, 0xdd, 0x69, 0x36, 0x03, 0x5b, 0x43, 0x21, 0x8b, 0x30, 0x62, 0xfb, 0x5c, 0xc0, + 0xe5, 0xd1, 0x2b, 0x85, 0xeb, 0x63, 0xf3, 0x67, 0xc4, 0x34, 0x94, 0xe0, 0x85, 0x73, 0xc7, 0x47, + 0x15, 0x12, 0x88, 0x5f, 0x7a, 0x2f, 0x25, 0x06, 0xa9, 0xc0, 0xf0, 0x86, 0xbf, 0xe8, 0x34, 0x0e, + 0x68, 0x19, 0x70, 0xee, 0x0d, 0x1e, 0x1f, 0x55, 0x0a, 0xdf, 0xb5, 0x25, 0x94, 0x3c, 0x85, 0xb1, + 0x78, 0xa0, 0xc2, 0xf2, 0x18, 0x8a, 0x6f, 0xfb, 0xf8, 0xa8, 0x72, 0x2e, 0x44, 0x70, 0x9d, 0x0d, + 0xbd, 0x26, 0xc1, 0x6f, 0x30, 0x0b, 0xf4, 0x8a, 0xc8, 0x57, 0x30, 0x13, 0xff, 0xac, 0x86, 0x21, + 0x0d, 0x18, 0x8f, 0xd5, 0xa5, 0xf2, 0x04, 0x4a, 0xe6, 0xb5, 0xe3, 0xa3, 0x8a, 0xa5, 0xb5, 0xa0, + 0xee, 0x48, 0x94, 0xba, 0xdb, 0xd4, 0x7a, 0x9a, 0xcd, 0xe4, 0xc1, 0xc0, 0xc8, 0x78, 0x69, 0xc2, + 0xbe, 0xb4, 0xe3, 0x85, 0x91, 0xb3, 0xd7, 0xa2, 0x99, 0x48, 0xd6, 0x5f, 0x15, 0x80, 0x6c, 0xb6, + 0xa9, 0x57, 0xab, 0xad, 0xb0, 0xef, 0x49, 0x7e, 0x4e, 0x6f, 0xc2, 0x28, 0x1f, 0x38, 0x36, 0xba, + 0x45, 0x1c, 0xdd, 0xc9, 0xe3, 0xa3, 0x0a, 0x88, 0xd1, 0x65, 0x23, 0x1b, 0x23, 0x90, 0x57, 0xa1, + 0x7f, 0x7b, 0x7b, 0x0d, 0xbf, 0x95, 0xfe, 0x85, 0xa9, 0xe3, 0xa3, 0x4a, 0x7f, 0x14, 0xb5, 0x7e, + 0x7e, 0x54, 0x19, 0x59, 0xea, 0x04, 0x28, 0x16, 0x9b, 0x95, 0x93, 0x57, 0x61, 0x78, 0xb1, 0xd5, + 0x09, 0x23, 0x1a, 0x94, 0x07, 0xe2, 0x8f, 0xb4, 0xc1, 0x41, 0xb6, 0x2c, 0x23, 0xdf, 0x81, 0x81, + 0x9d, 0x90, 0x06, 0xe5, 0x41, 0x1c, 0xef, 0x09, 0x31, 0xde, 0x0c, 0xb4, 0x3b, 0xbf, 0x30, 0xc2, + 0xbe, 0xc4, 0x4e, 0x48, 0x03, 0x1b, 0x91, 0xc8, 0x4d, 0x18, 0xe4, 0x83, 0x36, 0x84, 0x8b, 0xd4, + 0x84, 0x9a, 0x1d, 0x2d, 0xba, 0xfb, 0xce, 0xc2, 0xe8, 0xf1, 0x51, 0x65, 0x10, 0x07, 0xcf, 0xe6, + 0x68, 0x0f, 0x06, 0x46, 0x0a, 0xa5, 0xa2, 0x3d, 0xc2, 0x68, 0xd9, 0x67, 0x61, 0x7d, 0x07, 0xc6, + 0xb4, 0xee, 0x93, 0x8b, 0x30, 0xc0, 0xfe, 0xc7, 0x45, 0x64, 0x9c, 0x57, 0xc6, 0x36, 0x0e, 0x1b, + 0xa1, 0xd6, 0x3f, 0x9e, 0x82, 0x12, 0xa3, 0x34, 0x56, 0x9e, 0x9b, 0xba, 0xa8, 0x38, 0x5d, 0xc9, + 0x14, 0x55, 0xb9, 0xa0, 0x0b, 0xeb, 0x3a, 0xa8, 0xda, 0xc5, 0x22, 0x34, 0x7e, 0x7c, 0x54, 0x19, + 0xe9, 0x08, 0x58, 0xdc, 0x36, 0x52, 0x83, 0xe1, 0xe5, 0xaf, 0xdb, 0x6e, 0x40, 0x43, 0x14, 0xed, + 0xd8, 0xfc, 0xdc, 0x4d, 0xbe, 0x5d, 0xde, 0x94, 0xdb, 0xe5, 0xcd, 0x6d, 0xb9, 0x5d, 0x2e, 0x5c, + 0x12, 0x8b, 0xf1, 0x59, 0xca, 0x49, 0xe2, 0xf9, 0xf1, 0x5b, 0x7f, 0x51, 0x29, 0xd8, 0x92, 0x13, + 0x79, 0x13, 0x86, 0xee, 0xf9, 0xc1, 0xa1, 0x13, 0x89, 0x31, 0x98, 0x3e, 0x3e, 0xaa, 0x94, 0x1e, + 0x23, 0x44, 0x9b, 0x52, 0x02, 0x87, 0xdc, 0x83, 0x49, 0xdb, 0xef, 0x44, 0x74, 0xdb, 0x97, 0x23, + 0x37, 0x88, 0x54, 0x97, 0x8f, 0x8f, 0x2a, 0x73, 0x01, 0x2b, 0xa9, 0x47, 0x7e, 0x5d, 0x0c, 0xa1, + 0x46, 0x9f, 0xa0, 0x22, 0xcb, 0x30, 0x59, 0xc5, 0xd5, 0x5b, 0x48, 0x8d, 0x8f, 0xd7, 0xe8, 0xc2, + 0xa5, 0xe3, 0xa3, 0xca, 0x79, 0x07, 0x4b, 0xea, 0x81, 0x28, 0xd2, 0xd9, 0x98, 0x44, 0x64, 0x03, + 0xce, 0x3e, 0xec, 0xec, 0xd1, 0xc0, 0xa3, 0x11, 0x0d, 0x65, 0x8b, 0x86, 0xb1, 0x45, 0x57, 0x8e, + 0x8f, 0x2a, 0x17, 0x9f, 0xa8, 0xc2, 0x8c, 0x36, 0xa5, 0x49, 0x09, 0x85, 0x33, 0xa2, 0xa1, 0x4b, + 0x4e, 0xe4, 0xec, 0x39, 0x21, 0xc5, 0x45, 0x69, 0x6c, 0xfe, 0x1c, 0x17, 0xf1, 0xcd, 0x44, 0xe9, + 0xc2, 0x35, 0x21, 0xe5, 0x0b, 0xaa, 0xef, 0x4d, 0x51, 0xa4, 0x55, 0x94, 0xe4, 0xc9, 0xd6, 0x66, + 0xb5, 0xef, 0x8c, 0x62, 0x6b, 0x71, 0x6d, 0x56, 0xfb, 0x8e, 0xbe, 0x6a, 0xa9, 0x1d, 0x68, 0x0d, + 0x06, 0x77, 0xd8, 0xee, 0x8c, 0x6b, 0xd6, 0xe4, 0xfc, 0x55, 0xd1, 0xa2, 0xe4, 0xfc, 0xbb, 0xc9, + 0x7e, 0x20, 0x22, 0x7e, 0x79, 0x67, 0x70, 0x47, 0xd7, 0xf7, 0x62, 0x2c, 0x23, 0x9f, 0x02, 0x88, + 0x56, 0x55, 0xdb, 0xed, 0xf2, 0x18, 0x76, 0xf2, 0xac, 0xd9, 0xc9, 0x6a, 0xbb, 0xbd, 0x70, 0x59, + 0xf4, 0xef, 0x9c, 0xea, 0x9f, 0xd3, 0x6e, 0x6b, 0xdc, 0x34, 0x26, 0xe4, 0x63, 0x18, 0xc7, 0x25, + 0x4d, 0x8e, 0xe8, 0x38, 0x8e, 0xe8, 0x85, 0xe3, 0xa3, 0xca, 0x2c, 0xae, 0x56, 0x19, 0xe3, 0x69, + 0x10, 0x90, 0x5f, 0x83, 0x19, 0xc1, 0xee, 0x91, 0xeb, 0x35, 0xfd, 0x67, 0xe1, 0x12, 0x0d, 0x9f, + 0x44, 0x7e, 0x1b, 0x97, 0xbf, 0xb1, 0xf9, 0x8b, 0x66, 0xf3, 0x4c, 0x9c, 0x85, 0x1b, 0xa2, 0xa5, + 0x96, 0x6a, 0xe9, 0x33, 0x8e, 0x50, 0x6f, 0x72, 0x0c, 0x7d, 0x81, 0xcc, 0x64, 0x41, 0x56, 0xe1, + 0xcc, 0x4e, 0x48, 0x8d, 0x3e, 0x4c, 0xe2, 0xfe, 0x50, 0x61, 0x23, 0xdc, 0x09, 0x69, 0x3d, 0xaf, + 0x1f, 0x49, 0x3a, 0x62, 0x03, 0x59, 0x0a, 0xfc, 0x76, 0x62, 0x8e, 0x9f, 0x41, 0x89, 0x58, 0xc7, + 0x47, 0x95, 0xcb, 0xcd, 0xc0, 0x6f, 0xd7, 0xf3, 0x27, 0x7a, 0x06, 0x35, 0xf9, 0x01, 0x9c, 0x5b, + 0xf4, 0x3d, 0x8f, 0x36, 0xd8, 0x0a, 0xba, 0xe4, 0x3a, 0xfb, 0x9e, 0x1f, 0x46, 0x6e, 0x63, 0x75, + 0xa9, 0x5c, 0x8a, 0xb7, 0x87, 0x86, 0xc2, 0xa8, 0x37, 0x15, 0x8a, 0xb9, 0x3d, 0xe4, 0x70, 0x21, + 0x5f, 0xc2, 0x84, 0xa8, 0x8b, 0x06, 0x38, 0x35, 0xcf, 0x76, 0x9f, 0x68, 0x0a, 0x99, 0x6f, 0xf4, + 0x81, 0xfc, 0xc9, 0x55, 0x27, 0x93, 0x17, 0xf9, 0x0a, 0xc6, 0xd6, 0xef, 0x55, 0x6d, 0x1a, 0xb6, + 0x7d, 0x2f, 0xa4, 0x65, 0x82, 0x23, 0x7a, 0x59, 0xb0, 0x5e, 0xbf, 0x57, 0xad, 0x76, 0xa2, 0x03, + 0xea, 0x45, 0x6e, 0xc3, 0x89, 0xa8, 0xc4, 0x5a, 0x98, 0x63, 0x33, 0xef, 0xf0, 0xb1, 0x53, 0x0f, + 0x04, 0x44, 0xeb, 0x85, 0xce, 0x8e, 0xcc, 0xc1, 0x48, 0xad, 0xb6, 0xb2, 0xe6, 0xef, 0xbb, 0x5e, + 0x79, 0x8a, 0x09, 0xc3, 0x56, 0xbf, 0xc9, 0x63, 0x98, 0xd1, 0xce, 0x06, 0x75, 0xf6, 0x3f, 0x3d, + 0xa4, 0x5e, 0x54, 0x9e, 0xc6, 0x36, 0x7c, 0x57, 0x1d, 0x6e, 0x6e, 0xea, 0x47, 0x88, 0xa7, 0x77, + 0x6e, 0x56, 0xe3, 0x9f, 0x35, 0x49, 0xb4, 0x50, 0x2c, 0x17, 0xec, 0x69, 0x27, 0xa3, 0x84, 0x6c, + 0xc3, 0xf0, 0x56, 0x27, 0x68, 0xfb, 0x21, 0x2d, 0xcf, 0xa0, 0xe0, 0xae, 0x75, 0xfb, 0x42, 0x05, + 0xea, 0xc2, 0x0c, 0x5b, 0xa2, 0xdb, 0xfc, 0x87, 0xd6, 0x3b, 0xc9, 0x8a, 0x7c, 0x02, 0xe3, 0xb5, + 0xda, 0x4a, 0xbc, 0xa1, 0x9c, 0xc3, 0x0d, 0xe5, 0xe2, 0xf1, 0x51, 0xa5, 0xcc, 0x54, 0xaa, 0x78, + 0x53, 0xd1, 0xbf, 0x2a, 0x9d, 0x82, 0x71, 0xd8, 0x5e, 0xab, 0xc5, 0x1c, 0x66, 0x63, 0x0e, 0x4c, + 0x99, 0xcb, 0xe6, 0xa0, 0x53, 0x90, 0x7f, 0x59, 0x80, 0x2b, 0x3a, 0xcb, 0x2c, 0xc1, 0x94, 0xcf, + 0xbf, 0x88, 0x34, 0xe7, 0x8f, 0x8f, 0x2a, 0x37, 0xcd, 0x7e, 0xd4, 0x33, 0x07, 0x4b, 0x6b, 0x5b, + 0xcf, 0xa6, 0x60, 0x7b, 0xf5, 0x0e, 0x64, 0xb6, 0x77, 0xee, 0x85, 0xdb, 0x6b, 0x4a, 0xad, 0x77, + 0x7b, 0x7b, 0x35, 0xc5, 0xfa, 0x0c, 0x46, 0xd5, 0xa2, 0x4d, 0x86, 0xa1, 0xbf, 0xda, 0x6a, 0x95, + 0xfa, 0xd8, 0x1f, 0xb5, 0xda, 0x4a, 0xa9, 0x40, 0x26, 0x01, 0xe2, 0x9d, 0xaa, 0x54, 0x24, 0xe3, + 0x30, 0x22, 0x77, 0x92, 0x52, 0x3f, 0xe2, 0xb7, 0xdb, 0xa5, 0x01, 0x42, 0x60, 0xd2, 0x5c, 0xcf, + 0x4a, 0x83, 0xd6, 0x6f, 0x17, 0x60, 0x54, 0x7d, 0x87, 0xe4, 0x0c, 0x8c, 0xed, 0x6c, 0xd4, 0xb6, + 0x96, 0x17, 0x57, 0xef, 0xad, 0x2e, 0x2f, 0x95, 0xfa, 0xc8, 0x25, 0x38, 0xbf, 0x5d, 0x5b, 0xa9, + 0x2f, 0x2d, 0xd4, 0xd7, 0x36, 0x17, 0xab, 0x6b, 0xf5, 0x2d, 0x7b, 0xf3, 0xb3, 0xcf, 0xeb, 0xdb, + 0x3b, 0x1b, 0x1b, 0xcb, 0x6b, 0xa5, 0x02, 0x29, 0xc3, 0x34, 0x2b, 0x7e, 0xb8, 0xb3, 0xb0, 0xac, + 0x23, 0x94, 0x8a, 0xe4, 0x2a, 0x5c, 0xca, 0x2a, 0xa9, 0xaf, 0x2c, 0x57, 0x97, 0xd6, 0x96, 0x6b, + 0xb5, 0x52, 0x3f, 0x99, 0x85, 0x29, 0x86, 0x52, 0xdd, 0xda, 0x32, 0x68, 0x07, 0xac, 0x16, 0x8c, + 0x69, 0x1f, 0x00, 0xb9, 0x08, 0xe5, 0xc5, 0x65, 0x7b, 0xbb, 0xbe, 0xb5, 0x63, 0x6f, 0x6d, 0xd6, + 0x96, 0xeb, 0x66, 0x0b, 0x93, 0xa5, 0x6b, 0x9b, 0xf7, 0x57, 0x37, 0xea, 0x0c, 0x54, 0x2b, 0x15, + 0x58, 0x33, 0x8c, 0xd2, 0xda, 0xea, 0xc6, 0xfd, 0xb5, 0xe5, 0xfa, 0x4e, 0x6d, 0x59, 0xa0, 0x14, + 0xad, 0x9f, 0x14, 0x53, 0x5b, 0x3a, 0x99, 0x87, 0xb1, 0x1a, 0xb7, 0x57, 0xe0, 0x32, 0xc7, 0x0f, + 0x88, 0x4c, 0x47, 0x1b, 0x17, 0x66, 0x0c, 0xbe, 0x82, 0xe9, 0x48, 0x4c, 0x4b, 0xdb, 0x62, 0x5f, + 0x73, 0xc3, 0x6f, 0xe9, 0x5a, 0x5a, 0x5b, 0xc0, 0x6c, 0x55, 0x4a, 0xe6, 0x35, 0x7d, 0x8e, 0x9f, + 0x16, 0xf1, 0x44, 0x22, 0xf5, 0x39, 0x7d, 0x6f, 0x57, 0x9a, 0xdd, 0x7c, 0x3c, 0xa4, 0x42, 0x0d, + 0x43, 0x9a, 0x0c, 0x5d, 0x42, 0xe1, 0x91, 0x37, 0xa4, 0xa6, 0xcb, 0x4f, 0x77, 0xb8, 0xd9, 0x27, + 0xce, 0x25, 0x42, 0xc9, 0xb5, 0x3a, 0x39, 0x1b, 0x2b, 0xf9, 0x20, 0x39, 0x67, 0x84, 0x30, 0x90, + 0x59, 0x62, 0xff, 0xb4, 0x13, 0xa8, 0xa4, 0x02, 0x83, 0x7c, 0xc5, 0xe5, 0xf2, 0x40, 0xdd, 0xba, + 0xc5, 0x00, 0x36, 0x87, 0x5b, 0x7f, 0xd8, 0xaf, 0x2b, 0x19, 0x4c, 0x97, 0xd6, 0xe4, 0x8d, 0xba, + 0x34, 0xca, 0x19, 0xa1, 0x4c, 0x6d, 0xae, 0xd1, 0x30, 0xe4, 0xe7, 0x9d, 0xa2, 0x1a, 0x12, 0x08, + 0x39, 0xb0, 0xee, 0x36, 0x99, 0xda, 0xac, 0x50, 0xd8, 0xd1, 0x91, 0x7f, 0x55, 0x78, 0x74, 0xec, + 0x8f, 0x8f, 0x8e, 0xe2, 0xd3, 0xe4, 0x47, 0xc7, 0x18, 0x85, 0x8d, 0xba, 0x50, 0xf3, 0xb0, 0x15, + 0x03, 0xf1, 0xa8, 0x0b, 0xd5, 0x50, 0x8c, 0xba, 0x86, 0x44, 0xde, 0x07, 0xa8, 0x3e, 0xaa, 0xe1, + 0x19, 0xc9, 0xde, 0x10, 0xaa, 0x2e, 0x6e, 0x4a, 0xce, 0xb3, 0x50, 0x1c, 0xc1, 0x02, 0xfd, 0x8c, + 0xa9, 0x61, 0x93, 0x05, 0x98, 0xa8, 0xfe, 0xb8, 0x13, 0xd0, 0xd5, 0x26, 0xdb, 0xd7, 0x22, 0x7e, + 0x98, 0x1e, 0xe5, 0x0b, 0xaf, 0xc3, 0x0a, 0xea, 0xae, 0x28, 0xd1, 0x18, 0x98, 0x24, 0x64, 0x13, + 0xce, 0xde, 0x5f, 0xdc, 0x12, 0xf3, 0xb0, 0xda, 0x68, 0xf8, 0x1d, 0x2f, 0x12, 0xfa, 0xed, 0xd5, + 0xe3, 0xa3, 0xca, 0xa5, 0xfd, 0x46, 0xbb, 0x2e, 0xe7, 0xac, 0xc3, 0x8b, 0x75, 0x05, 0x37, 0x45, + 0x4b, 0xae, 0x41, 0xff, 0x8e, 0xbd, 0x2a, 0x4e, 0xda, 0x67, 0x8f, 0x8f, 0x2a, 0x13, 0x9d, 0xc0, + 0xd5, 0x48, 0x58, 0xa9, 0xd5, 0x82, 0xc9, 0xfb, 0x34, 0x62, 0x93, 0x53, 0x9e, 0x69, 0xba, 0x0f, + 0xdd, 0x87, 0x30, 0xf6, 0xc8, 0x8d, 0x0e, 0x6a, 0xb4, 0x11, 0xd0, 0x48, 0xda, 0x73, 0x50, 0x4c, + 0xcf, 0xdc, 0xe8, 0xa0, 0x1e, 0x72, 0xb8, 0xbe, 0x77, 0x6b, 0xe8, 0xd6, 0x32, 0x9c, 0x11, 0xb5, + 0xa9, 0x23, 0xd4, 0xbc, 0xc9, 0xb0, 0x80, 0x0c, 0x71, 0xa8, 0x74, 0x86, 0x26, 0x9b, 0x3f, 0x2c, + 0xc2, 0xcc, 0xe2, 0x81, 0xe3, 0xed, 0xd3, 0x2d, 0x27, 0x0c, 0x9f, 0xf9, 0x41, 0x53, 0x6b, 0x3c, + 0x9e, 0x1f, 0x53, 0x8d, 0xc7, 0x03, 0xe3, 0x3c, 0x8c, 0x6d, 0xb6, 0x9a, 0x92, 0x46, 0x9c, 0x6d, + 0xb1, 0x2e, 0xbf, 0xd5, 0xac, 0xb7, 0x25, 0x2f, 0x1d, 0x89, 0xd1, 0x6c, 0xd0, 0x67, 0x8a, 0xa6, + 0x3f, 0xa6, 0xf1, 0xe8, 0x33, 0x8d, 0x46, 0x43, 0x22, 0xcb, 0x70, 0xb6, 0x46, 0x1b, 0xbe, 0xd7, + 0xbc, 0xe7, 0x34, 0x22, 0x3f, 0xd8, 0xf6, 0x9f, 0x50, 0x4f, 0x4c, 0x42, 0x54, 0xfe, 0x43, 0x2c, + 0xac, 0x3f, 0xc6, 0xd2, 0x7a, 0xc4, 0x8a, 0xed, 0x34, 0x05, 0xd9, 0x84, 0x91, 0x47, 0xc2, 0x2a, + 0x28, 0x0e, 0xc4, 0xaf, 0xde, 0x54, 0x66, 0xc2, 0xc5, 0x80, 0xe2, 0xcc, 0x71, 0x5a, 0xea, 0x48, + 0xaf, 0x74, 0x29, 0x5c, 0xae, 0x24, 0xa6, 0xad, 0x98, 0x58, 0x3b, 0x30, 0xb1, 0xd5, 0xea, 0xec, + 0xbb, 0x1e, 0x5b, 0x58, 0x6a, 0xf4, 0x47, 0x64, 0x09, 0x20, 0x06, 0x08, 0x5b, 0xdf, 0x94, 0x38, + 0x46, 0xc7, 0x05, 0xbb, 0x77, 0xc5, 0xd7, 0x86, 0x10, 0x3c, 0xf5, 0xd8, 0x1a, 0x9d, 0xf5, 0x7f, + 0xfb, 0x81, 0x88, 0x01, 0xc0, 0x8d, 0xae, 0x46, 0x23, 0xb6, 0x05, 0x9d, 0x83, 0xa2, 0x32, 0xc9, + 0x0d, 0x1d, 0x1f, 0x55, 0x8a, 0x6e, 0xd3, 0x2e, 0xae, 0x2e, 0x91, 0xb7, 0x60, 0x10, 0xd1, 0x50, + 0xfe, 0x93, 0xaa, 0x3e, 0x9d, 0x03, 0x5f, 0x60, 0x70, 0x87, 0xb5, 0x39, 0x32, 0x79, 0x1b, 0x46, + 0x97, 0x68, 0x8b, 0xee, 0x3b, 0x91, 0x2f, 0x97, 0x00, 0x6e, 0xe4, 0x92, 0x40, 0x6d, 0xce, 0xc5, + 0x98, 0xec, 0xc8, 0x6b, 0x53, 0x27, 0xf4, 0x3d, 0xfd, 0xc8, 0x1b, 0x20, 0x44, 0x3f, 0xf2, 0x72, + 0x1c, 0xf2, 0x3b, 0x05, 0x18, 0xab, 0x7a, 0x9e, 0x30, 0x1e, 0x85, 0x42, 0xea, 0x33, 0x37, 0x95, + 0xb5, 0x75, 0xcd, 0xd9, 0xa3, 0xad, 0x5d, 0xa7, 0xd5, 0xa1, 0xe1, 0xc2, 0x57, 0xec, 0x14, 0xf2, + 0x5f, 0x8e, 0x2a, 0x1f, 0x9c, 0xc2, 0x1c, 0x14, 0xdb, 0x6d, 0xb7, 0x03, 0xc7, 0x8d, 0xc2, 0xe3, + 0xa3, 0xca, 0x8c, 0x13, 0x57, 0xa8, 0x7f, 0x37, 0x5a, 0x3b, 0xe2, 0xf5, 0x7f, 0xa8, 0xd7, 0xfa, + 0x4f, 0x0e, 0xe1, 0x4c, 0x35, 0x0c, 0x3b, 0x87, 0xb4, 0x16, 0x39, 0x41, 0xb4, 0xed, 0x1e, 0x52, + 0x5c, 0x44, 0xba, 0x1b, 0x10, 0x5e, 0xff, 0xe9, 0x51, 0xa5, 0xc0, 0x0e, 0x3e, 0x0e, 0x92, 0x32, + 0xdd, 0x26, 0x88, 0xea, 0x91, 0xab, 0x6f, 0x61, 0x68, 0x4a, 0x48, 0xf2, 0xb6, 0xae, 0x29, 0xa5, + 0x63, 0x75, 0x29, 0x6f, 0xc4, 0xad, 0x45, 0xb8, 0x78, 0x9f, 0x46, 0x36, 0x0d, 0x69, 0x24, 0xbf, + 0x11, 0x9c, 0xe1, 0xb1, 0x01, 0x77, 0x18, 0x7f, 0x2b, 0x62, 0x1c, 0x7e, 0xfe, 0x5d, 0xc8, 0x12, + 0xeb, 0x6f, 0x15, 0xa0, 0xb2, 0x18, 0x50, 0x7e, 0x66, 0xc8, 0x61, 0xd4, 0x7d, 0xed, 0xba, 0x08, + 0x03, 0xdb, 0xcf, 0xdb, 0xd2, 0xf2, 0x82, 0xa5, 0x6c, 0x50, 0x6c, 0x84, 0x9e, 0xd0, 0x90, 0x65, + 0x3d, 0x86, 0x19, 0x9b, 0x7a, 0xf4, 0x99, 0xb3, 0xd7, 0xa2, 0x86, 0x2d, 0xa8, 0x02, 0x83, 0xfc, + 0x43, 0x4f, 0x75, 0x81, 0xc3, 0x4f, 0x67, 0x57, 0xb3, 0x26, 0x60, 0x6c, 0xcb, 0xf5, 0xf6, 0x05, + 0x77, 0xeb, 0x0f, 0xfa, 0x61, 0x9c, 0xff, 0x16, 0xc7, 0xa0, 0xc4, 0x16, 0x57, 0x38, 0xc9, 0x16, + 0xf7, 0x2e, 0x4c, 0xb0, 0x3d, 0x82, 0x06, 0xbb, 0x34, 0x60, 0x5b, 0xab, 0x90, 0x04, 0x1e, 0xe9, + 0x42, 0x2c, 0xa8, 0x3f, 0xe5, 0x25, 0xb6, 0x89, 0x48, 0xd6, 0x60, 0x92, 0x03, 0xee, 0x51, 0x27, + 0xea, 0xc4, 0x56, 0xa9, 0x33, 0xe2, 0xdc, 0x23, 0xc1, 0x7c, 0x6a, 0x0a, 0x5e, 0x8f, 0x05, 0xd0, + 0x4e, 0xd0, 0x92, 0x8f, 0xe1, 0xcc, 0x56, 0xe0, 0x7f, 0xfd, 0x5c, 0xdb, 0xd4, 0xf9, 0xd7, 0xc9, + 0x4f, 0x48, 0xac, 0xa8, 0xae, 0x6f, 0xed, 0x49, 0x6c, 0xf2, 0x06, 0x8c, 0xac, 0x86, 0x0b, 0x7e, + 0xe0, 0x7a, 0xfb, 0xf8, 0x8d, 0x8e, 0x70, 0x63, 0xbe, 0x1b, 0xd6, 0xf7, 0x10, 0x68, 0xab, 0xe2, + 0x84, 0xd9, 0x79, 0xb8, 0xb7, 0xd9, 0xf9, 0x36, 0xc0, 0x9a, 0xef, 0x34, 0xab, 0xad, 0xd6, 0x62, + 0x35, 0xc4, 0xdd, 0x53, 0xec, 0x47, 0x2d, 0xdf, 0x69, 0xd6, 0x9d, 0x56, 0xab, 0xde, 0x70, 0x42, + 0x5b, 0xc3, 0x79, 0x30, 0x30, 0x32, 0x54, 0x1a, 0xb6, 0xcf, 0xac, 0xb9, 0x0d, 0xea, 0x85, 0xf4, + 0x91, 0x13, 0x78, 0xae, 0xb7, 0x1f, 0x5a, 0xff, 0xea, 0x2c, 0x8c, 0xa8, 0x2e, 0xdf, 0xd4, 0x15, + 0x7b, 0xb1, 0xcb, 0xe1, 0xe8, 0xc7, 0x66, 0x2b, 0x5b, 0xc3, 0x20, 0xe7, 0x51, 0xd5, 0x17, 0xfb, + 0xeb, 0x30, 0x9b, 0x8d, 0x4e, 0xbb, 0x6d, 0x33, 0x18, 0xfb, 0xca, 0x96, 0x16, 0x50, 0xfe, 0x23, + 0xfc, 0x2b, 0x6b, 0xee, 0xd9, 0xc5, 0xa5, 0x05, 0x36, 0xbd, 0x37, 0x57, 0x97, 0x16, 0x51, 0x94, + 0x23, 0x7c, 0x7a, 0xfb, 0x6e, 0xb3, 0x61, 0x23, 0x94, 0x95, 0xd6, 0xaa, 0xeb, 0x6b, 0x42, 0x5c, + 0x58, 0x1a, 0x3a, 0x87, 0x2d, 0x1b, 0xa1, 0x4c, 0x39, 0xe4, 0x16, 0x88, 0x45, 0xdf, 0x8b, 0x02, + 0xbf, 0x15, 0xa2, 0x06, 0x33, 0xc2, 0x87, 0x53, 0x98, 0x2e, 0x1a, 0xa2, 0xc8, 0x4e, 0xa0, 0x92, + 0x47, 0x30, 0x5b, 0x6d, 0x3e, 0x75, 0xbc, 0x06, 0x6d, 0xf2, 0x92, 0x47, 0x7e, 0xf0, 0xe4, 0x71, + 0xcb, 0x7f, 0x16, 0xa2, 0xbc, 0x47, 0x84, 0xa5, 0x4f, 0xa0, 0x48, 0x4b, 0xc8, 0x33, 0x89, 0x64, + 0xe7, 0x51, 0xb3, 0x4f, 0x6a, 0xb1, 0xe5, 0x77, 0x9a, 0x62, 0x14, 0xf0, 0x93, 0x6a, 0x30, 0x80, + 0xcd, 0xe1, 0x4c, 0x4a, 0x2b, 0xb5, 0x75, 0xb4, 0xab, 0x09, 0x29, 0x1d, 0x84, 0x87, 0x36, 0x83, + 0x91, 0x57, 0x61, 0x58, 0xea, 0xb9, 0xdc, 0xf0, 0x8f, 0x06, 0x67, 0xa9, 0xdf, 0xca, 0x32, 0xf6, + 0x49, 0xd8, 0xb4, 0xe1, 0x3f, 0xa5, 0xc1, 0xf3, 0x45, 0xbf, 0x49, 0xa5, 0x15, 0x48, 0x58, 0x39, + 0x78, 0x41, 0xbd, 0xc1, 0x4a, 0x6c, 0x13, 0x91, 0x55, 0xc0, 0xf7, 0xc0, 0xb0, 0x7c, 0x26, 0xae, + 0x80, 0xef, 0x91, 0xa1, 0x2d, 0xcb, 0xc8, 0x12, 0x9c, 0xad, 0x76, 0x22, 0xff, 0xd0, 0x89, 0xdc, + 0xc6, 0x4e, 0x7b, 0x3f, 0x70, 0x58, 0x25, 0x25, 0x24, 0x40, 0xbd, 0xdf, 0x91, 0x85, 0xf5, 0x8e, + 0x28, 0xb5, 0xd3, 0x04, 0xe4, 0x1d, 0x18, 0x5f, 0x0d, 0xb9, 0xa5, 0xcf, 0x09, 0x69, 0x13, 0xcd, + 0x35, 0xa2, 0x95, 0x6e, 0x58, 0x47, 0xbb, 0x5f, 0x9d, 0x9d, 0x14, 0x9a, 0xb6, 0x81, 0x47, 0x2c, + 0x18, 0xaa, 0x86, 0xa1, 0x1b, 0x46, 0x68, 0x85, 0x19, 0x59, 0x80, 0xe3, 0xa3, 0xca, 0x90, 0x83, + 0x10, 0x5b, 0x94, 0x90, 0x47, 0x30, 0xb6, 0x44, 0x99, 0xe2, 0xb8, 0x1d, 0x74, 0xc2, 0x08, 0x6d, + 0x2a, 0x63, 0xf3, 0xe7, 0xc5, 0x87, 0xad, 0x95, 0x88, 0xb9, 0xcc, 0xb5, 0xbd, 0x26, 0xc2, 0xeb, + 0x11, 0x2b, 0xd0, 0x77, 0x2d, 0x0d, 0x9f, 0x69, 0xc5, 0x82, 0x66, 0xc5, 0x6d, 0xb2, 0x4f, 0x75, + 0x1a, 0xdb, 0x80, 0x5a, 0xb1, 0x58, 0x1b, 0xea, 0x07, 0x58, 0xa2, 0x6b, 0xc5, 0x06, 0x09, 0x69, + 0xa4, 0x8c, 0xc7, 0x33, 0x86, 0x81, 0xd0, 0x2c, 0x94, 0x4d, 0x3c, 0xa5, 0x69, 0xf9, 0x43, 0x18, + 0x5b, 0xec, 0x84, 0x91, 0x7f, 0xb8, 0x7d, 0x40, 0x0f, 0x29, 0xda, 0x5d, 0x84, 0xee, 0xdf, 0x40, + 0x70, 0x3d, 0x62, 0x70, 0xbd, 0x9b, 0x1a, 0x3a, 0xf9, 0x14, 0x88, 0x54, 0xe2, 0xef, 0xb3, 0xf9, + 0xe1, 0xb1, 0xb9, 0x8c, 0xa6, 0x97, 0x11, 0xae, 0xb9, 0x4b, 0xdd, 0xbf, 0xbe, 0xaf, 0x8a, 0x75, + 0xf3, 0x5f, 0x9a, 0x98, 0x35, 0x88, 0x37, 0xf1, 0x7e, 0xe0, 0xb4, 0x0f, 0xca, 0xe5, 0x58, 0xcb, + 0x16, 0x9d, 0xda, 0x67, 0x70, 0x43, 0x5b, 0x88, 0xd1, 0x49, 0x0d, 0x80, 0xff, 0x5c, 0x63, 0x03, + 0xcf, 0x8d, 0x35, 0x65, 0x43, 0x5e, 0xac, 0x40, 0xca, 0xea, 0x3c, 0xea, 0x20, 0x9c, 0x6d, 0xcb, + 0x35, 0x46, 0x53, 0x63, 0x43, 0x9e, 0x40, 0x89, 0xff, 0x5a, 0xf7, 0x3d, 0x37, 0xe2, 0x4b, 0xef, + 0x9c, 0x61, 0xd9, 0x4b, 0x16, 0xcb, 0x0a, 0xd0, 0xa2, 0x2a, 0x2a, 0x38, 0x54, 0xa5, 0x5a, 0x35, + 0x29, 0xc6, 0x64, 0x0b, 0xc6, 0xb6, 0x02, 0xbf, 0xd9, 0x69, 0x44, 0xb8, 0x61, 0x5f, 0x40, 0x45, + 0x91, 0x88, 0x7a, 0xb4, 0x12, 0x2e, 0x93, 0x36, 0x07, 0xd4, 0xd9, 0x66, 0xae, 0xcb, 0x44, 0x43, + 0x24, 0x0b, 0x30, 0xb4, 0xe5, 0xb7, 0xdc, 0xc6, 0xf3, 0xf2, 0x45, 0x6c, 0xf4, 0xb4, 0x64, 0x86, + 0x40, 0xd9, 0x54, 0xd4, 0x0e, 0xdb, 0x08, 0xd2, 0xb5, 0x43, 0x8e, 0x44, 0xaa, 0x30, 0xf1, 0x29, + 0x9b, 0x30, 0xae, 0xef, 0x79, 0x8e, 0x1b, 0xd0, 0xf2, 0x25, 0x1c, 0x17, 0xb4, 0x7a, 0xff, 0x48, + 0x2f, 0xd0, 0xa7, 0xb3, 0x41, 0x41, 0x56, 0xe1, 0xcc, 0x6a, 0x58, 0x8b, 0x02, 0xb7, 0x4d, 0xd7, + 0x1d, 0xcf, 0xd9, 0xa7, 0xcd, 0xf2, 0xe5, 0xd8, 0xec, 0xec, 0x86, 0xf5, 0x10, 0xcb, 0xea, 0x87, + 0xbc, 0x50, 0x37, 0x3b, 0x27, 0xe8, 0xc8, 0x67, 0x30, 0xbd, 0xfc, 0x75, 0xc4, 0x66, 0x4c, 0xab, + 0xda, 0x69, 0xba, 0x51, 0x2d, 0xf2, 0x03, 0x67, 0x9f, 0x96, 0x2b, 0xc8, 0xef, 0x95, 0xe3, 0xa3, + 0xca, 0x15, 0x2a, 0xca, 0xeb, 0x0e, 0x43, 0xa8, 0x87, 0x1c, 0x43, 0xbf, 0x4e, 0xce, 0xe2, 0xc0, + 0xa4, 0x5f, 0xeb, 0xb4, 0x99, 0xe2, 0x8a, 0xd2, 0xbf, 0x62, 0x48, 0x5f, 0x2b, 0xe1, 0xd2, 0x0f, + 0x39, 0x20, 0x25, 0x7d, 0x0d, 0x91, 0xd8, 0x40, 0x1e, 0xf8, 0xae, 0x57, 0x6d, 0x44, 0xee, 0x53, + 0x2a, 0xce, 0xf5, 0x61, 0xf9, 0x2a, 0xb6, 0x14, 0x4d, 0xe4, 0xbf, 0xec, 0xbb, 0x5e, 0xdd, 0xc1, + 0xe2, 0xba, 0xb0, 0x02, 0x18, 0x26, 0xf2, 0x34, 0x35, 0xf9, 0x01, 0x9c, 0x5b, 0xf7, 0xf7, 0xdc, + 0x16, 0xe5, 0x4b, 0x0e, 0x17, 0x0b, 0x9a, 0xfb, 0x2c, 0xe4, 0x8b, 0x26, 0xf2, 0x43, 0xc4, 0xa8, + 0x8b, 0xd5, 0xea, 0x50, 0xe1, 0xe8, 0x26, 0xf2, 0x6c, 0x2e, 0x64, 0x19, 0xc6, 0xf1, 0xbb, 0x6c, + 0xe1, 0xcf, 0xb0, 0x7c, 0x0d, 0x4f, 0x47, 0x57, 0x13, 0x0a, 0xcf, 0xcd, 0x65, 0x0d, 0x67, 0xd9, + 0x8b, 0x82, 0xe7, 0xb6, 0x41, 0x46, 0x3e, 0x82, 0xb9, 0xe4, 0xf4, 0x5e, 0xf4, 0xbd, 0xc7, 0xee, + 0x7e, 0x27, 0xa0, 0xcd, 0xf2, 0x2b, 0xac, 0xa9, 0x76, 0x17, 0x8c, 0xb9, 0x47, 0x70, 0x36, 0x55, + 0x05, 0x29, 0x41, 0xff, 0x13, 0x71, 0xe3, 0x38, 0x6a, 0xb3, 0x3f, 0xc9, 0x9b, 0x30, 0xf8, 0x94, + 0x1d, 0x4b, 0x50, 0x63, 0x88, 0xef, 0xb0, 0x34, 0xd2, 0x55, 0xef, 0xb1, 0x6f, 0x73, 0xa4, 0xf7, + 0x8b, 0xef, 0x16, 0x1e, 0x0c, 0x8c, 0x8c, 0x95, 0xc6, 0xf9, 0x45, 0xf1, 0x83, 0x81, 0x91, 0x89, + 0xd2, 0xa4, 0x55, 0x85, 0x33, 0x09, 0x7c, 0x52, 0x86, 0x61, 0xea, 0x31, 0x55, 0xb7, 0xc9, 0x75, + 0x16, 0x5b, 0xfe, 0x24, 0xd3, 0x30, 0xd8, 0x72, 0x0f, 0xdd, 0x08, 0x2b, 0x1c, 0xb4, 0xf9, 0x0f, + 0xeb, 0x77, 0x0b, 0x40, 0xd2, 0x5b, 0x06, 0xb9, 0x95, 0x60, 0xc3, 0x15, 0x3d, 0x01, 0xd2, 0x4d, + 0xe1, 0x92, 0xfb, 0xa7, 0x30, 0xc5, 0xc7, 0x4c, 0x6e, 0x6e, 0x5a, 0x5d, 0x7c, 0x51, 0xcd, 0x28, + 0xd6, 0xcd, 0x21, 0xa2, 0x18, 0xb7, 0xc2, 0x35, 0x6c, 0x5a, 0x07, 0x66, 0x32, 0x37, 0x0b, 0xb2, + 0x0e, 0x33, 0x87, 0xbe, 0x17, 0x1d, 0xb4, 0x9e, 0xcb, 0xbd, 0x42, 0xd4, 0x56, 0xc0, 0xda, 0x70, + 0x7d, 0xcc, 0x44, 0xb0, 0xa7, 0x04, 0x58, 0x70, 0xc4, 0x7a, 0x1e, 0x0c, 0x8c, 0x14, 0x4b, 0xfd, + 0xaa, 0x27, 0x96, 0x0d, 0x67, 0x53, 0x6b, 0x2e, 0xf9, 0x3e, 0x8c, 0x37, 0xf0, 0x28, 0x63, 0xd4, + 0xc4, 0x77, 0x1c, 0x0d, 0xae, 0x7f, 0x4e, 0x1c, 0xce, 0xbb, 0xf2, 0xcf, 0x0a, 0x30, 0x9b, 0xb3, + 0xda, 0x9e, 0x5e, 0xd4, 0x9f, 0xc3, 0xb9, 0x43, 0xe7, 0xeb, 0x7a, 0x80, 0x27, 0xd5, 0x7a, 0xe0, + 0x78, 0x09, 0x69, 0xe3, 0x4a, 0x92, 0x8d, 0xa1, 0x7b, 0xeb, 0x1c, 0x3a, 0x5f, 0xdb, 0x88, 0x60, + 0xb3, 0x72, 0xde, 0xce, 0x4f, 0x60, 0xc2, 0x58, 0x5f, 0x4f, 0xdd, 0x38, 0xeb, 0x0e, 0x9c, 0x65, + 0x67, 0xf9, 0x88, 0x9e, 0xd8, 0x42, 0x65, 0x6d, 0x01, 0xd4, 0xe8, 0xa1, 0xd3, 0x3e, 0xf0, 0x99, + 0xde, 0xbd, 0xa0, 0xff, 0x12, 0x16, 0x0e, 0x22, 0x2c, 0x0e, 0xaa, 0x60, 0xf7, 0x2e, 0xd7, 0xc5, + 0x43, 0x85, 0x69, 0x6b, 0x54, 0xd6, 0x9f, 0x14, 0x81, 0x88, 0x05, 0x32, 0xa0, 0xce, 0xa1, 0x6c, + 0xc6, 0x7b, 0x30, 0xce, 0xcf, 0xa3, 0x1c, 0x8c, 0xcd, 0x19, 0x9b, 0x9f, 0x12, 0x5f, 0x9e, 0x5e, + 0xb4, 0xd2, 0x67, 0x1b, 0xa8, 0x8c, 0xd4, 0xa6, 0xfc, 0x20, 0x8d, 0xa4, 0x45, 0x83, 0x54, 0x2f, + 0x62, 0xa4, 0xfa, 0x6f, 0xf2, 0x31, 0x4c, 0x2e, 0xfa, 0x87, 0x6d, 0x26, 0x13, 0x41, 0xdc, 0x2f, + 0x8c, 0x14, 0xa2, 0x5e, 0xa3, 0x70, 0xa5, 0xcf, 0x4e, 0xa0, 0x93, 0x0d, 0x98, 0xba, 0xd7, 0xea, + 0x84, 0x07, 0x55, 0xaf, 0xb9, 0xd8, 0xf2, 0x43, 0xc9, 0x65, 0x40, 0x18, 0x09, 0xc4, 0xf2, 0x96, + 0xc6, 0x58, 0xe9, 0xb3, 0xb3, 0x08, 0xc9, 0xab, 0x30, 0xb8, 0xfc, 0x94, 0x2d, 0xbb, 0xd2, 0x67, + 0x43, 0xb8, 0x94, 0x6d, 0x7a, 0x74, 0xf3, 0xf1, 0x4a, 0x9f, 0xcd, 0x4b, 0x17, 0x46, 0x61, 0x58, + 0x9e, 0x65, 0x6f, 0x31, 0x95, 0x58, 0x89, 0xb3, 0x16, 0x39, 0x51, 0x27, 0x24, 0x73, 0x30, 0xb2, + 0xd3, 0x66, 0x47, 0x2c, 0x69, 0x04, 0xb0, 0xd5, 0x6f, 0xeb, 0x4d, 0x53, 0xd2, 0xe4, 0xa2, 0x6e, + 0x3f, 0xe6, 0xc8, 0x31, 0xc0, 0x5a, 0x31, 0x85, 0xdb, 0x1d, 0xdb, 0xa8, 0xb7, 0x98, 0xa8, 0xb7, + 0x94, 0x94, 0xb5, 0x35, 0x93, 0x29, 0x3c, 0xeb, 0x33, 0xb8, 0xbc, 0xd3, 0x0e, 0x69, 0x10, 0x55, + 0xdb, 0xed, 0x96, 0xdb, 0xe0, 0x77, 0x3e, 0x78, 0xe6, 0x95, 0x93, 0xe5, 0x1d, 0x18, 0xe2, 0x00, + 0x31, 0x4d, 0xe4, 0x1c, 0xac, 0xb6, 0xdb, 0xe2, 0xa4, 0x7d, 0x97, 0x2b, 0xe7, 0xfc, 0xec, 0x6c, + 0x0b, 0x6c, 0xeb, 0xb7, 0x0a, 0x70, 0x99, 0x7f, 0x01, 0xb9, 0xac, 0xbf, 0x03, 0xa3, 0xe8, 0xd1, + 0xd5, 0x76, 0x1a, 0xf2, 0x9b, 0xe0, 0xae, 0x6d, 0x12, 0x68, 0xc7, 0xe5, 0x9a, 0xaf, 0x5c, 0x31, + 0xdf, 0x57, 0x4e, 0x7e, 0x60, 0xfd, 0x99, 0x1f, 0xd8, 0xa7, 0x60, 0x89, 0x16, 0xb5, 0x5a, 0xa9, + 0x46, 0x85, 0x2f, 0xd2, 0x2a, 0xeb, 0x7f, 0x16, 0x61, 0xf6, 0x3e, 0xf5, 0x68, 0xe0, 0x60, 0x3f, + 0x0d, 0x9b, 0x8e, 0xee, 0x33, 0x53, 0xe8, 0xea, 0x33, 0x53, 0x91, 0x56, 0xb2, 0x22, 0x5a, 0xc9, + 0x52, 0x0e, 0x40, 0xec, 0xb8, 0xb8, 0x63, 0xaf, 0x8a, 0x6e, 0xe1, 0x71, 0xb1, 0x13, 0xb8, 0x68, + 0x07, 0x27, 0xab, 0xb1, 0xbf, 0xcd, 0x40, 0x4f, 0x73, 0xd9, 0x94, 0xf0, 0x3f, 0x18, 0x16, 0xfe, + 0x36, 0xa6, 0x97, 0xcd, 0x06, 0x0c, 0x71, 0xe3, 0x1e, 0xde, 0xd6, 0x8c, 0xcd, 0xdf, 0x10, 0xdf, + 0x54, 0x4e, 0x07, 0x85, 0x25, 0x10, 0x37, 0x76, 0x3e, 0x05, 0x22, 0x04, 0xd8, 0x82, 0xcb, 0xdc, + 0xa7, 0x30, 0xa6, 0xa1, 0x9c, 0x64, 0xef, 0x57, 0x46, 0x46, 0xa6, 0x31, 0x7a, 0xfb, 0xdc, 0x5e, + 0xa9, 0xed, 0xfd, 0xd6, 0x07, 0x50, 0x4e, 0xb7, 0x46, 0x18, 0x96, 0x7a, 0xd9, 0xb1, 0xac, 0x25, + 0x98, 0xbe, 0x4f, 0x23, 0x9c, 0xb8, 0xf8, 0x11, 0x69, 0x7e, 0x63, 0x89, 0xef, 0x4c, 0xae, 0xaa, + 0xf2, 0x56, 0x47, 0xff, 0x4a, 0x6b, 0x30, 0x93, 0xe0, 0x22, 0xea, 0x7f, 0x1f, 0x86, 0x05, 0x48, + 0xad, 0xa8, 0xc2, 0xf9, 0x94, 0xee, 0x89, 0x82, 0xdd, 0x79, 0x3e, 0x6f, 0x05, 0x67, 0x5b, 0x12, + 0x58, 0x07, 0x70, 0x8e, 0x6d, 0xb3, 0x31, 0x57, 0x35, 0x1d, 0x2f, 0xc0, 0x68, 0x9b, 0x29, 0x0a, + 0xa1, 0xfb, 0x63, 0x3e, 0x8d, 0x06, 0xed, 0x11, 0x06, 0xa8, 0xb9, 0x3f, 0xa6, 0xe4, 0x12, 0x00, + 0x16, 0x62, 0x37, 0xc5, 0x2a, 0x80, 0xe8, 0xdc, 0x70, 0x47, 0x00, 0xbd, 0xce, 0xf8, 0xbc, 0xb1, + 0xf1, 0x6f, 0x2b, 0x80, 0xd9, 0x54, 0x4d, 0xa2, 0x03, 0xb7, 0x60, 0x44, 0xaa, 0xb0, 0x09, 0x93, + 0xba, 0xde, 0x03, 0x5b, 0x21, 0x91, 0xd7, 0xe0, 0x8c, 0x47, 0xbf, 0x8e, 0xea, 0xa9, 0x36, 0x4c, + 0x30, 0xf0, 0x96, 0x6c, 0x87, 0xf5, 0x4b, 0x68, 0x46, 0xad, 0x79, 0xfe, 0xb3, 0xc7, 0x2d, 0xe7, + 0x09, 0x4d, 0x55, 0xfc, 0x7d, 0x18, 0xa9, 0xf5, 0xae, 0x98, 0x7f, 0x3e, 0xb2, 0x72, 0x5b, 0x91, + 0x58, 0x2d, 0x98, 0x63, 0x5d, 0xaa, 0x55, 0xd7, 0xd7, 0x56, 0x9b, 0x5b, 0xdf, 0xb6, 0x00, 0x9f, + 0xc2, 0x85, 0xcc, 0xda, 0xbe, 0x6d, 0x21, 0xfe, 0x9b, 0x01, 0x98, 0xe5, 0x9b, 0x49, 0x7a, 0x06, + 0x9f, 0x7c, 0xa9, 0xf9, 0x85, 0xdc, 0x48, 0xde, 0xce, 0xb8, 0x91, 0x44, 0x12, 0xfd, 0x46, 0xd2, + 0xb8, 0x87, 0x7c, 0x37, 0xfb, 0x1e, 0x12, 0xed, 0x44, 0xe6, 0x3d, 0x64, 0xf2, 0xf6, 0x71, 0x39, + 0xff, 0xf6, 0x11, 0xaf, 0x59, 0x32, 0x6e, 0x1f, 0xb3, 0xee, 0x1c, 0x13, 0xae, 0x3f, 0x23, 0x2f, + 0xd7, 0xf5, 0xe7, 0x35, 0x18, 0xae, 0xb6, 0xdb, 0x9a, 0x2b, 0x1d, 0x0e, 0x8f, 0xd3, 0x6e, 0x73, + 0xe1, 0xc9, 0x42, 0xb9, 0xce, 0x43, 0xc6, 0x3a, 0xff, 0x1e, 0xc0, 0x22, 0x3a, 0xfc, 0xe3, 0xc0, + 0x8d, 0x21, 0x06, 0x6a, 0xf8, 0xfc, 0x19, 0x00, 0x0e, 0x9c, 0x6e, 0x01, 0x89, 0x91, 0xb9, 0x62, + 0x6f, 0xed, 0x42, 0x39, 0x3d, 0x7d, 0x5e, 0xc2, 0xd2, 0xf5, 0x47, 0x05, 0xb8, 0x24, 0x94, 0x9c, + 0xc4, 0x07, 0x7e, 0xfa, 0xd9, 0xf9, 0x36, 0x8c, 0x0b, 0xda, 0xed, 0xf8, 0x43, 0xe0, 0x57, 0xc0, + 0x72, 0x31, 0xe6, 0x2b, 0xba, 0x81, 0x46, 0xde, 0x86, 0x11, 0xfc, 0x23, 0xbe, 0x06, 0x61, 0x92, + 0x19, 0x45, 0xd4, 0x7a, 0xf2, 0x32, 0x44, 0xa1, 0x5a, 0x5f, 0xc1, 0xe5, 0xbc, 0x86, 0xbf, 0x04, + 0xb9, 0xfc, 0xdb, 0x02, 0x5c, 0x10, 0xec, 0x8d, 0xa5, 0xe2, 0x85, 0x76, 0x9d, 0x53, 0x38, 0xe0, + 0x3e, 0x80, 0x31, 0x56, 0xa1, 0x6c, 0x77, 0xbf, 0xd8, 0x5a, 0xc5, 0xc9, 0x21, 0x2e, 0x59, 0x72, + 0x22, 0x47, 0x38, 0x94, 0x38, 0x87, 0x2d, 0x69, 0xbc, 0xb0, 0x75, 0x62, 0xeb, 0x0b, 0xb8, 0x98, + 0xdd, 0x85, 0x97, 0x20, 0x9f, 0x07, 0x30, 0x97, 0xb1, 0x29, 0xbc, 0xd8, 0x9e, 0xfc, 0x39, 0x5c, + 0xc8, 0xe4, 0xf5, 0x12, 0x9a, 0xb9, 0xc2, 0x34, 0x8e, 0xe8, 0x25, 0x0c, 0xa1, 0xf5, 0x08, 0xce, + 0x67, 0x70, 0x7a, 0x09, 0x4d, 0xbc, 0x0f, 0xb3, 0x4a, 0xd3, 0xfe, 0x46, 0x2d, 0x5c, 0x87, 0x4b, + 0x9c, 0xd1, 0xcb, 0x19, 0x95, 0x87, 0x70, 0x41, 0xb0, 0x7b, 0x09, 0xd2, 0x5b, 0x81, 0x8b, 0xf1, + 0x81, 0x3a, 0x43, 0x4f, 0x3a, 0xf1, 0x22, 0x63, 0xad, 0xc1, 0x95, 0x98, 0x53, 0x8e, 0xd2, 0x70, + 0x72, 0x6e, 0x5c, 0x1d, 0x8c, 0x47, 0xe9, 0xa5, 0x8c, 0xe8, 0x23, 0x38, 0x67, 0x30, 0x7d, 0x69, + 0xaa, 0xd2, 0x2a, 0x4c, 0x71, 0xc6, 0xa6, 0xea, 0x3c, 0xaf, 0xab, 0xce, 0x63, 0xf3, 0x67, 0x63, + 0x96, 0x08, 0xde, 0xbd, 0x9b, 0xa1, 0x4d, 0xaf, 0xa3, 0x36, 0x2d, 0x51, 0xe2, 0x16, 0xbe, 0x0d, + 0x43, 0x1c, 0x22, 0xda, 0x97, 0xc1, 0x8c, 0x1f, 0x16, 0x38, 0x99, 0x40, 0xb6, 0x7e, 0x00, 0x97, + 0xf8, 0x49, 0x34, 0xbe, 0x4b, 0x34, 0x4f, 0x8b, 0xdf, 0x4f, 0x1c, 0x44, 0xcf, 0x0b, 0xbe, 0x49, + 0xfc, 0x9c, 0xf3, 0xe8, 0x9e, 0x9c, 0xdb, 0x79, 0xfc, 0x4f, 0xf4, 0x18, 0x4b, 0x1e, 0x30, 0x8b, + 0x99, 0x07, 0xcc, 0x6b, 0x70, 0x55, 0x1d, 0x30, 0x93, 0xd5, 0xc8, 0xa9, 0x65, 0x7d, 0x01, 0x17, + 0x78, 0x47, 0xa5, 0x93, 0x9c, 0xd9, 0x8c, 0x0f, 0x12, 0xdd, 0x9c, 0x15, 0xdd, 0x34, 0xb1, 0x73, + 0x3a, 0xf9, 0x77, 0x0b, 0xf2, 0x93, 0xcb, 0x66, 0xfe, 0x8b, 0x3e, 0x71, 0x6f, 0x40, 0x45, 0x09, + 0xc4, 0x6c, 0xd1, 0x8b, 0x1d, 0xb7, 0xd7, 0x61, 0x46, 0x67, 0xe3, 0x36, 0xe8, 0xee, 0x1d, 0xbc, + 0xe4, 0x79, 0x8b, 0x7d, 0x16, 0x08, 0x90, 0xd3, 0xae, 0x9c, 0x21, 0x37, 0xc4, 0xb7, 0x15, 0xa6, + 0x55, 0x87, 0x8b, 0xe9, 0xa1, 0x70, 0x1b, 0xd2, 0x43, 0x9e, 0x7c, 0xcc, 0x3e, 0x61, 0x84, 0x88, + 0xc1, 0xc8, 0x65, 0x2a, 0xbf, 0x63, 0x4e, 0x2e, 0xa9, 0x2c, 0x4b, 0x2e, 0x35, 0x89, 0xfe, 0xb3, + 0xda, 0xe5, 0x7c, 0xf8, 0x55, 0x20, 0xb2, 0x68, 0xb1, 0x66, 0xcb, 0xaa, 0xcf, 0x43, 0xff, 0x62, + 0xcd, 0x16, 0x4f, 0x73, 0x50, 0x13, 0x6c, 0x84, 0x81, 0xcd, 0x60, 0x49, 0x8d, 0xbc, 0x78, 0x02, + 0x8d, 0xfc, 0xc1, 0xc0, 0x48, 0x7f, 0x69, 0xc0, 0x26, 0x35, 0x77, 0xdf, 0x7b, 0xe4, 0x46, 0x07, + 0xaa, 0xc2, 0xaa, 0xf5, 0x25, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, 0xb8, 0xeb, 0x9b, 0x22, 0xa6, 0xcf, + 0x2e, 0x56, 0xd1, 0x89, 0x04, 0x4d, 0x16, 0xe3, 0x7c, 0xbd, 0x69, 0x38, 0x75, 0x7c, 0xb0, 0x6a, + 0xcb, 0x42, 0xeb, 0x9f, 0x0e, 0x68, 0xdc, 0xb5, 0x97, 0x5a, 0x5d, 0x7a, 0x77, 0x07, 0x80, 0xcf, + 0x10, 0xad, 0x73, 0x4c, 0x01, 0x1c, 0x13, 0xbe, 0x19, 0x7c, 0x49, 0xb6, 0x35, 0xa4, 0x93, 0xbe, + 0xe4, 0x12, 0x1e, 0xb5, 0x9c, 0x48, 0x3e, 0x5e, 0x54, 0x1e, 0xb5, 0x82, 0x75, 0x68, 0xeb, 0x48, + 0xe4, 0x07, 0xc9, 0xe7, 0x06, 0x83, 0x78, 0xa7, 0xf4, 0x8a, 0xbc, 0x64, 0x4e, 0xf7, 0xed, 0x74, + 0x2f, 0x0e, 0x9e, 0xc1, 0x0c, 0xa3, 0x75, 0x1f, 0xe3, 0xc1, 0x62, 0xf9, 0xeb, 0x88, 0x7a, 0x7c, + 0x6d, 0x1f, 0xc2, 0x7a, 0x5e, 0xed, 0x52, 0x4f, 0x8c, 0x2c, 0xec, 0xef, 0x31, 0x9f, 0x3a, 0x55, + 0x65, 0x76, 0x36, 0x7f, 0x9c, 0x44, 0xf6, 0xda, 0xb2, 0xd7, 0x6c, 0xfb, 0xae, 0x3a, 0x30, 0xf1, + 0x49, 0x14, 0xb4, 0xea, 0x54, 0xc0, 0x6d, 0x1d, 0xc9, 0x7a, 0xad, 0xab, 0x9f, 0xf6, 0x08, 0x0c, + 0x6c, 0x2f, 0x6e, 0xaf, 0x95, 0x0a, 0xd6, 0x2d, 0x00, 0xad, 0x26, 0x80, 0xa1, 0x8d, 0x4d, 0x7b, + 0xbd, 0xba, 0x56, 0xea, 0x23, 0x33, 0x70, 0xf6, 0xd1, 0xea, 0xc6, 0xd2, 0xe6, 0xa3, 0x5a, 0xbd, + 0xb6, 0x5e, 0xb5, 0xb7, 0x17, 0xab, 0xf6, 0x52, 0xa9, 0x60, 0x7d, 0x05, 0xd3, 0x66, 0x0f, 0x5f, + 0xea, 0x24, 0x8c, 0x60, 0x4a, 0xe9, 0x33, 0x0f, 0x1e, 0x6d, 0x6b, 0xfe, 0x9b, 0xe2, 0xf0, 0x97, + 0xf4, 0x43, 0x12, 0xc7, 0x44, 0xf1, 0x19, 0x69, 0x48, 0xe4, 0x0d, 0xae, 0x16, 0x24, 0xdf, 0xe2, + 0x32, 0xb5, 0xa0, 0x1e, 0xeb, 0x05, 0xb8, 0xf4, 0x7d, 0x0f, 0xa6, 0xcd, 0x5a, 0x4f, 0x6a, 0xa5, + 0x7a, 0x05, 0x1d, 0x5b, 0xb5, 0x87, 0x3a, 0x84, 0xe8, 0xd7, 0x06, 0x62, 0x65, 0xfd, 0x1e, 0x94, + 0x04, 0x56, 0xbc, 0xf3, 0x5e, 0x93, 0x66, 0xc4, 0x42, 0xc6, 0xb3, 0x42, 0xe9, 0x66, 0xed, 0x43, + 0x89, 0xad, 0x98, 0x82, 0x92, 0x57, 0x30, 0x0d, 0x83, 0x6b, 0xf1, 0x75, 0x8e, 0xcd, 0x7f, 0xe0, + 0x7b, 0x95, 0xc8, 0x09, 0x22, 0xe9, 0xf5, 0x35, 0x6a, 0xab, 0xdf, 0xe4, 0x0d, 0x18, 0xba, 0xe7, + 0xb6, 0x22, 0x61, 0x1a, 0x89, 0x37, 0x79, 0xc6, 0x96, 0x17, 0xd8, 0x02, 0xc1, 0xb2, 0xe1, 0xac, + 0x56, 0xe1, 0x29, 0x9a, 0x4a, 0xca, 0x30, 0xbc, 0x41, 0xbf, 0xd6, 0xea, 0x97, 0x3f, 0xad, 0x77, + 0xe0, 0xac, 0xf0, 0xa8, 0xd3, 0xc4, 0x74, 0x55, 0xbc, 0x7e, 0x2e, 0x18, 0x4f, 0x30, 0x05, 0x4b, + 0x2c, 0x62, 0x74, 0x3b, 0xed, 0xe6, 0x0b, 0xd2, 0xb1, 0x8d, 0xe2, 0x94, 0x74, 0xaf, 0xcb, 0x5b, + 0xa0, 0x5e, 0xc3, 0xf9, 0x27, 0x05, 0x28, 0x27, 0xac, 0x0c, 0x8b, 0x07, 0x4e, 0xab, 0x45, 0xbd, + 0x7d, 0x4a, 0xae, 0xc3, 0xc0, 0xf6, 0xe6, 0xf6, 0x96, 0xb0, 0x92, 0x4a, 0x07, 0x00, 0x06, 0x52, + 0x38, 0x36, 0x62, 0x90, 0x87, 0x70, 0x56, 0xfa, 0xcc, 0xaa, 0x22, 0x31, 0x42, 0x97, 0xba, 0x7b, + 0xe0, 0xa6, 0xe9, 0xc8, 0x5b, 0xc2, 0x24, 0xf2, 0xa3, 0x8e, 0x1b, 0xd0, 0x26, 0x5a, 0x7e, 0xe2, + 0xdb, 0x74, 0xad, 0xc4, 0xd6, 0xd1, 0xf8, 0x5b, 0x55, 0xeb, 0x77, 0x0a, 0x30, 0x9b, 0x63, 0x35, + 0x21, 0x6f, 0x18, 0xdd, 0x99, 0xd2, 0xba, 0x23, 0x51, 0x56, 0xfa, 0x44, 0x7f, 0x16, 0x35, 0x47, + 0xe2, 0xfe, 0x53, 0x38, 0x12, 0xaf, 0xf4, 0xc5, 0xce, 0xc3, 0x0b, 0x00, 0x23, 0x12, 0x6e, 0x9d, + 0x81, 0x09, 0x43, 0x6e, 0x96, 0x05, 0xe3, 0x7a, 0xcd, 0x6c, 0x70, 0x16, 0xfd, 0xa6, 0x1a, 0x1c, + 0xf6, 0xb7, 0xf5, 0xdb, 0x05, 0x98, 0xc6, 0x2e, 0xee, 0xbb, 0x6c, 0xe9, 0x8b, 0x25, 0x34, 0x6f, + 0xf4, 0xe4, 0xa2, 0xd1, 0x93, 0x04, 0xae, 0xea, 0xd2, 0xfb, 0xa9, 0x2e, 0x5d, 0xcc, 0xea, 0x12, + 0x4e, 0x6f, 0xd7, 0xf7, 0x8c, 0x9e, 0x68, 0x57, 0x51, 0xbf, 0x5b, 0x80, 0x29, 0xad, 0x4d, 0xaa, + 0xfd, 0x77, 0x8c, 0x26, 0x5d, 0xc8, 0x68, 0x52, 0x4a, 0xc8, 0x0b, 0xa9, 0x16, 0xbd, 0xd2, 0xad, + 0x45, 0x3d, 0x65, 0xfc, 0xdf, 0x0b, 0x30, 0x93, 0x29, 0x03, 0x72, 0x8e, 0xe9, 0xb6, 0x8d, 0x80, + 0x46, 0x42, 0xbc, 0xe2, 0x17, 0x83, 0xaf, 0x86, 0x61, 0x87, 0x06, 0xe2, 0x3b, 0x17, 0xbf, 0xc8, + 0x2b, 0x30, 0xb1, 0x45, 0x03, 0xd7, 0x6f, 0x72, 0x17, 0x73, 0xee, 0xbb, 0x39, 0x61, 0x9b, 0x40, + 0x72, 0x11, 0x46, 0xab, 0xad, 0x7d, 0x3f, 0x70, 0xa3, 0x03, 0x7e, 0x1b, 0x38, 0x6a, 0xc7, 0x00, + 0xc6, 0x7b, 0xc9, 0xdd, 0xe7, 0x97, 0x1a, 0x8c, 0x58, 0xfc, 0x62, 0x8b, 0x8b, 0xb4, 0x16, 0x0e, + 0xf1, 0xc5, 0x45, 0x9a, 0x02, 0xcf, 0xc1, 0xd0, 0xa7, 0x36, 0x4e, 0x02, 0x8c, 0x10, 0x60, 0x8b, + 0x5f, 0x64, 0x12, 0x9d, 0x84, 0xf1, 0x55, 0x02, 0x3a, 0x07, 0xbf, 0x0f, 0xd3, 0x59, 0x72, 0xcd, + 0x9a, 0x42, 0x82, 0xb6, 0xa8, 0x68, 0xbf, 0x80, 0xa9, 0x6a, 0xb3, 0xb9, 0x7e, 0xaf, 0xca, 0x7d, + 0x0e, 0xc4, 0xa8, 0xf2, 0x8f, 0x87, 0xdb, 0xeb, 0x84, 0xca, 0x36, 0xb0, 0xea, 0xb9, 0x91, 0x3d, + 0xb5, 0xfc, 0xb5, 0x1b, 0x46, 0xae, 0xb7, 0xaf, 0x19, 0x15, 0xed, 0x73, 0x1b, 0xf4, 0x59, 0xc6, + 0x14, 0x60, 0xbb, 0xa9, 0xc9, 0x9b, 0xc3, 0x33, 0x98, 0x4f, 0x6b, 0x6c, 0xe3, 0xa5, 0x64, 0xd6, + 0xe4, 0x1b, 0x17, 0xf4, 0x57, 0x1b, 0x4f, 0xac, 0xef, 0xc1, 0x39, 0xbe, 0xa4, 0x75, 0x6b, 0xbc, + 0x68, 0xb6, 0x6e, 0x03, 0xb5, 0xde, 0x95, 0x56, 0x8a, 0xae, 0x2d, 0xb3, 0xc7, 0x8d, 0xb6, 0x60, + 0x95, 0xff, 0xa3, 0x00, 0x73, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, 0xd7, 0xd3, 0xd7, 0x92, 0x4e, + 0xd8, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x54, 0x7e, 0xd8, 0xe4, 0x16, 0x00, 0x27, 0xd6, 0xb6, + 0x6f, 0x34, 0x7d, 0x0b, 0x27, 0x1b, 0xdc, 0xc0, 0x35, 0x14, 0xd2, 0x81, 0x2c, 0xb9, 0x8b, 0x6f, + 0xa4, 0x97, 0x6d, 0x18, 0xa3, 0x62, 0x50, 0x41, 0x5e, 0xcf, 0x31, 0x12, 0x67, 0xf1, 0xb7, 0xfe, + 0x5e, 0x3f, 0xcc, 0xea, 0x03, 0xf8, 0x22, 0x7d, 0xdd, 0x82, 0xb1, 0x45, 0xdf, 0x8b, 0xe8, 0xd7, + 0x91, 0x16, 0x95, 0x80, 0xa8, 0x9b, 0x76, 0x55, 0x22, 0x54, 0x47, 0x0e, 0xa8, 0x33, 0x3d, 0xc6, + 0x70, 0x16, 0x8c, 0x11, 0xc9, 0x22, 0x4c, 0x6c, 0xd0, 0x67, 0x29, 0x01, 0xa2, 0xc3, 0xa2, 0x47, + 0x9f, 0xd5, 0x35, 0x21, 0xea, 0x5e, 0x64, 0x06, 0x0d, 0xd9, 0x83, 0x49, 0x39, 0xb9, 0x0c, 0x61, + 0xce, 0xe9, 0xbb, 0x8a, 0x39, 0x9d, 0xf9, 0xab, 0x7d, 0x56, 0x43, 0x8e, 0x0c, 0x13, 0x1c, 0x59, + 0xd7, 0x79, 0x8d, 0xfc, 0x21, 0xba, 0xb9, 0x6d, 0x69, 0x25, 0x86, 0x3b, 0x68, 0xf2, 0x01, 0xba, + 0xce, 0xc2, 0xda, 0x82, 0x72, 0x7a, 0x3c, 0x44, 0x6d, 0x6f, 0xc1, 0x10, 0x87, 0x0a, 0x35, 0x40, + 0x06, 0x9c, 0x51, 0xd8, 0xfc, 0x9c, 0xce, 0xab, 0xb1, 0x05, 0xae, 0xb5, 0x82, 0xb6, 0x13, 0x85, + 0xa3, 0x14, 0xb1, 0xdb, 0xc9, 0xe1, 0x45, 0x4f, 0x5b, 0x39, 0xbc, 0xba, 0x9f, 0x89, 0x7c, 0x5c, + 0xb0, 0x88, 0xe6, 0x27, 0x9d, 0x93, 0x68, 0xd8, 0x0d, 0x18, 0x16, 0xa0, 0x44, 0x28, 0x9c, 0xf8, + 0xf3, 0x93, 0x08, 0xd6, 0xfb, 0x70, 0x1e, 0x6d, 0x61, 0xae, 0xb7, 0xdf, 0xa2, 0x3b, 0xa1, 0xf1, + 0x3c, 0xa0, 0xd7, 0x67, 0xfd, 0x21, 0xcc, 0x65, 0xd1, 0xf6, 0xfc, 0xb2, 0x79, 0x70, 0x8a, 0x3f, + 0x2f, 0xc2, 0xf4, 0x6a, 0xa8, 0x2b, 0x13, 0x2a, 0x40, 0x45, 0x46, 0xd0, 0x04, 0x94, 0xc9, 0x4a, + 0x5f, 0x56, 0x50, 0x84, 0xb7, 0xb4, 0xc7, 0x89, 0xc5, 0x6e, 0xd1, 0x10, 0xd8, 0xb6, 0xa5, 0x9e, + 0x27, 0xbe, 0x06, 0x03, 0x1b, 0x6c, 0xa9, 0xee, 0x17, 0x63, 0xc7, 0x29, 0x18, 0x08, 0x1f, 0x07, + 0xb2, 0x2d, 0x92, 0xfd, 0x20, 0xf7, 0x52, 0x4f, 0x10, 0x07, 0x7a, 0xbf, 0xf6, 0x5f, 0xe9, 0x4b, + 0xbd, 0x46, 0x7c, 0x07, 0xc6, 0xaa, 0xcd, 0x43, 0xee, 0x11, 0xe8, 0x7b, 0x89, 0xcf, 0x52, 0x2b, + 0x59, 0xe9, 0xb3, 0x75, 0x44, 0x76, 0xc2, 0xad, 0xb6, 0xdb, 0xb8, 0x51, 0x65, 0x45, 0x40, 0x58, + 0xe9, 0x43, 0x07, 0xfb, 0x85, 0x11, 0x18, 0xda, 0x76, 0x82, 0x7d, 0x1a, 0x59, 0x5f, 0xc0, 0x9c, + 0x70, 0x52, 0xe1, 0x96, 0x3f, 0x74, 0x65, 0x09, 0x63, 0x3f, 0xa4, 0x6e, 0x8e, 0x25, 0x97, 0x01, + 0x50, 0xcf, 0x5f, 0xf5, 0x9a, 0xf4, 0x6b, 0xe1, 0x25, 0xa7, 0x41, 0xac, 0xb7, 0x61, 0x54, 0x49, + 0x08, 0x95, 0x59, 0x6d, 0xb3, 0x43, 0x69, 0x4d, 0x1b, 0x6f, 0x2e, 0xe5, 0x43, 0xcb, 0xf3, 0x46, + 0xdf, 0x45, 0x4c, 0x13, 0xae, 0xfd, 0xba, 0x30, 0x93, 0x98, 0x04, 0xf1, 0x93, 0x79, 0xa5, 0x7f, + 0x72, 0x37, 0x3e, 0xf5, 0x3b, 0xa9, 0x9e, 0x16, 0x4f, 0xa4, 0x9e, 0x5a, 0xff, 0xa2, 0x88, 0x07, + 0xa7, 0x94, 0x3c, 0x12, 0x36, 0x28, 0xdd, 0x0e, 0xb6, 0x00, 0xa3, 0xd8, 0xfb, 0x25, 0xf9, 0xf4, + 0xab, 0xbb, 0x8f, 0xc5, 0xc8, 0x4f, 0x8f, 0x2a, 0x7d, 0xe8, 0x58, 0x11, 0x93, 0x91, 0x8f, 0x60, + 0x78, 0xd9, 0x6b, 0x22, 0x87, 0xfe, 0x53, 0x70, 0x90, 0x44, 0x6c, 0x4c, 0xb0, 0xc9, 0xdb, 0xec, + 0x13, 0xe6, 0xa6, 0x0b, 0x5b, 0x83, 0xc4, 0x27, 0xb8, 0xc1, 0xbc, 0x13, 0xdc, 0x50, 0xe2, 0x04, + 0x67, 0xc1, 0xe0, 0x66, 0xd0, 0x14, 0x91, 0x48, 0x26, 0xe7, 0xc7, 0x85, 0xe0, 0x10, 0x66, 0xf3, + 0x22, 0xeb, 0x7f, 0x15, 0x60, 0xf6, 0x3e, 0x8d, 0x32, 0xe7, 0x90, 0x21, 0x95, 0xc2, 0x37, 0x96, + 0x4a, 0xf1, 0x45, 0xa4, 0xa2, 0x7a, 0xdd, 0x9f, 0xd7, 0xeb, 0x81, 0xbc, 0x5e, 0x0f, 0xe6, 0xf7, + 0xfa, 0x3e, 0x0c, 0xf1, 0xae, 0xb2, 0x53, 0xea, 0x6a, 0x44, 0x0f, 0xe3, 0x53, 0xaa, 0xee, 0x21, + 0x66, 0xf3, 0x32, 0xa6, 0x48, 0xae, 0x39, 0xa1, 0x7e, 0x4a, 0x15, 0x3f, 0xad, 0x1f, 0xe2, 0xa3, + 0xd1, 0x35, 0xbf, 0xf1, 0x44, 0xb3, 0x76, 0x0e, 0xf3, 0x2f, 0x34, 0x69, 0x1d, 0x67, 0x58, 0xbc, + 0xc4, 0x96, 0x18, 0xe4, 0x0a, 0x8c, 0xad, 0x7a, 0xf7, 0xfc, 0xa0, 0x41, 0x37, 0xbd, 0x16, 0xe7, + 0x3e, 0x62, 0xeb, 0x20, 0x61, 0x05, 0x10, 0x35, 0xc4, 0x47, 0x6b, 0x04, 0x24, 0x8e, 0xd6, 0x0c, + 0xb6, 0x3b, 0x6f, 0xf3, 0x32, 0x61, 0x64, 0x60, 0x7f, 0x77, 0x3b, 0x95, 0xaa, 0xe3, 0x6b, 0x2f, + 0xc4, 0x3d, 0x38, 0x6f, 0xd3, 0x76, 0xcb, 0x61, 0x3a, 0xdd, 0xa1, 0xcf, 0xf1, 0x55, 0x9f, 0xaf, + 0x64, 0x3c, 0xf8, 0x32, 0xfd, 0x05, 0x54, 0x93, 0x8b, 0x5d, 0x9a, 0x7c, 0x08, 0x57, 0xef, 0xd3, + 0xc8, 0x5c, 0x50, 0x63, 0x5b, 0xaa, 0xe8, 0xfc, 0x0a, 0x8c, 0x84, 0xa6, 0x1d, 0xf8, 0xb2, 0xbc, + 0x7e, 0xc8, 0x22, 0xdc, 0xbd, 0x2b, 0x6f, 0x4a, 0x04, 0x1f, 0xf5, 0x97, 0xf5, 0x31, 0x54, 0xf2, + 0xaa, 0x3b, 0x99, 0x3b, 0xa7, 0x0b, 0x57, 0xf2, 0x19, 0x88, 0xe6, 0x2e, 0x83, 0xb4, 0x19, 0x8b, + 0x4f, 0xa8, 0x57, 0x6b, 0x4d, 0x33, 0xb3, 0xf8, 0xc3, 0x5a, 0x90, 0x8e, 0x6d, 0xdf, 0xa0, 0xb9, + 0x75, 0xbc, 0x8e, 0x35, 0x19, 0xc4, 0x72, 0xad, 0xc2, 0x88, 0x84, 0x09, 0xb9, 0xce, 0x66, 0xb6, + 0x54, 0x0a, 0xb4, 0x29, 0x19, 0x28, 0x32, 0xeb, 0x87, 0xf2, 0x6a, 0xc2, 0xa4, 0x38, 0xd9, 0x0b, + 0xc8, 0x93, 0xdc, 0x45, 0x58, 0x3e, 0x9c, 0x37, 0x79, 0xeb, 0x26, 0xe7, 0x92, 0x66, 0x72, 0xe6, + 0x96, 0xe6, 0x2b, 0xa6, 0x09, 0xb4, 0x28, 0xe6, 0x65, 0x0c, 0x22, 0x97, 0x75, 0xc3, 0xf2, 0x78, + 0xfa, 0x49, 0xe5, 0x6d, 0x98, 0xcb, 0xaa, 0x50, 0x3b, 0x07, 0x2a, 0xeb, 0xa5, 0xd0, 0x77, 0x96, + 0xe0, 0xb2, 0x8c, 0x05, 0xe4, 0xfb, 0x51, 0x18, 0x05, 0x4e, 0xbb, 0xd6, 0x08, 0xdc, 0x76, 0x4c, + 0x65, 0xc1, 0x10, 0x87, 0x08, 0x49, 0xf0, 0x6b, 0x1e, 0x8e, 0x23, 0x4a, 0xac, 0x5f, 0x2f, 0x80, + 0x65, 0xf8, 0x20, 0xe1, 0x38, 0x6f, 0x05, 0xfe, 0x53, 0xb7, 0xa9, 0x5d, 0xad, 0xbc, 0x61, 0x98, + 0xf5, 0xf8, 0x93, 0xb8, 0xa4, 0xfb, 0xb3, 0x58, 0x33, 0x6f, 0x27, 0x4c, 0x6d, 0x5c, 0xf1, 0x44, + 0xbf, 0x24, 0x33, 0xe8, 0x8a, 0x32, 0xc1, 0xfd, 0x9f, 0x02, 0x5c, 0xeb, 0xda, 0x06, 0xd1, 0x9f, + 0x3d, 0x28, 0x25, 0xcb, 0xc4, 0x0c, 0xaa, 0x68, 0x3e, 0x09, 0x69, 0x0e, 0xbb, 0x77, 0xb8, 0x8f, + 0xb5, 0xf4, 0xdd, 0x69, 0x2b, 0xce, 0x29, 0x7e, 0xa7, 0x6f, 0x3d, 0x79, 0x0f, 0x60, 0xdb, 0x8f, + 0x9c, 0xd6, 0x22, 0x1a, 0x00, 0xfa, 0x63, 0x7f, 0xf9, 0x88, 0x41, 0xeb, 0xc9, 0x20, 0x05, 0x1a, + 0xb2, 0xf5, 0x09, 0x7e, 0xd7, 0xd9, 0x8d, 0x3e, 0xd9, 0xa7, 0xb6, 0x08, 0xd7, 0x12, 0xf7, 0xe2, + 0x2f, 0xc0, 0x24, 0x82, 0x19, 0x26, 0x7e, 0xa6, 0x7b, 0xdf, 0x0f, 0xfc, 0x4e, 0xfb, 0x17, 0x33, + 0xea, 0x7f, 0x5c, 0xe0, 0x8e, 0x8a, 0x7a, 0xb5, 0x62, 0xa0, 0x17, 0x01, 0x62, 0x68, 0xc2, 0x61, + 0x5d, 0x15, 0xec, 0xde, 0xe1, 0x47, 0x6e, 0xb4, 0x98, 0xef, 0x73, 0x06, 0x1a, 0xd9, 0x2f, 0x76, + 0x24, 0xef, 0xe2, 0x65, 0xb8, 0xaa, 0xfd, 0x64, 0x72, 0x7f, 0x47, 0xda, 0x3f, 0x4e, 0x49, 0x77, + 0x00, 0xd3, 0x6c, 0x05, 0xa8, 0x76, 0xa2, 0x03, 0x3f, 0x70, 0x23, 0xf9, 0xf4, 0x82, 0x6c, 0x89, + 0xb7, 0xdd, 0x9c, 0xea, 0xc3, 0x9f, 0x1f, 0x55, 0xde, 0x3d, 0x4d, 0x94, 0x46, 0xc9, 0x73, 0x5b, + 0xbd, 0x07, 0xb7, 0x66, 0xa1, 0x7f, 0xd1, 0x5e, 0xc3, 0x05, 0xcf, 0x5e, 0x53, 0x0b, 0x9e, 0xbd, + 0x66, 0xfd, 0x65, 0x11, 0x2a, 0x3c, 0xfa, 0x04, 0xfa, 0x50, 0xc4, 0x56, 0x0b, 0xcd, 0x29, 0xe3, + 0xa4, 0x06, 0x86, 0x44, 0x74, 0x89, 0xe2, 0x49, 0xa2, 0x4b, 0xfc, 0x0a, 0xe4, 0x98, 0xac, 0x4e, + 0x60, 0x05, 0x78, 0xfd, 0xf8, 0xa8, 0x72, 0x2d, 0xb6, 0x02, 0xf0, 0xd2, 0x2c, 0x73, 0x40, 0x4e, + 0x15, 0x69, 0xfb, 0xc5, 0xc0, 0x0b, 0xd8, 0x2f, 0x6e, 0xc3, 0x30, 0x1e, 0x66, 0x56, 0xb7, 0x84, + 0x57, 0x23, 0x4e, 0x4f, 0x8c, 0x27, 0x53, 0x77, 0xf5, 0xe0, 0x6d, 0x12, 0xcd, 0xfa, 0x87, 0x45, + 0xb8, 0x92, 0x2f, 0x73, 0xd1, 0xb6, 0x25, 0x80, 0xd8, 0x7b, 0xa3, 0x9b, 0xb7, 0x08, 0x7e, 0x3b, + 0xcf, 0xe8, 0x9e, 0xf2, 0xd6, 0xd2, 0xe8, 0x98, 0xee, 0x23, 0x1f, 0xfa, 0x26, 0xae, 0x0a, 0x8c, + 0xf7, 0xbf, 0x22, 0xf6, 0xa8, 0x00, 0x19, 0xb1, 0x47, 0x05, 0x8c, 0xec, 0xc1, 0xec, 0x56, 0xe0, + 0x3e, 0x75, 0x22, 0xfa, 0x90, 0x3e, 0xe7, 0x0f, 0x61, 0x96, 0xc5, 0xeb, 0x17, 0xfe, 0x7a, 0xfb, + 0xfa, 0xf1, 0x51, 0xe5, 0x95, 0x36, 0x47, 0xc1, 0xf8, 0x52, 0xfc, 0xe9, 0x61, 0x3d, 0xfd, 0x20, + 0x26, 0x8f, 0x91, 0xf5, 0x1f, 0x0a, 0x70, 0x01, 0xd5, 0x72, 0x61, 0x76, 0x95, 0x95, 0xbf, 0x90, + 0xd3, 0xa0, 0xde, 0x41, 0x31, 0x17, 0xd1, 0x69, 0xd0, 0x78, 0x08, 0x6d, 0x1b, 0x68, 0x64, 0x15, + 0xc6, 0xc4, 0x6f, 0xfc, 0xfe, 0xfa, 0xf1, 0x40, 0x30, 0xa3, 0x2d, 0x58, 0x38, 0xd5, 0xb9, 0xa9, + 0x08, 0x27, 0xb6, 0x60, 0x86, 0xef, 0x05, 0x6d, 0x9d, 0xd6, 0xfa, 0x59, 0x11, 0x2e, 0xee, 0xd2, + 0xc0, 0x7d, 0xfc, 0x3c, 0xa7, 0x33, 0x9b, 0x30, 0x2d, 0x41, 0x3c, 0x02, 0x85, 0xf1, 0x89, 0xf1, + 0xe8, 0x83, 0xb2, 0xa9, 0x22, 0x84, 0x85, 0xfc, 0xe2, 0x32, 0x09, 0x4f, 0xe1, 0x0e, 0xf8, 0x16, + 0x8c, 0x24, 0x62, 0xc0, 0xe0, 0xf8, 0xcb, 0x2f, 0x34, 0x1e, 0xaa, 0x95, 0x3e, 0x5b, 0x61, 0x92, + 0xdf, 0xc8, 0xbf, 0xbf, 0x11, 0xa6, 0x8f, 0x5e, 0xf6, 0x4f, 0xfc, 0x60, 0xd9, 0xc7, 0xea, 0x68, + 0xa5, 0x19, 0x1f, 0xec, 0x4a, 0x9f, 0x9d, 0x57, 0xd3, 0xc2, 0x18, 0x8c, 0x56, 0xf1, 0x4e, 0x8a, + 0x9d, 0xdc, 0xff, 0x77, 0x11, 0x2e, 0xcb, 0x47, 0x2d, 0x39, 0x62, 0xfe, 0x0c, 0x66, 0x25, 0xa8, + 0xda, 0x66, 0x0a, 0x03, 0x6d, 0x9a, 0x92, 0xe6, 0x11, 0x40, 0xa5, 0xa4, 0x1d, 0x81, 0x13, 0x0b, + 0x3b, 0x8f, 0xfc, 0xe5, 0x58, 0x3f, 0x3f, 0xca, 0x8a, 0xc8, 0x83, 0x56, 0x48, 0x7d, 0xcd, 0x34, + 0x44, 0x63, 0xac, 0x9f, 0xcd, 0x94, 0xf5, 0x74, 0xe0, 0x9b, 0x5a, 0x4f, 0x57, 0xfa, 0x92, 0xf6, + 0xd3, 0x85, 0x49, 0x18, 0xdf, 0xa0, 0xcf, 0x62, 0xb9, 0xff, 0xed, 0x42, 0x22, 0xd2, 0x00, 0xd3, + 0x30, 0x78, 0xc8, 0x81, 0x42, 0x1c, 0xd4, 0x05, 0x23, 0x0d, 0xe8, 0x1a, 0x06, 0x47, 0x5d, 0x85, + 0x61, 0x7e, 0x51, 0xdb, 0x3c, 0xc1, 0x09, 0x5f, 0xbd, 0x4e, 0xe1, 0x4f, 0x06, 0x9b, 0xfc, 0xb0, + 0x2f, 0xe8, 0xad, 0x87, 0x70, 0x55, 0xf8, 0x2f, 0x9b, 0x83, 0x8f, 0x15, 0x9d, 0x72, 0xfb, 0xb2, + 0x1c, 0xb8, 0x7c, 0x9f, 0x26, 0x97, 0x1e, 0xe3, 0xf5, 0xce, 0xc7, 0x70, 0xc6, 0x80, 0x2b, 0x8e, + 0xa8, 0x95, 0xaa, 0x39, 0xa4, 0x58, 0x27, 0xb1, 0xad, 0x2b, 0x59, 0x55, 0xe8, 0x8d, 0xb5, 0x28, + 0x86, 0xf2, 0x0c, 0xe2, 0x2b, 0xb6, 0xf0, 0x14, 0xab, 0xde, 0x75, 0xed, 0xbb, 0xe6, 0x2b, 0x1e, + 0x8f, 0xf5, 0x26, 0x77, 0x5e, 0x55, 0x6a, 0x4d, 0x18, 0x77, 0x01, 0xd6, 0x24, 0x8c, 0xcb, 0xa2, + 0x16, 0x0d, 0x43, 0xeb, 0x27, 0x83, 0x60, 0x09, 0xc1, 0x66, 0xdd, 0x3e, 0x4b, 0x79, 0xec, 0xa5, + 0x1a, 0x2b, 0x36, 0xaa, 0x73, 0x7a, 0x04, 0xc9, 0xb8, 0x94, 0xcf, 0x3c, 0xd4, 0xf3, 0x1a, 0x31, + 0xd4, 0x98, 0x79, 0xa9, 0xde, 0x7f, 0x99, 0xb3, 0x4c, 0xf2, 0x8f, 0xed, 0xd5, 0xe3, 0xa3, 0xca, + 0xd5, 0x9c, 0x65, 0xd2, 0xe0, 0x9b, 0xbd, 0x64, 0xda, 0xe6, 0x95, 0x48, 0xff, 0x8b, 0x5c, 0x89, + 0xb0, 0x2f, 0x52, 0xbf, 0x14, 0xd9, 0x31, 0x65, 0x29, 0xbe, 0x47, 0x79, 0xa5, 0xad, 0x17, 0x89, + 0x07, 0xff, 0x1a, 0xc4, 0xe0, 0x6a, 0xb0, 0x21, 0x2e, 0x94, 0x34, 0x9b, 0xe5, 0xe2, 0x01, 0x6d, + 0x3c, 0x11, 0xb6, 0x62, 0x79, 0xa1, 0x9b, 0x65, 0x33, 0xe7, 0xd1, 0x84, 0xf9, 0x77, 0xce, 0x0b, + 0xea, 0x0d, 0x46, 0xaa, 0x07, 0x2c, 0x48, 0xb2, 0x25, 0x3f, 0x86, 0x29, 0x35, 0xd4, 0x09, 0xf7, + 0xa3, 0xb1, 0xf9, 0x57, 0xe2, 0xc0, 0x93, 0x87, 0x8f, 0x9d, 0x9b, 0x4f, 0xef, 0xdc, 0xcc, 0xc0, + 0xe5, 0xef, 0xe0, 0x1b, 0xb2, 0x40, 0xf3, 0x3d, 0xd2, 0x2f, 0xba, 0xb2, 0x08, 0xb5, 0xeb, 0xec, + 0x7f, 0xa0, 0x9c, 0xe5, 0x99, 0xbe, 0xe0, 0xb6, 0xa8, 0x78, 0xf5, 0x22, 0x67, 0x5f, 0xce, 0x55, + 0x5c, 0xe1, 0x5b, 0xbe, 0x8a, 0xfb, 0x83, 0xa2, 0x7c, 0x22, 0x90, 0xbe, 0x0d, 0x3d, 0xf5, 0x8d, + 0x5c, 0x66, 0x0f, 0x4e, 0xb4, 0x99, 0x66, 0x36, 0x8e, 0x2c, 0xc8, 0xfb, 0x4c, 0x15, 0x1b, 0x6a, + 0x52, 0xdd, 0x0d, 0xc4, 0x05, 0xc6, 0x15, 0x27, 0xaa, 0x2e, 0x1a, 0x55, 0xf2, 0xb2, 0xac, 0xff, + 0x9b, 0x5f, 0x96, 0xfd, 0xeb, 0x51, 0x38, 0xbb, 0xe5, 0xec, 0xbb, 0x1e, 0x5b, 0xb4, 0x6d, 0x1a, + 0xfa, 0x9d, 0xa0, 0x41, 0x49, 0x15, 0x26, 0x4d, 0xff, 0xcf, 0x1e, 0xde, 0xad, 0x6c, 0x5f, 0x32, + 0x61, 0x64, 0x1e, 0x46, 0xd5, 0x9b, 0x53, 0xb1, 0x99, 0x64, 0xbc, 0x45, 0x5d, 0xe9, 0xb3, 0x63, + 0x34, 0xf2, 0x9e, 0x71, 0xbf, 0x73, 0x46, 0x3d, 0x9f, 0x46, 0xdc, 0x79, 0xee, 0xa0, 0xe7, 0xf9, + 0x4d, 0x73, 0x43, 0xe4, 0x97, 0x18, 0x3f, 0x4c, 0x5d, 0xf9, 0x0c, 0x1a, 0x2d, 0x4e, 0xd9, 0xbd, + 0x50, 0x17, 0xc8, 0x0d, 0xe7, 0x9c, 0x71, 0x19, 0xf4, 0x05, 0x8c, 0x3d, 0xec, 0xec, 0x51, 0x79, + 0xb9, 0x35, 0x24, 0xf6, 0xc7, 0xa4, 0x57, 0xb3, 0x28, 0xdf, 0xbd, 0xcb, 0xc7, 0xe0, 0x49, 0x67, + 0x8f, 0xa6, 0xe3, 0x84, 0xb3, 0x85, 0x49, 0x63, 0x46, 0x0e, 0xa0, 0x94, 0x74, 0x40, 0x16, 0xd1, + 0xd4, 0xba, 0xb8, 0x4d, 0x63, 0x28, 0x0f, 0x2d, 0x1a, 0x39, 0x77, 0x8b, 0x34, 0x2a, 0x49, 0x71, + 0x25, 0xbf, 0x0a, 0x33, 0x99, 0x56, 0x47, 0xf5, 0x84, 0xaa, 0xbb, 0x41, 0x13, 0x17, 0xf5, 0x84, + 0xd4, 0xe4, 0x7b, 0x2d, 0xa3, 0xe6, 0xec, 0x5a, 0x48, 0x13, 0xce, 0x24, 0x1c, 0x6b, 0x45, 0xca, + 0x85, 0x7c, 0x57, 0x5d, 0xdc, 0x98, 0x64, 0xd4, 0xd2, 0xcc, 0xba, 0x92, 0x2c, 0xc9, 0x1a, 0x8c, + 0xaa, 0xe3, 0x3e, 0xbe, 0xce, 0xca, 0x36, 0x6d, 0x94, 0x8f, 0x8f, 0x2a, 0xd3, 0xb1, 0x69, 0xc3, + 0xe0, 0x19, 0x33, 0x20, 0xbf, 0x06, 0x57, 0xd5, 0x14, 0xdd, 0x0c, 0xb2, 0x8d, 0x40, 0x22, 0xda, + 0xf9, 0x8d, 0xe4, 0x0c, 0xcf, 0xc3, 0xdf, 0xbd, 0xb3, 0x50, 0x2c, 0x17, 0x56, 0xfa, 0xec, 0xde, + 0xac, 0xc9, 0x4f, 0x0a, 0x70, 0x2e, 0xa7, 0xd6, 0x71, 0xac, 0xb5, 0xa7, 0x65, 0x0e, 0x95, 0x7b, + 0x7c, 0x36, 0xe4, 0x36, 0xe3, 0xe7, 0x75, 0xd2, 0x44, 0x67, 0xf4, 0x3b, 0xa7, 0x26, 0xf2, 0x26, + 0x0c, 0xe1, 0x19, 0x39, 0x2c, 0x4f, 0xa0, 0x16, 0x89, 0x11, 0x6c, 0xf0, 0x24, 0xad, 0xef, 0x1b, + 0x02, 0x87, 0xac, 0x30, 0x6d, 0x0c, 0xf7, 0x2d, 0xa9, 0x3d, 0x89, 0x78, 0x57, 0x42, 0xa3, 0xe7, + 0x45, 0x32, 0xca, 0x85, 0x11, 0xd6, 0xde, 0x24, 0x5b, 0x00, 0x18, 0x09, 0xc4, 0xaa, 0xf4, 0x60, + 0x60, 0x64, 0xa0, 0x34, 0xc8, 0x3f, 0x1c, 0xe9, 0xb1, 0xfd, 0x9b, 0x23, 0xfc, 0x79, 0xe7, 0x8e, + 0xe7, 0x3e, 0x76, 0xe3, 0x05, 0x4c, 0xb7, 0xae, 0xc5, 0xf9, 0x65, 0x84, 0xee, 0x9b, 0x93, 0x49, + 0x46, 0x19, 0xe2, 0x8a, 0x3d, 0x0d, 0x71, 0x77, 0xb5, 0x2b, 0x2b, 0x2d, 0x44, 0x24, 0xd7, 0x71, + 0x4c, 0xc3, 0x57, 0x7c, 0x97, 0xf5, 0x15, 0x0c, 0x61, 0x54, 0x47, 0x7e, 0x1f, 0x38, 0x36, 0x7f, + 0x53, 0x2c, 0xdb, 0x5d, 0x9a, 0xcf, 0xc3, 0x40, 0x8a, 0x27, 0xdb, 0x5c, 0xe2, 0x08, 0x30, 0x24, + 0x8e, 0x10, 0xb2, 0x0d, 0x53, 0x5b, 0x01, 0x6d, 0x0a, 0xbf, 0xe1, 0x76, 0x20, 0x8c, 0x13, 0xdc, + 0xec, 0x81, 0x5b, 0x7e, 0x5b, 0x16, 0xd7, 0xa9, 0x2a, 0xd7, 0x37, 0xd4, 0x0c, 0x72, 0xb2, 0x0c, + 0x93, 0x35, 0xea, 0x04, 0x8d, 0x83, 0x87, 0xf4, 0x39, 0x53, 0x77, 0x8c, 0x94, 0x0a, 0x21, 0x96, + 0xb0, 0xfe, 0x62, 0x91, 0xee, 0xe3, 0x61, 0x12, 0x91, 0x4f, 0x60, 0xa8, 0xe6, 0x07, 0xd1, 0xc2, + 0x73, 0xb1, 0xa8, 0xc9, 0x1b, 0x23, 0x0e, 0x5c, 0x38, 0x2f, 0xd3, 0x4a, 0x84, 0x7e, 0x10, 0xd5, + 0xf7, 0x8c, 0x90, 0x48, 0x1c, 0x85, 0x3c, 0x87, 0x69, 0x73, 0x41, 0x11, 0xee, 0xac, 0x23, 0x42, + 0xcd, 0xca, 0x5a, 0xb5, 0x38, 0xca, 0xc2, 0x75, 0xc1, 0xfd, 0x4a, 0x72, 0xd9, 0x7a, 0x8c, 0xe5, + 0x7a, 0x94, 0xa2, 0x2c, 0x7a, 0xb2, 0x8e, 0xf9, 0x38, 0x78, 0x8f, 0xaa, 0x21, 0x77, 0x83, 0x1d, + 0x8d, 0x83, 0x6e, 0x75, 0x70, 0x51, 0x42, 0x49, 0x38, 0x61, 0x32, 0x89, 0x8b, 0x9d, 0x22, 0x25, + 0x5b, 0x70, 0x76, 0x27, 0xa4, 0x5b, 0x01, 0x7d, 0xea, 0xd2, 0x67, 0x92, 0x1f, 0xc4, 0x11, 0x8a, + 0x18, 0xbf, 0x36, 0x2f, 0xcd, 0x62, 0x98, 0x26, 0x26, 0xef, 0x01, 0x6c, 0xb9, 0x9e, 0x47, 0x9b, + 0x78, 0xed, 0x38, 0x86, 0xac, 0xd0, 0xa4, 0xda, 0x46, 0x68, 0xdd, 0xf7, 0x5a, 0xba, 0x48, 0x35, + 0x64, 0xb2, 0x00, 0x13, 0xab, 0x5e, 0xa3, 0xd5, 0x11, 0xee, 0x01, 0x21, 0x2e, 0x28, 0x22, 0x72, + 0x9a, 0xcb, 0x0b, 0xea, 0xa9, 0x8f, 0xdc, 0x24, 0x21, 0x0f, 0x81, 0x08, 0x80, 0x98, 0xb5, 0xce, + 0x5e, 0x8b, 0x8a, 0xcf, 0x1d, 0x4d, 0x25, 0x92, 0x11, 0x4e, 0x77, 0x23, 0x20, 0x59, 0x8a, 0x6c, + 0xee, 0x3d, 0x18, 0xd3, 0xe6, 0x7c, 0x46, 0x0c, 0x82, 0x69, 0x3d, 0x06, 0xc1, 0xa8, 0x1e, 0x6b, + 0xe0, 0x9f, 0x14, 0xe0, 0x62, 0xf6, 0xb7, 0x24, 0x14, 0xb0, 0x4d, 0x18, 0x55, 0x40, 0xf5, 0xea, + 0x44, 0xaa, 0xfe, 0x09, 0x0d, 0x88, 0x7f, 0xd0, 0x72, 0xe5, 0xd1, 0x7b, 0x1f, 0xf3, 0x78, 0x01, + 0x7b, 0xfc, 0xdf, 0x19, 0x81, 0x69, 0xf4, 0xae, 0x4e, 0xae, 0x53, 0x1f, 0x63, 0x2c, 0x11, 0x84, + 0x69, 0xe6, 0x65, 0x61, 0x69, 0xe2, 0xf0, 0x64, 0xe0, 0x2b, 0x83, 0x80, 0xbc, 0xad, 0xfb, 0x44, + 0x14, 0xb5, 0xfc, 0x1f, 0x12, 0xa8, 0x77, 0x21, 0x76, 0x96, 0x78, 0xc3, 0xb8, 0x92, 0x3f, 0xf1, + 0xa2, 0x37, 0x70, 0xd2, 0x45, 0x6f, 0x47, 0x2d, 0x7a, 0x3c, 0x46, 0xc5, 0xeb, 0xda, 0xa2, 0xf7, + 0xf2, 0x57, 0xbb, 0xa1, 0x97, 0xbd, 0xda, 0x0d, 0x7f, 0xb3, 0xd5, 0x6e, 0xe4, 0x05, 0x57, 0xbb, + 0x7b, 0x30, 0xb9, 0x41, 0x69, 0x53, 0xbb, 0x28, 0x19, 0x8d, 0x77, 0x4f, 0x8f, 0xa2, 0x09, 0x2c, + 0xeb, 0xb6, 0x24, 0x41, 0x95, 0xbb, 0x6a, 0xc2, 0x5f, 0xcf, 0xaa, 0x39, 0xf6, 0x92, 0x57, 0xcd, + 0xf1, 0x6f, 0xb2, 0x6a, 0xa6, 0x96, 0xbe, 0x89, 0x53, 0x2f, 0x7d, 0xdf, 0x64, 0xb5, 0xfa, 0x08, + 0x5d, 0x0a, 0x6b, 0xb5, 0x15, 0xe1, 0x3d, 0xa2, 0xb9, 0x6b, 0xac, 0xf8, 0xa1, 0xf4, 0xb8, 0xc6, + 0xbf, 0x19, 0x6c, 0xcb, 0x0f, 0xe4, 0x95, 0x37, 0xfe, 0x6d, 0x2d, 0xa0, 0x23, 0xa1, 0x4e, 0xaf, + 0xdc, 0xf5, 0x87, 0xc5, 0x93, 0x3d, 0xb1, 0xc6, 0x25, 0x8f, 0x51, 0xb6, 0x2c, 0xb7, 0xfe, 0xbc, + 0xc0, 0x2f, 0x25, 0xff, 0x7f, 0x5c, 0x2a, 0xbf, 0xc9, 0x45, 0xe1, 0x6f, 0xc4, 0x4f, 0xf9, 0x45, + 0xd8, 0x81, 0xc0, 0x69, 0x3c, 0x89, 0x6f, 0x6a, 0x7f, 0xc0, 0xbe, 0x73, 0xbd, 0x00, 0x03, 0xab, + 0xc6, 0x67, 0x45, 0xb3, 0x70, 0xf7, 0x8e, 0x5c, 0x00, 0x44, 0x44, 0x03, 0x0e, 0x36, 0x17, 0x00, + 0x9d, 0x00, 0x7d, 0xe5, 0xce, 0x58, 0x36, 0x7f, 0x89, 0x9e, 0xd9, 0x82, 0x77, 0xd2, 0x6f, 0xa9, + 0xf1, 0x30, 0x12, 0xbf, 0xa5, 0xd6, 0xc5, 0x18, 0xbf, 0xaa, 0xde, 0x81, 0x0b, 0x36, 0x3d, 0xf4, + 0x9f, 0xd2, 0x97, 0xcb, 0xf6, 0x4b, 0x38, 0x6f, 0x32, 0xe4, 0xaf, 0x6e, 0x78, 0x40, 0xf4, 0x8f, + 0xb2, 0xc3, 0xa8, 0x0b, 0x02, 0x1e, 0x46, 0x9d, 0x47, 0x63, 0x66, 0x7f, 0xea, 0xfb, 0x06, 0x96, + 0x59, 0x3e, 0x5c, 0x34, 0x99, 0x57, 0x9b, 0x4d, 0xcc, 0xb6, 0xd8, 0x70, 0xdb, 0x8e, 0x17, 0x91, + 0x4d, 0x18, 0xd3, 0x7e, 0x26, 0x4c, 0x05, 0x5a, 0x89, 0xd0, 0x69, 0x62, 0x80, 0x11, 0x82, 0x33, + 0x06, 0x5b, 0x14, 0x2a, 0x49, 0xf1, 0x30, 0x91, 0xe9, 0x75, 0x2e, 0xc0, 0x84, 0xf6, 0x53, 0x99, + 0x2c, 0xf1, 0xe3, 0xd7, 0x6a, 0x30, 0x05, 0x66, 0x92, 0x58, 0x0d, 0x98, 0xcb, 0x12, 0x1a, 0x46, + 0x67, 0x7a, 0x4e, 0x96, 0xe3, 0x38, 0x4f, 0xbd, 0xbd, 0xed, 0xce, 0xe4, 0xc5, 0x78, 0xb2, 0xfe, + 0xfe, 0x00, 0x5c, 0x10, 0x83, 0xf1, 0x32, 0x47, 0x9c, 0xfc, 0x10, 0xc6, 0xb4, 0x31, 0x16, 0x42, + 0xbf, 0x22, 0x43, 0x6f, 0xe6, 0xcd, 0x05, 0x6e, 0xd2, 0xe8, 0x20, 0xa0, 0x9e, 0x18, 0xee, 0x95, + 0x3e, 0x5b, 0x67, 0x49, 0x5a, 0x30, 0x69, 0x0e, 0xb4, 0xb0, 0xea, 0x5c, 0xcb, 0xac, 0xc4, 0x44, + 0x95, 0x81, 0x9c, 0x9b, 0xf5, 0xcc, 0xe1, 0x5e, 0xe9, 0xb3, 0x13, 0xbc, 0xc9, 0xd7, 0x70, 0x36, + 0x35, 0xca, 0xc2, 0x58, 0xf7, 0x5a, 0x66, 0x85, 0x29, 0x6c, 0x6e, 0x8e, 0x0d, 0x10, 0x9c, 0x5b, + 0x6d, 0xba, 0x12, 0xd2, 0x84, 0x71, 0x7d, 0xe0, 0x85, 0xd9, 0xe9, 0x6a, 0x17, 0x51, 0x72, 0x44, + 0xae, 0xdc, 0x09, 0x59, 0xe2, 0xd8, 0x3f, 0x37, 0x4d, 0xcc, 0x06, 0xf2, 0x08, 0x0c, 0xf1, 0xdf, + 0x6c, 0x09, 0xd8, 0x0a, 0x68, 0x48, 0xbd, 0x06, 0x35, 0x1c, 0xb4, 0xbf, 0xe1, 0x12, 0xf0, 0xef, + 0x0b, 0x50, 0xce, 0xe2, 0x5b, 0xa3, 0x5e, 0x93, 0x6c, 0x41, 0x29, 0x59, 0x91, 0x98, 0xd5, 0x96, + 0x8a, 0x95, 0x9b, 0xdb, 0xa4, 0x95, 0x3e, 0x3b, 0x45, 0x4d, 0x36, 0xe0, 0xac, 0x06, 0x13, 0xc6, + 0xd5, 0xe2, 0x49, 0x8c, 0xab, 0x6c, 0x14, 0x52, 0xa4, 0xba, 0x6d, 0x7a, 0x05, 0x77, 0xc6, 0x25, + 0xff, 0xd0, 0x71, 0x3d, 0xa6, 0xe8, 0x6a, 0xa1, 0x9e, 0x20, 0x86, 0x0a, 0xd9, 0x70, 0x6b, 0x2b, + 0x42, 0xe5, 0x83, 0x12, 0x85, 0x62, 0x7d, 0x88, 0x2b, 0xb8, 0xb0, 0xd1, 0xf1, 0xe7, 0xa9, 0x8a, + 0xd9, 0x15, 0x18, 0xdc, 0x5e, 0xab, 0x2d, 0x56, 0xc5, 0x63, 0x57, 0x1e, 0x22, 0xa1, 0x15, 0xd6, + 0x1b, 0x8e, 0xcd, 0x0b, 0xac, 0x0f, 0x80, 0xdc, 0xa7, 0x91, 0x08, 0xd6, 0xae, 0xe8, 0x5e, 0x85, + 0x61, 0x01, 0x12, 0x94, 0xe8, 0x1a, 0xd7, 0x12, 0x58, 0xb2, 0xcc, 0xda, 0x92, 0xe7, 0x84, 0x16, + 0x75, 0x42, 0x6d, 0x63, 0x7e, 0x17, 0x46, 0x02, 0x01, 0x13, 0xfb, 0xf2, 0xa4, 0x4a, 0x6b, 0x81, + 0x60, 0x6e, 0xcf, 0x96, 0x38, 0xb6, 0xfa, 0xcb, 0x5a, 0xc3, 0x70, 0x26, 0x9b, 0xab, 0x4b, 0x8b, + 0x4c, 0xaa, 0x42, 0x58, 0x72, 0x38, 0x6e, 0xa1, 0x0f, 0x79, 0x44, 0xf5, 0xa7, 0xae, 0x28, 0x1a, + 0xfc, 0xc8, 0x45, 0x10, 0x1f, 0x0d, 0xc5, 0xba, 0xab, 0x82, 0xa3, 0x64, 0x70, 0xcb, 0x4b, 0xcf, + 0xb0, 0x81, 0x61, 0x5f, 0xee, 0xa3, 0xbb, 0xcc, 0xcb, 0x68, 0x84, 0x03, 0x73, 0x7c, 0x9b, 0x67, + 0xbd, 0x12, 0x09, 0xe8, 0x7c, 0xb5, 0x34, 0x2e, 0xc2, 0xa8, 0x82, 0xa9, 0xbb, 0x2f, 0x2e, 0x2b, + 0x03, 0x7f, 0xf7, 0x2e, 0x7f, 0x15, 0xdc, 0x50, 0x0c, 0x62, 0x3a, 0x56, 0x05, 0xff, 0xee, 0xbe, + 0xe5, 0x2a, 0x42, 0x1a, 0x44, 0xdf, 0x6a, 0x15, 0x71, 0x5c, 0xa0, 0xd3, 0x54, 0x61, 0xe0, 0xef, + 0xce, 0x9f, 0x44, 0x50, 0xdf, 0x72, 0x15, 0x4c, 0x50, 0xdf, 0x5e, 0x15, 0x54, 0x06, 0x50, 0xe2, + 0x93, 0x34, 0x55, 0xc9, 0x72, 0xba, 0x12, 0x69, 0xb8, 0x4e, 0x50, 0x74, 0x1d, 0x0f, 0x0a, 0x17, + 0xb9, 0xb0, 0x7e, 0x01, 0xd5, 0x30, 0x81, 0x7d, 0xbb, 0xd5, 0xfc, 0xa3, 0x02, 0x0f, 0xe7, 0x54, + 0xdb, 0xd4, 0x52, 0x3f, 0x7a, 0x8f, 0x7d, 0xed, 0x6a, 0x5e, 0xfb, 0xda, 0x1f, 0xba, 0x5e, 0x53, + 0xbf, 0x9a, 0x77, 0x3a, 0xd1, 0x81, 0x0a, 0x77, 0xfc, 0xc4, 0xf5, 0x9a, 0x76, 0x12, 0x9b, 0xbc, + 0x07, 0x13, 0x1a, 0x48, 0x69, 0x6b, 0x3c, 0x67, 0x84, 0x4e, 0xee, 0x36, 0x6d, 0x13, 0xd3, 0xfa, + 0xab, 0x02, 0x4c, 0x65, 0x24, 0x25, 0x46, 0x63, 0x06, 0x9e, 0x82, 0xd4, 0x42, 0x25, 0x12, 0x26, + 0x61, 0x64, 0x09, 0x63, 0x93, 0x54, 0x88, 0x18, 0x2d, 0x5f, 0x4b, 0xa0, 0x5c, 0xd4, 0x52, 0x77, + 0x65, 0x27, 0x4d, 0xd6, 0xd1, 0x49, 0x08, 0x10, 0xb7, 0x44, 0x98, 0x8d, 0x6b, 0x4c, 0xa5, 0xd5, + 0xb2, 0x2f, 0xbf, 0x94, 0xf4, 0xcf, 0x5a, 0x35, 0xd6, 0x6f, 0x14, 0xe1, 0x5c, 0x46, 0xff, 0x6b, + 0x34, 0xfa, 0xeb, 0x10, 0x41, 0x22, 0x07, 0x76, 0xff, 0x2f, 0x28, 0x07, 0xb6, 0xf5, 0x9f, 0x8b, + 0x70, 0x6e, 0xa7, 0x1d, 0xe2, 0x0b, 0xab, 0x55, 0xef, 0x29, 0xf5, 0x22, 0x3f, 0x78, 0x8e, 0xaf, + 0x42, 0xc8, 0xdb, 0x30, 0xb8, 0x42, 0x5b, 0x2d, 0x5f, 0xcc, 0xff, 0x4b, 0xd2, 0x3b, 0x22, 0x89, + 0x8d, 0x48, 0x2b, 0x7d, 0x36, 0xc7, 0x26, 0xef, 0xc1, 0xe8, 0x0a, 0x75, 0x82, 0x68, 0x8f, 0x3a, + 0xf2, 0xc8, 0x22, 0x33, 0x59, 0x68, 0x24, 0x02, 0x61, 0xa5, 0xcf, 0x8e, 0xb1, 0xc9, 0x3c, 0x3b, + 0xcd, 0x7b, 0xfb, 0xea, 0x35, 0x79, 0x4e, 0x85, 0x0c, 0x67, 0xa5, 0xcf, 0x46, 0x5c, 0xb2, 0x0e, + 0x13, 0xd5, 0x7d, 0xea, 0x45, 0xeb, 0x34, 0x72, 0x9a, 0x4e, 0xe4, 0x08, 0xd5, 0xf6, 0xd5, 0x3c, + 0x62, 0x03, 0x79, 0xa5, 0xcf, 0x36, 0xa9, 0xc9, 0x07, 0x30, 0x7c, 0xdf, 0xf7, 0x9b, 0x7b, 0xcf, + 0xa9, 0x50, 0x57, 0x2b, 0x79, 0x8c, 0x04, 0xda, 0x4a, 0x9f, 0x2d, 0x29, 0x16, 0x06, 0xa1, 0x7f, + 0x3d, 0xdc, 0xb7, 0x8e, 0x0a, 0x50, 0x5e, 0xf2, 0x9f, 0x79, 0x99, 0x52, 0xfd, 0x9e, 0x29, 0x55, + 0xc9, 0x3e, 0x03, 0x3f, 0x21, 0xd7, 0xb7, 0x60, 0x60, 0xcb, 0xf5, 0xf6, 0x13, 0xaa, 0x60, 0x06, + 0x1d, 0xc3, 0x42, 0xf1, 0xb8, 0xde, 0x3e, 0x59, 0x93, 0x3a, 0xb8, 0xb0, 0x35, 0xf6, 0x1b, 0x8a, + 0x7f, 0x06, 0xb5, 0x8e, 0x1d, 0xeb, 0xda, 0xfc, 0xb7, 0xec, 0xe0, 0x1b, 0x30, 0x9b, 0x53, 0xaf, + 0x78, 0x1e, 0xce, 0xfa, 0x36, 0x80, 0x8a, 0xcd, 0xeb, 0x30, 0x93, 0x39, 0x7e, 0x29, 0xc4, 0x7f, + 0x9e, 0x35, 0x11, 0x79, 0xcf, 0xcb, 0x30, 0x2c, 0xb3, 0x25, 0x71, 0xdb, 0x8f, 0xfc, 0x89, 0x0f, + 0xa4, 0xe4, 0x87, 0x2a, 0x03, 0x7b, 0xc8, 0xef, 0x71, 0x57, 0x0b, 0xa4, 0xc4, 0x3f, 0xa7, 0xf7, + 0xbf, 0xc1, 0x47, 0xa3, 0x78, 0xb1, 0x3a, 0x57, 0xfc, 0x30, 0xf2, 0x94, 0xe7, 0xad, 0xad, 0x7e, + 0x93, 0x1b, 0x50, 0x92, 0xe9, 0x1c, 0x44, 0xde, 0x18, 0x91, 0xb1, 0xdb, 0x4e, 0xc1, 0xc9, 0xbb, + 0x30, 0x9b, 0x84, 0xc9, 0x5e, 0xf2, 0x17, 0x6e, 0x79, 0xc5, 0xd6, 0x9f, 0x15, 0x31, 0xd6, 0x75, + 0x97, 0x79, 0xcd, 0xa4, 0xbb, 0x59, 0x13, 0xd2, 0x2a, 0x6e, 0xd6, 0xc8, 0x45, 0x18, 0xdd, 0xac, + 0x19, 0x29, 0xa7, 0xec, 0x18, 0xc0, 0x9a, 0xcd, 0xba, 0x50, 0x0d, 0x1a, 0x07, 0x6e, 0x44, 0x1b, + 0x51, 0x27, 0x10, 0xab, 0xb0, 0x9d, 0x82, 0x13, 0x0b, 0xc6, 0xef, 0xb7, 0xdc, 0xbd, 0x86, 0x64, + 0xc6, 0x45, 0x60, 0xc0, 0xc8, 0x6b, 0x30, 0xb9, 0xea, 0x85, 0x91, 0xd3, 0x6a, 0xad, 0xd3, 0xe8, + 0xc0, 0x6f, 0x8a, 0xa4, 0x99, 0x76, 0x02, 0xca, 0xea, 0x5d, 0xf4, 0xbd, 0xc8, 0x71, 0x3d, 0x1a, + 0xd8, 0x1d, 0x2f, 0x72, 0x0f, 0xa9, 0xe8, 0x7b, 0x0a, 0x4e, 0xde, 0x82, 0x19, 0x05, 0xdb, 0x0c, + 0x1a, 0x07, 0x34, 0x8c, 0x02, 0x4c, 0x44, 0x87, 0x01, 0x7f, 0xec, 0xec, 0x42, 0xac, 0xa1, 0xe5, + 0x77, 0x9a, 0xcb, 0xde, 0x53, 0x37, 0xf0, 0x3d, 0xcc, 0x4d, 0x31, 0x22, 0x6a, 0x48, 0xc0, 0xad, + 0xdf, 0x1f, 0xc9, 0xfc, 0x6c, 0xbf, 0xc9, 0x1c, 0xfc, 0x1c, 0xc6, 0x17, 0x9d, 0xb6, 0xb3, 0xe7, + 0xb6, 0xdc, 0xc8, 0x55, 0x19, 0xbb, 0xde, 0xee, 0xf1, 0xcd, 0xcb, 0x04, 0x1f, 0xb4, 0xa9, 0x13, + 0xdb, 0x06, 0xab, 0xb9, 0xbf, 0x1c, 0x82, 0x99, 0x4c, 0x3c, 0x72, 0x5d, 0xa4, 0xf6, 0x52, 0xeb, + 0xaa, 0x48, 0x76, 0x65, 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd8, 0xa2, 0x8e, 0xd7, 0x11, 0xa9, + 0xae, 0x6c, 0x03, 0xc6, 0xc6, 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, 0x13, 0x50, 0x72, + 0x05, 0xc6, 0x18, 0x44, 0xb2, 0x1a, 0xe0, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, 0xe1, 0x37, 0xa9, + 0xc6, 0x69, 0x90, 0x73, 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x43, 0x9c, 0x93, 0x06, 0x22, + 0xaf, 0xc0, 0x44, 0xb5, 0xdd, 0xd6, 0x18, 0x61, 0x8e, 0x2b, 0xdb, 0x04, 0x92, 0xcb, 0x00, 0xd5, + 0x76, 0x5b, 0xb2, 0xc1, 0xfc, 0x55, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, 0x1a, 0x2b, 0xbc, + 0x4e, 0xb0, 0x33, 0x4a, 0x98, 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, 0x13, 0x60, 0xf2, + 0x21, 0x9c, 0x4f, 0xf8, 0x5d, 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, 0xef, 0xc0, 0xb9, + 0x44, 0xa1, 0xac, 0x0e, 0xad, 0xfa, 0x76, 0x4e, 0x29, 0x79, 0x1f, 0xca, 0x89, 0x67, 0xdb, 0x71, + 0xa5, 0x68, 0xc1, 0xb7, 0x73, 0xcb, 0xd9, 0xd7, 0x95, 0x78, 0xff, 0x25, 0xaa, 0xc4, 0xcb, 0x4a, + 0x3b, 0xbb, 0x90, 0xac, 0x40, 0x25, 0xd3, 0x97, 0x45, 0xab, 0x18, 0xf3, 0x72, 0xd9, 0xbd, 0xd0, + 0xc8, 0x02, 0x5c, 0xcc, 0x44, 0x91, 0xcd, 0xc0, 0x6c, 0x5d, 0x76, 0x57, 0x1c, 0x32, 0x0f, 0xd3, + 0xb1, 0x4f, 0x8f, 0xd6, 0x04, 0x4c, 0xd4, 0x65, 0x67, 0x96, 0x91, 0x37, 0xcd, 0xc7, 0xf9, 0xbc, + 0x32, 0xcc, 0xd3, 0x65, 0xa7, 0x0b, 0xac, 0xe3, 0x02, 0x5c, 0xcc, 0xdc, 0x28, 0xa5, 0x3e, 0x3f, + 0x97, 0x54, 0x1c, 0xb5, 0xb5, 0xe0, 0x06, 0x0c, 0xa0, 0x82, 0xcf, 0x6d, 0xc5, 0xd2, 0xd7, 0x14, + 0xe9, 0x39, 0x2b, 0x56, 0x6a, 0x23, 0x0e, 0xb9, 0xaf, 0xee, 0x06, 0xfb, 0xd1, 0x92, 0x71, 0x2b, + 0xa9, 0x40, 0x65, 0x54, 0xae, 0xdf, 0x11, 0xca, 0xdb, 0xc0, 0x6f, 0x72, 0x0d, 0xf3, 0x67, 0x05, + 0xa8, 0xf4, 0xd0, 0x0f, 0x54, 0x9f, 0x0a, 0x27, 0xe8, 0xd3, 0x03, 0xd5, 0x27, 0xfe, 0x36, 0x76, + 0xfe, 0x64, 0x3a, 0xc8, 0xcb, 0xee, 0x56, 0x07, 0x48, 0x5a, 0x0d, 0x25, 0xdf, 0x85, 0xd1, 0x5a, + 0x6d, 0xc5, 0x70, 0xe8, 0x4b, 0x5d, 0x0e, 0xc5, 0x18, 0xe4, 0xf6, 0x89, 0x3c, 0xf8, 0x34, 0xff, + 0x3d, 0x6b, 0x09, 0xca, 0x79, 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, 0x76, 0xb1, 0xc4, 0x17, + 0x16, 0x13, 0x6c, 0xbd, 0x03, 0xe7, 0x14, 0x35, 0x4f, 0xda, 0xa1, 0x3d, 0xfc, 0x17, 0xc7, 0x4e, + 0x15, 0x60, 0x20, 0x06, 0x58, 0x7f, 0x3a, 0x90, 0x22, 0xac, 0x75, 0x0e, 0x0f, 0x9d, 0xe0, 0x39, + 0xa9, 0x9a, 0x84, 0xfd, 0x3d, 0x35, 0xfd, 0x85, 0x81, 0x9f, 0x1e, 0x55, 0xfa, 0x34, 0xee, 0x6c, + 0x39, 0xc6, 0x8d, 0xdd, 0x6b, 0x50, 0x7e, 0x25, 0x55, 0xe4, 0xc1, 0x8d, 0x0c, 0x20, 0xd9, 0x85, + 0x09, 0xb1, 0x65, 0xe2, 0x6f, 0x39, 0xb5, 0x6f, 0x27, 0xa7, 0xb6, 0xd1, 0xbc, 0x9b, 0x06, 0x09, + 0x9f, 0x04, 0x26, 0x1b, 0xf2, 0x39, 0x4c, 0x4a, 0x05, 0x49, 0x30, 0xe6, 0x4e, 0x44, 0x77, 0xba, + 0x33, 0x36, 0x69, 0x38, 0xe7, 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, 0xce, 0x83, 0x27, 0x69, + 0xb2, 0x41, 0x22, 0x9a, 0x6c, 0xc0, 0xe6, 0x3e, 0x01, 0x92, 0xee, 0x57, 0xaf, 0x59, 0x3c, 0xa1, + 0xcd, 0xe2, 0xb9, 0x2a, 0x4c, 0x65, 0x74, 0xe0, 0x54, 0x2c, 0x3e, 0x01, 0x92, 0x6e, 0xe9, 0x69, + 0x38, 0x58, 0xd7, 0xe1, 0x35, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, 0xf0, 0xfc, 0xeb, 0x45, + 0xa8, 0xf4, 0x40, 0x25, 0xbf, 0x57, 0x48, 0x4a, 0x9b, 0xcf, 0xc6, 0xf7, 0x92, 0xd2, 0xce, 0xa6, + 0xcf, 0x10, 0xfb, 0xc2, 0xfb, 0x3f, 0xf9, 0x8b, 0x17, 0x56, 0xf8, 0xd3, 0x43, 0x76, 0x7a, 0x69, + 0x0d, 0xe8, 0xd2, 0xb2, 0x61, 0xda, 0x38, 0x2a, 0x9d, 0x64, 0xcf, 0xb8, 0x0c, 0x20, 0x52, 0x7c, + 0xae, 0xf9, 0xfb, 0x42, 0x3d, 0xd3, 0x20, 0xd6, 0x3d, 0x98, 0x49, 0xf0, 0x14, 0xc6, 0xf0, 0xef, + 0x82, 0x7a, 0xe0, 0x8d, 0x4c, 0xfb, 0x17, 0xce, 0xfe, 0xfc, 0xa8, 0x32, 0xc1, 0x34, 0xe9, 0x9b, + 0x71, 0xfc, 0x78, 0xf9, 0x97, 0xb5, 0xae, 0x9b, 0xf3, 0xab, 0x2d, 0x3d, 0xf0, 0x0d, 0xb9, 0x03, + 0x43, 0x1c, 0x92, 0x88, 0xd2, 0xac, 0x63, 0x8b, 0x35, 0x41, 0x20, 0x5a, 0x33, 0xf8, 0x1c, 0x15, + 0x7f, 0x54, 0xe3, 0xf0, 0x09, 0xd6, 0x0e, 0xcf, 0x5a, 0x12, 0x83, 0x55, 0x24, 0xe8, 0x81, 0x6a, + 0x1c, 0xe6, 0x41, 0xfa, 0x5e, 0x48, 0x3c, 0xcf, 0x7f, 0xd6, 0xa2, 0x4d, 0x9e, 0x11, 0x6e, 0x61, + 0x5c, 0xf8, 0x5e, 0x0c, 0x38, 0x8c, 0x01, 0x92, 0x59, 0x1f, 0xc3, 0x0c, 0xdb, 0xa0, 0x83, 0x64, + 0x7d, 0x98, 0xab, 0x80, 0xc1, 0x4c, 0x87, 0x76, 0x87, 0x81, 0xd0, 0xa1, 0x5d, 0x14, 0x5a, 0x6b, + 0x70, 0x9e, 0x1b, 0x03, 0xf5, 0x2e, 0xc5, 0xa6, 0xf7, 0x41, 0xfc, 0x9d, 0x78, 0xcc, 0x98, 0xd1, + 0x7b, 0x8e, 0x67, 0x7d, 0x84, 0xaf, 0x65, 0xc4, 0x24, 0x75, 0x7d, 0x2f, 0xb6, 0xfc, 0x9d, 0xec, + 0x79, 0xed, 0xdf, 0x84, 0x8b, 0xd5, 0x76, 0x9b, 0x7a, 0xcd, 0x98, 0x70, 0x3b, 0x70, 0x4e, 0x18, + 0xfc, 0x80, 0x54, 0x61, 0x10, 0xb1, 0xd5, 0xbd, 0xa5, 0x68, 0x6e, 0x46, 0x73, 0x10, 0x4f, 0x84, + 0xed, 0xc4, 0x0a, 0x38, 0xa5, 0xd5, 0x84, 0xd9, 0x5a, 0x67, 0xef, 0xd0, 0x8d, 0xd0, 0x0d, 0x1e, + 0x03, 0x88, 0xc8, 0xba, 0x57, 0x65, 0xa2, 0x29, 0x2e, 0x8c, 0xeb, 0xf1, 0xab, 0x0a, 0xf4, 0xa4, + 0x17, 0x41, 0x45, 0x9e, 0xde, 0xb9, 0x19, 0x93, 0xa2, 0xd5, 0x83, 0xd7, 0x82, 0xc5, 0x22, 0x19, + 0x95, 0x35, 0x05, 0x67, 0xf5, 0x3b, 0x20, 0x3e, 0x43, 0x66, 0x60, 0xca, 0xbc, 0xdb, 0xe1, 0xe0, + 0xaf, 0x60, 0x9a, 0xdb, 0x9e, 0x79, 0xd8, 0xed, 0xf9, 0x38, 0xc2, 0x74, 0x71, 0x77, 0x3e, 0xe1, + 0x7f, 0x8f, 0x6e, 0xb9, 0x2a, 0xa1, 0xc2, 0xee, 0x3c, 0x7f, 0xf1, 0xf8, 0x74, 0xde, 0xb8, 0x41, + 0x2c, 0xee, 0xce, 0x2f, 0x0c, 0x8b, 0xf0, 0xa5, 0x8c, 0x3b, 0x1f, 0xfe, 0x6f, 0x85, 0xfb, 0x3c, + 0x3e, 0xb2, 0x5f, 0xa1, 0x0e, 0x3e, 0x88, 0xc9, 0x7e, 0xaa, 0x3c, 0x09, 0x45, 0xb7, 0x29, 0x4f, + 0xeb, 0x6e, 0xd3, 0xfa, 0xa3, 0x02, 0x5c, 0xe7, 0x3a, 0x50, 0x36, 0x1d, 0x5e, 0xf4, 0xe4, 0x10, + 0x93, 0x77, 0x81, 0x67, 0x6d, 0x17, 0x8a, 0xa6, 0x25, 0x5a, 0xde, 0x8d, 0x13, 0x27, 0x20, 0x55, + 0x18, 0xd7, 0x9f, 0x94, 0x9c, 0x2c, 0x3c, 0x9c, 0x3d, 0x76, 0xf8, 0xd8, 0x51, 0xcf, 0x4c, 0x9e, + 0xc0, 0x85, 0xe5, 0xaf, 0xd9, 0x84, 0x10, 0xbb, 0x93, 0x50, 0xd8, 0xe3, 0xa7, 0xb0, 0x67, 0xb6, + 0xc5, 0x8c, 0x31, 0x4f, 0xd3, 0x49, 0x30, 0x3b, 0x9a, 0xca, 0x0d, 0x4e, 0x69, 0xcd, 0xa3, 0xb6, + 0x01, 0xb3, 0xfe, 0xb4, 0x00, 0x17, 0xb3, 0x6b, 0x13, 0x0b, 0xcb, 0x2a, 0x9c, 0x5d, 0x74, 0x3c, + 0xdf, 0x73, 0x1b, 0x4e, 0xab, 0xd6, 0x38, 0xa0, 0xcd, 0x8e, 0x0a, 0x72, 0xaa, 0x56, 0x99, 0x7d, + 0xea, 0x49, 0x72, 0x89, 0x62, 0xa7, 0xa9, 0xd8, 0xa1, 0x0c, 0x5f, 0x25, 0xf0, 0xb5, 0xb7, 0x45, + 0x03, 0xc5, 0x8f, 0xb7, 0x2c, 0xa7, 0x94, 0xdc, 0x96, 0x46, 0xf6, 0xe6, 0x8e, 0xe7, 0x46, 0x8a, + 0x88, 0x5b, 0x57, 0xb2, 0x8a, 0xac, 0xff, 0x58, 0x80, 0xf3, 0x98, 0xd7, 0xc8, 0xc8, 0x94, 0x18, + 0xc7, 0xfa, 0x95, 0xe1, 0x6a, 0x0b, 0xc6, 0x2b, 0x0b, 0x03, 0xdb, 0x8c, 0x5b, 0x4b, 0xde, 0x84, + 0x81, 0x9a, 0x74, 0x92, 0x9a, 0x4c, 0xa4, 0xa1, 0x95, 0x29, 0xff, 0xfd, 0x20, 0xb2, 0x11, 0x8b, + 0xed, 0x39, 0x4b, 0x34, 0x6c, 0x50, 0x0f, 0xf3, 0x05, 0xf3, 0xc3, 0xbe, 0x06, 0x89, 0x43, 0x15, + 0x0d, 0xe4, 0x85, 0x2a, 0x1a, 0x34, 0x43, 0x15, 0x59, 0x4f, 0x79, 0x56, 0xa3, 0x64, 0x87, 0xc4, + 0x20, 0x7d, 0x94, 0x4a, 0x2f, 0xcc, 0xf7, 0x81, 0x73, 0x59, 0x3d, 0xdb, 0xbd, 0x9b, 0xca, 0x1c, + 0x9c, 0x1f, 0x5b, 0x77, 0x0b, 0x5e, 0x31, 0x70, 0xab, 0xad, 0x96, 0xff, 0x8c, 0x36, 0xb7, 0x02, + 0xff, 0xd0, 0x8f, 0x8c, 0xac, 0x2e, 0x22, 0xbf, 0x76, 0x7c, 0x8d, 0x22, 0x66, 0x65, 0x02, 0x6c, + 0xfd, 0x0d, 0x78, 0xb5, 0x07, 0x47, 0xd1, 0xa9, 0x1a, 0x9c, 0x75, 0x12, 0x65, 0xd2, 0xdb, 0xe5, + 0xd5, 0xac, 0x7e, 0x25, 0x19, 0x85, 0x76, 0x9a, 0xfe, 0xc6, 0xb6, 0x91, 0x92, 0x97, 0x94, 0x61, + 0x7a, 0xcb, 0xde, 0x5c, 0xda, 0x59, 0xdc, 0xae, 0x6f, 0x7f, 0xbe, 0xb5, 0x5c, 0xdf, 0xd9, 0x78, + 0xb8, 0xb1, 0xf9, 0x68, 0x83, 0x07, 0xa7, 0x36, 0x4a, 0xb6, 0x97, 0xab, 0xeb, 0xa5, 0x02, 0x99, + 0x86, 0x92, 0x01, 0x5e, 0xde, 0x59, 0x28, 0x15, 0x6f, 0x7c, 0x65, 0xa4, 0x9a, 0x25, 0x17, 0xa1, + 0x5c, 0xdb, 0xd9, 0xda, 0xda, 0xb4, 0x15, 0x57, 0x3d, 0x34, 0xf6, 0x0c, 0x9c, 0x35, 0x4a, 0xef, + 0xd9, 0xcb, 0xcb, 0xa5, 0x02, 0x6b, 0x8a, 0x01, 0xde, 0xb2, 0x97, 0xd7, 0x57, 0x77, 0xd6, 0x4b, + 0xc5, 0x1b, 0x75, 0xfd, 0x69, 0x17, 0xb9, 0x00, 0xb3, 0x4b, 0xcb, 0xbb, 0xab, 0x8b, 0xcb, 0x59, + 0xbc, 0xa7, 0xa1, 0xa4, 0x17, 0x6e, 0x6f, 0x6e, 0x6f, 0x71, 0xd6, 0x3a, 0xf4, 0xd1, 0xf2, 0x42, + 0x75, 0x67, 0x7b, 0x65, 0xa3, 0xd4, 0x6f, 0x0d, 0x8c, 0x14, 0x4b, 0xc5, 0x1b, 0x3f, 0x34, 0xde, + 0x7d, 0xb1, 0xe6, 0x0b, 0xf4, 0x9d, 0x5a, 0xf5, 0x7e, 0x7e, 0x15, 0xbc, 0x74, 0xfd, 0x5e, 0xb5, + 0x54, 0x20, 0x97, 0xe0, 0xbc, 0x01, 0xdd, 0xaa, 0xd6, 0x6a, 0x8f, 0x36, 0xed, 0xa5, 0xb5, 0xe5, + 0x5a, 0xad, 0x54, 0xbc, 0xb1, 0x6b, 0x84, 0x67, 0x63, 0x35, 0xac, 0xdf, 0xab, 0xd6, 0xed, 0xe5, + 0x4f, 0x77, 0x56, 0xed, 0xe5, 0xa5, 0x74, 0x0d, 0x46, 0xe9, 0xe7, 0xcb, 0xb5, 0x52, 0x81, 0x4c, + 0xc1, 0x19, 0x03, 0xba, 0xb1, 0x59, 0x2a, 0xde, 0x78, 0x4d, 0x44, 0xf0, 0x22, 0x93, 0x00, 0x4b, + 0xcb, 0xb5, 0xc5, 0xe5, 0x8d, 0xa5, 0xd5, 0x8d, 0xfb, 0xa5, 0x3e, 0x32, 0x01, 0xa3, 0x55, 0xf5, + 0xb3, 0x70, 0xe3, 0x7d, 0x38, 0x93, 0x38, 0x51, 0x33, 0x0c, 0x75, 0x18, 0x2d, 0xf5, 0xa1, 0xf8, + 0xe5, 0x4f, 0x34, 0x6b, 0xf2, 0xc3, 0x71, 0xa9, 0x70, 0x63, 0x41, 0xa6, 0x3e, 0xd5, 0xbe, 0x73, + 0x32, 0x06, 0xc3, 0x4b, 0xcb, 0xf7, 0xaa, 0x3b, 0x6b, 0xdb, 0xa5, 0x3e, 0xf6, 0x63, 0xd1, 0x5e, + 0xae, 0x6e, 0x2f, 0x2f, 0x95, 0x0a, 0x64, 0x14, 0x06, 0x6b, 0xdb, 0xd5, 0xed, 0xe5, 0x52, 0x91, + 0x8c, 0xc0, 0xc0, 0x4e, 0x6d, 0xd9, 0x2e, 0xf5, 0xcf, 0xff, 0xbb, 0xdf, 0x2b, 0x70, 0xdb, 0x9e, + 0x7c, 0x43, 0xf4, 0x95, 0x76, 0x98, 0x14, 0x4b, 0x9e, 0xc8, 0xf3, 0x98, 0x7b, 0x72, 0x44, 0x2d, + 0x60, 0xae, 0xcb, 0x65, 0x07, 0x22, 0x5c, 0x2f, 0xdc, 0x2e, 0x10, 0x1b, 0x9d, 0x43, 0x12, 0x67, + 0x2b, 0xc5, 0x39, 0xfb, 0xf8, 0x3b, 0x77, 0xa9, 0xeb, 0x91, 0x8c, 0xfc, 0x0a, 0x58, 0x3a, 0xcf, + 0x9c, 0x13, 0xc8, 0x77, 0x4f, 0x76, 0xd2, 0x90, 0x75, 0xbe, 0x76, 0x32, 0x74, 0xf2, 0x00, 0x26, + 0x98, 0x6e, 0xae, 0xd0, 0xc8, 0x85, 0x24, 0xa1, 0x76, 0x1c, 0x98, 0xbb, 0x98, 0x5d, 0xa8, 0x52, + 0xb1, 0x8c, 0x63, 0x47, 0xf8, 0xc1, 0x3a, 0x24, 0x32, 0xca, 0x83, 0x84, 0xf0, 0x15, 0x7f, 0xee, + 0x6c, 0x02, 0xbc, 0x7b, 0xe7, 0x76, 0x81, 0xd4, 0x30, 0xc4, 0x9a, 0xa1, 0xe4, 0x13, 0xf9, 0xa8, + 0x2d, 0xad, 0xfd, 0xf3, 0xd6, 0x54, 0x54, 0xe2, 0xc4, 0x9c, 0xd3, 0xc1, 0x06, 0x90, 0xb4, 0xee, + 0x4c, 0xae, 0xc4, 0xf3, 0x20, 0x5b, 0xad, 0x9e, 0x3b, 0x97, 0xf2, 0xf9, 0x5b, 0x66, 0xda, 0x13, + 0x59, 0x86, 0x49, 0xf1, 0x84, 0x5b, 0x68, 0xf3, 0xa4, 0xdb, 0x79, 0x20, 0x97, 0xcd, 0x7d, 0x94, + 0x93, 0x3a, 0x11, 0x90, 0xb9, 0xb8, 0x1f, 0xc9, 0x63, 0xc2, 0xdc, 0x85, 0xcc, 0x32, 0xd1, 0xbf, + 0x7b, 0x30, 0x69, 0x1e, 0x2e, 0x88, 0x1c, 0xa0, 0xcc, 0x33, 0x47, 0x6e, 0x83, 0xea, 0x30, 0xbb, + 0xee, 0xb8, 0x78, 0x45, 0x21, 0x3c, 0xcb, 0xa4, 0x5f, 0x18, 0xa9, 0x74, 0x71, 0x14, 0xab, 0x51, + 0xaf, 0xa9, 0x06, 0x21, 0x2f, 0xac, 0x3a, 0x7e, 0x36, 0x35, 0xa9, 0x23, 0x9b, 0x7e, 0x75, 0xc4, + 0x32, 0x93, 0xe1, 0x66, 0xb9, 0x4a, 0xce, 0xe5, 0x79, 0xf7, 0x92, 0x75, 0x54, 0xd2, 0x13, 0x1c, + 0xb5, 0x39, 0x71, 0x6a, 0x76, 0x65, 0x0c, 0x24, 0xa0, 0x25, 0x11, 0x17, 0x85, 0x21, 0xc9, 0x11, + 0x5c, 0x2e, 0xb3, 0xdb, 0x05, 0xf2, 0x15, 0x7e, 0xd5, 0x99, 0xec, 0x1e, 0xb9, 0xd1, 0x81, 0xd0, + 0x7e, 0x2e, 0x64, 0x32, 0x10, 0x1f, 0x4a, 0x17, 0xee, 0x36, 0x4c, 0x67, 0x39, 0x14, 0x2b, 0x81, + 0x76, 0xf1, 0x36, 0xce, 0x9d, 0x05, 0x36, 0x3b, 0x6a, 0x34, 0xf3, 0x07, 0xa9, 0x8b, 0x3f, 0x6b, + 0x2e, 0xcf, 0x0f, 0x61, 0x92, 0xcd, 0x92, 0x87, 0x94, 0xb6, 0xab, 0x2d, 0xf7, 0x29, 0x0d, 0x89, + 0x8c, 0x8f, 0xab, 0x40, 0x79, 0xb4, 0xd7, 0x0b, 0xe4, 0x3b, 0x30, 0xf6, 0xc8, 0x89, 0x1a, 0x07, + 0x22, 0x4e, 0xa4, 0x0c, 0x23, 0x89, 0xb0, 0x39, 0xf9, 0x0b, 0x0b, 0x6f, 0x17, 0xc8, 0xf7, 0x61, + 0xf8, 0x3e, 0x8d, 0xf0, 0x51, 0xf1, 0x55, 0xe5, 0x5b, 0xc7, 0x6d, 0x93, 0xab, 0x9e, 0x7a, 0x39, + 0x23, 0x1b, 0x9c, 0x34, 0xa0, 0x92, 0x5b, 0x00, 0x7c, 0x41, 0x40, 0x0e, 0xc9, 0xe2, 0xb9, 0x54, + 0xb3, 0xc9, 0x7d, 0xa6, 0x3c, 0xb4, 0x68, 0x44, 0x4f, 0x5a, 0x65, 0x9e, 0x8c, 0xd6, 0x60, 0x52, + 0x65, 0xaf, 0xd9, 0xc0, 0x70, 0x1e, 0x56, 0x82, 0x59, 0x78, 0x0a, 0x6e, 0xef, 0xb3, 0xaf, 0x82, + 0xa7, 0x6e, 0xc5, 0xb8, 0x0f, 0xb8, 0x92, 0xce, 0xea, 0xc1, 0x23, 0xf4, 0x25, 0x54, 0x0a, 0x91, + 0xa3, 0x69, 0xb4, 0x2b, 0x7e, 0x18, 0x99, 0xb4, 0x0a, 0x92, 0x4d, 0xfb, 0xcb, 0x30, 0xa7, 0xd7, + 0x6b, 0x06, 0x2a, 0x8e, 0xd7, 0xdc, 0xbc, 0xf8, 0xc7, 0x73, 0x57, 0xbb, 0x60, 0x88, 0xf3, 0x5b, + 0xff, 0x6f, 0x16, 0x0b, 0xb8, 0x9c, 0x2c, 0xc1, 0x94, 0xac, 0x6b, 0xb3, 0x4d, 0xbd, 0x5a, 0x6d, + 0x05, 0x33, 0x95, 0x48, 0x4f, 0x0e, 0x0d, 0x26, 0xb9, 0x93, 0x74, 0x11, 0xdb, 0xfa, 0x8c, 0xf8, + 0x0e, 0xa4, 0x5b, 0xd4, 0x87, 0x78, 0xeb, 0xcb, 0x8c, 0xa0, 0xfb, 0x90, 0x1b, 0x95, 0x0c, 0xe5, + 0x7f, 0x77, 0x9e, 0x74, 0x39, 0x00, 0xcd, 0xe5, 0x1c, 0x21, 0x6e, 0x17, 0xc8, 0xe7, 0x40, 0xd2, + 0x47, 0x12, 0x25, 0xc2, 0xdc, 0xe3, 0x97, 0x12, 0x61, 0x97, 0xf3, 0xcc, 0x32, 0x4c, 0xa9, 0xe8, + 0x2e, 0x71, 0x39, 0xc9, 0x69, 0x4b, 0x97, 0x1d, 0x6c, 0x26, 0x83, 0xcd, 0xee, 0x7c, 0x17, 0x46, + 0x99, 0x70, 0xf2, 0x31, 0x4c, 0x89, 0xb9, 0x6f, 0xb4, 0xa7, 0xa4, 0x96, 0x31, 0x71, 0xb8, 0xc9, + 0x6d, 0xc9, 0x03, 0x98, 0xa9, 0x25, 0x04, 0xcf, 0xfd, 0xd8, 0xcf, 0x9b, 0x2c, 0x10, 0x58, 0xa3, + 0x11, 0x97, 0x7c, 0x36, 0xaf, 0x87, 0x40, 0xb8, 0x6d, 0x49, 0xb2, 0x7b, 0xea, 0xd2, 0x67, 0xe4, + 0x52, 0xa2, 0xe9, 0x0c, 0x88, 0x68, 0xb8, 0x0e, 0xe6, 0xf6, 0x6c, 0x9b, 0xe7, 0x2f, 0x46, 0xa8, + 0x71, 0x03, 0x7e, 0xc5, 0x20, 0x30, 0x2e, 0xd1, 0xc5, 0x38, 0x9e, 0xcf, 0xc5, 0x20, 0xbf, 0x86, + 0xd1, 0x59, 0xbb, 0x9f, 0xce, 0xc8, 0x77, 0xb2, 0x0e, 0xd1, 0x39, 0xe7, 0xcb, 0xb9, 0x37, 0x4f, + 0x86, 0xac, 0xce, 0xc3, 0x13, 0xf7, 0x69, 0xb4, 0xd5, 0xea, 0xec, 0xbb, 0x98, 0xd9, 0x92, 0x28, + 0xdb, 0x93, 0x02, 0x89, 0xe9, 0x2d, 0x83, 0xa2, 0xc5, 0x05, 0x35, 0xfa, 0x23, 0xb2, 0x0a, 0x25, + 0xbe, 0x8d, 0x68, 0x2c, 0x2e, 0xa5, 0x58, 0x08, 0x14, 0x27, 0x70, 0x0e, 0xc3, 0xdc, 0xd1, 0xba, + 0xc5, 0x5d, 0x8e, 0x88, 0xfc, 0xb4, 0x75, 0x3d, 0x75, 0xca, 0x80, 0xa9, 0x88, 0xf5, 0x6c, 0x44, + 0x6c, 0x1a, 0xd2, 0x48, 0x86, 0x81, 0xe1, 0x79, 0x4d, 0xaf, 0xc5, 0x3a, 0x43, 0xba, 0x34, 0x5e, + 0x41, 0x12, 0x21, 0xcb, 0x76, 0xef, 0x12, 0x95, 0xeb, 0x35, 0x83, 0xe9, 0x6b, 0x86, 0x6a, 0x73, + 0x3a, 0xbe, 0x6f, 0xe1, 0x56, 0x86, 0xa1, 0x6f, 0x66, 0xe2, 0xb6, 0xb1, 0xdf, 0x92, 0x6a, 0x42, + 0xa3, 0xda, 0x9d, 0xc7, 0x95, 0x91, 0xed, 0xb5, 0x4c, 0x13, 0xee, 0x04, 0x01, 0xf5, 0x38, 0x71, + 0x9e, 0xda, 0x92, 0x45, 0xfd, 0x11, 0xae, 0x60, 0x1a, 0x35, 0x7f, 0x6e, 0xd7, 0x8b, 0x05, 0xcf, + 0xc3, 0x73, 0xbb, 0x40, 0xde, 0x85, 0x11, 0xd1, 0x46, 0x46, 0x64, 0x34, 0x3a, 0xec, 0xd2, 0x6a, + 0xa4, 0x04, 0x2e, 0x24, 0x6c, 0xb3, 0x89, 0x93, 0x37, 0xfa, 0xbc, 0xcd, 0xef, 0xb2, 0x3d, 0xbb, + 0xf9, 0x22, 0x94, 0x8b, 0x72, 0xf3, 0x46, 0xca, 0xb2, 0x8a, 0xc4, 0x22, 0x41, 0x3d, 0x76, 0x59, + 0xce, 0x84, 0xa9, 0xdf, 0x18, 0x73, 0x50, 0x85, 0x0e, 0x53, 0xea, 0xb7, 0x01, 0xee, 0xb5, 0x65, + 0xaf, 0x42, 0xa9, 0xda, 0xc0, 0x0d, 0xa5, 0x46, 0x0f, 0x9d, 0xf6, 0x81, 0x1f, 0x50, 0x75, 0xf6, + 0x49, 0x16, 0x48, 0x5e, 0x33, 0x4a, 0x41, 0x11, 0x05, 0x6b, 0xd4, 0xc1, 0xc0, 0xcc, 0xb3, 0x4a, + 0x43, 0x49, 0x14, 0x65, 0x53, 0x74, 0x39, 0xeb, 0x4c, 0x2f, 0xb2, 0xd3, 0x59, 0xeb, 0x9b, 0xb1, + 0x79, 0x1f, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0xa9, 0x50, 0xbe, 0xbc, 0x51, + 0xa8, 0x55, 0x79, 0xf5, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, 0xc1, 0xe4, 0x32, 0x5b, + 0xd0, 0x3b, 0x4d, 0x97, 0x07, 0xa3, 0x27, 0x66, 0x74, 0xf1, 0x5c, 0xc2, 0x15, 0x99, 0xfa, 0x0a, + 0x49, 0x85, 0x05, 0x41, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0xb4, 0x64, 0x2b, 0xf2, 0x01, 0xe0, + 0x09, 0x5f, 0x98, 0x0c, 0x66, 0xb9, 0x62, 0x59, 0x6d, 0xb7, 0x5b, 0xd2, 0xb2, 0xcd, 0x6f, 0xea, + 0x5f, 0x35, 0x4e, 0xa2, 0xa9, 0x72, 0xc9, 0x3b, 0xad, 0x7b, 0x7e, 0xa6, 0xa5, 0xa2, 0xcd, 0xe1, + 0x99, 0x53, 0xde, 0x6b, 0x2e, 0xaa, 0xf0, 0xd1, 0xd5, 0x56, 0x2b, 0x45, 0x1c, 0x92, 0x37, 0x4c, + 0xee, 0x59, 0x38, 0xbd, 0x6a, 0xc0, 0x93, 0x3e, 0x57, 0xde, 0xaa, 0xed, 0x36, 0x5f, 0x2c, 0x2f, + 0xab, 0x05, 0xc3, 0x2c, 0x48, 0x9f, 0xf4, 0x93, 0xe5, 0x62, 0x6d, 0x7f, 0x80, 0xd3, 0x2c, 0xce, + 0x57, 0x4b, 0xf4, 0x73, 0x73, 0x32, 0x5d, 0xaf, 0xd2, 0xe5, 0x12, 0x85, 0x6a, 0x9f, 0x38, 0x93, + 0x48, 0xdd, 0xaf, 0x0c, 0x3c, 0xa9, 0x94, 0xfe, 0x9c, 0xdf, 0xe5, 0xbc, 0x62, 0x65, 0x70, 0x2d, + 0x25, 0x73, 0x82, 0xab, 0x2e, 0xe7, 0xe4, 0x9a, 0x57, 0x5d, 0xce, 0x4d, 0x26, 0xfe, 0x00, 0x4a, + 0xc9, 0x74, 0xc4, 0x8a, 0x69, 0x4e, 0x9e, 0xe2, 0xdc, 0x31, 0xb9, 0x07, 0xd3, 0xfa, 0x88, 0xaa, + 0x7e, 0xe7, 0xad, 0xfe, 0x79, 0x7c, 0xb6, 0x61, 0x26, 0x33, 0x7b, 0xb0, 0xda, 0x62, 0xbb, 0xe5, + 0x16, 0xce, 0xe5, 0x4a, 0xe1, 0x5c, 0x76, 0x02, 0x71, 0xf2, 0x8a, 0x69, 0x3f, 0xc8, 0x4e, 0xa7, + 0x3c, 0xf7, 0x6a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x70, 0x07, 0x4c, 0xd5, 0x71, 0x55, 0xb3, 0x28, + 0xe4, 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, 0xc4, 0xd7, 0xf2, 0x79, + 0xc6, 0x13, 0x6b, 0x57, 0x46, 0x49, 0xce, 0x95, 0x4c, 0xd7, 0x44, 0xd3, 0x5d, 0x8e, 0xa4, 0x73, + 0x6a, 0x3e, 0x9c, 0xbc, 0xc9, 0x79, 0xdc, 0x9a, 0xca, 0xfa, 0x63, 0x64, 0x81, 0x4e, 0x5a, 0x7f, + 0xb2, 0xb2, 0x57, 0x2b, 0x31, 0x74, 0xcb, 0x8f, 0xce, 0x77, 0xe3, 0x2f, 0xb9, 0x39, 0xc8, 0xac, + 0x42, 0x37, 0x07, 0x65, 0xf2, 0xbf, 0x92, 0x8f, 0xa0, 0x33, 0x77, 0xf8, 0xdd, 0x6f, 0x22, 0x8d, + 0x35, 0xd1, 0x4f, 0x5c, 0xd9, 0x29, 0xae, 0xd5, 0xdc, 0xc8, 0x44, 0xd1, 0xab, 0x78, 0x24, 0xbf, + 0xc1, 0x1c, 0x29, 0x75, 0xc9, 0xf1, 0xdd, 0x5d, 0x4d, 0xd9, 0x84, 0x72, 0x3c, 0x98, 0x89, 0x0e, + 0x9c, 0x72, 0x28, 0xa5, 0x30, 0xce, 0xe7, 0x66, 0xf6, 0x26, 0xaf, 0xa7, 0xbe, 0xf4, 0x1c, 0xc1, + 0x74, 0xad, 0x82, 0xaf, 0xe7, 0x5a, 0xd4, 0xe5, 0x0b, 0xb1, 0x2d, 0x58, 0x4f, 0x02, 0x9e, 0x5a, + 0xcf, 0x33, 0x32, 0x84, 0xdf, 0x47, 0xbd, 0x58, 0xcb, 0xf2, 0x9d, 0xdb, 0xeb, 0x4b, 0x59, 0x7c, + 0xc2, 0xf4, 0x8a, 0xab, 0xb5, 0x4b, 0xea, 0x69, 0xc9, 0x82, 0xd3, 0xac, 0xb8, 0x27, 0x69, 0x5a, + 0x1e, 0x9f, 0x25, 0x18, 0xd3, 0xd2, 0x83, 0x93, 0xf3, 0x86, 0x98, 0x8c, 0x3d, 0x74, 0xce, 0xe8, + 0x9c, 0xb9, 0x7d, 0x2e, 0xa2, 0x45, 0x5a, 0x25, 0x19, 0xcf, 0x6d, 0xc5, 0x85, 0x34, 0x0f, 0xc3, + 0x1a, 0xad, 0xa4, 0xc0, 0x5b, 0x73, 0x31, 0x29, 0x1c, 0xa3, 0x41, 0xf9, 0x5d, 0x22, 0xba, 0x68, + 0x7a, 0x34, 0x29, 0x5f, 0x7f, 0x9d, 0x12, 0x39, 0x48, 0x31, 0x55, 0x8a, 0x8c, 0xd8, 0x77, 0x4e, + 0x99, 0xd6, 0x34, 0x68, 0x17, 0x4b, 0xc7, 0x16, 0x3e, 0xfc, 0xc8, 0xc8, 0x97, 0xae, 0x56, 0xd8, + 0xae, 0xe9, 0xd4, 0x33, 0x74, 0x37, 0xb5, 0x66, 0xe7, 0x72, 0xec, 0x9a, 0x40, 0x3d, 0xb7, 0xa5, + 0x3f, 0xd0, 0xd6, 0xec, 0x54, 0x56, 0x74, 0x72, 0x3d, 0xa9, 0xb8, 0xe5, 0x25, 0x4e, 0xef, 0xb2, + 0x27, 0x4c, 0x67, 0x25, 0x54, 0xd7, 0xcc, 0xc3, 0xb9, 0xd9, 0xd6, 0x33, 0xa4, 0x60, 0xcb, 0xf9, + 0x9f, 0xc3, 0xad, 0x4b, 0x7a, 0xf5, 0xdc, 0x16, 0x7e, 0xa1, 0x2d, 0x74, 0x89, 0x34, 0xe8, 0xea, + 0x38, 0xde, 0x23, 0x4f, 0x7a, 0x2e, 0xef, 0x0d, 0x7c, 0x2a, 0x94, 0xce, 0x61, 0xae, 0x34, 0x9b, + 0x6e, 0x19, 0xce, 0x33, 0xad, 0xc7, 0x33, 0xe9, 0x2e, 0x32, 0x7e, 0xe7, 0x12, 0xb6, 0xdf, 0x5e, + 0x0d, 0xfb, 0x4a, 0x2e, 0xc6, 0x19, 0xb9, 0xcf, 0x13, 0x8b, 0x71, 0x7e, 0x76, 0xf4, 0x2e, 0xc7, + 0xa0, 0x33, 0x35, 0x77, 0xdf, 0xd3, 0x52, 0x97, 0xab, 0x43, 0x50, 0x3a, 0x9b, 0xba, 0x5a, 0x62, + 0xb2, 0x32, 0x9d, 0x6f, 0x32, 0xfd, 0x87, 0x6b, 0xef, 0x7a, 0x12, 0x6a, 0x32, 0x97, 0x9f, 0x7b, + 0x5b, 0x2d, 0x37, 0x99, 0x59, 0xab, 0x35, 0x86, 0x7a, 0x06, 0x68, 0xc5, 0x30, 0x23, 0x19, 0xb5, + 0x62, 0x98, 0x99, 0x32, 0xfa, 0x16, 0x5a, 0x5d, 0x6c, 0xbf, 0x45, 0x75, 0xab, 0x8b, 0x96, 0x52, + 0x38, 0x61, 0xf4, 0x20, 0x1f, 0xa0, 0xc9, 0xa3, 0xbb, 0x9d, 0x64, 0xd6, 0xe4, 0xa4, 0x7b, 0x96, + 0x8c, 0xaa, 0x7c, 0xcd, 0xca, 0xc6, 0x9e, 0x4c, 0x19, 0x3d, 0x57, 0x4e, 0x17, 0x08, 0xfa, 0xb7, + 0xa5, 0xd5, 0x04, 0x1b, 0x5c, 0x36, 0xad, 0x4d, 0xf9, 0x6d, 0x7e, 0x5b, 0x9a, 0x4c, 0x0c, 0xb2, + 0x54, 0xb6, 0xe6, 0x24, 0xd9, 0xf7, 0x60, 0x3c, 0xce, 0xcc, 0xbc, 0x3b, 0xaf, 0x11, 0x26, 0xd2, + 0x35, 0x27, 0x09, 0xdf, 0x95, 0xd7, 0x2a, 0x58, 0x9f, 0x59, 0xd8, 0x5d, 0x05, 0xf8, 0x48, 0x9a, + 0x68, 0x8c, 0x96, 0xa6, 0xf2, 0x3c, 0x77, 0x59, 0xb9, 0xc7, 0xf5, 0x74, 0x92, 0x6a, 0x5e, 0x64, + 0x24, 0x84, 0x55, 0xf3, 0x22, 0x2b, 0xa1, 0x6b, 0x7c, 0xed, 0xf0, 0xb9, 0xb4, 0x47, 0xc4, 0x4c, + 0x2f, 0x19, 0xcd, 0x4a, 0xf1, 0xbd, 0x9c, 0x57, 0x9c, 0x64, 0x5d, 0x83, 0x52, 0x32, 0xf7, 0xa5, + 0x3a, 0xcc, 0xe5, 0x24, 0x29, 0x55, 0x27, 0xc4, 0xdc, 0xa4, 0x99, 0x5b, 0xd2, 0xb8, 0x6e, 0xf2, + 0xbd, 0x9a, 0xdd, 0x28, 0x9d, 0x75, 0xbe, 0xb5, 0x7d, 0xc2, 0x48, 0x83, 0xa9, 0x1f, 0xb3, 0x53, + 0x69, 0x36, 0x75, 0xb5, 0x2c, 0x23, 0x73, 0xa6, 0x2b, 0x83, 0x3d, 0x65, 0x67, 0xe3, 0x7e, 0xc3, + 0x3c, 0xff, 0x76, 0x89, 0x99, 0xde, 0xf3, 0x0a, 0x9a, 0xfc, 0x12, 0xcc, 0xe6, 0x84, 0x97, 0x26, + 0xaf, 0x26, 0xcc, 0xb4, 0xd9, 0xe1, 0xa7, 0xd5, 0x04, 0xc9, 0xcc, 0x4f, 0xbd, 0x8e, 0xbe, 0x0b, + 0x46, 0x58, 0x87, 0xd4, 0x7d, 0xe0, 0x23, 0x37, 0x3a, 0xe0, 0x69, 0x98, 0xb5, 0x35, 0x37, 0x33, + 0x1e, 0x04, 0xa9, 0xe1, 0x41, 0xc6, 0x80, 0x66, 0x5c, 0x09, 0x66, 0x30, 0x9c, 0xcb, 0x66, 0xc8, + 0xd6, 0x0e, 0x36, 0x17, 0x32, 0x62, 0x6e, 0xa8, 0xb9, 0x90, 0x1f, 0x8f, 0x23, 0xb7, 0x99, 0x5b, + 0x52, 0xc1, 0xca, 0xe6, 0x98, 0x1f, 0x7e, 0x23, 0x97, 0xe3, 0x03, 0xc6, 0x31, 0x15, 0x51, 0x83, + 0xe4, 0xa0, 0x77, 0x5f, 0x3d, 0x6c, 0xb9, 0x5f, 0x9b, 0x54, 0xf3, 0x5a, 0xfb, 0xf2, 0x62, 0x77, + 0xe4, 0xb6, 0x6f, 0x59, 0x7e, 0x4f, 0xd9, 0xed, 0x3b, 0xe9, 0x8e, 0xad, 0x2e, 0xcf, 0x12, 0x41, + 0x5d, 0x8c, 0x8e, 0x6a, 0xf0, 0xb9, 0x1c, 0x38, 0xd9, 0x40, 0x67, 0xa4, 0x24, 0x54, 0x3b, 0xd1, + 0x66, 0x47, 0x8d, 0xc9, 0xe5, 0xc7, 0xe7, 0xb1, 0x11, 0x75, 0xe3, 0x34, 0xf3, 0x38, 0x11, 0xae, + 0x43, 0xcc, 0x63, 0x03, 0x7a, 0xba, 0x79, 0x9c, 0x60, 0x68, 0xce, 0xe3, 0x64, 0x33, 0x93, 0x66, + 0x82, 0xdc, 0x51, 0x4d, 0x36, 0x53, 0xcd, 0xe3, 0x6c, 0x8e, 0xf9, 0xd1, 0x51, 0x72, 0x39, 0xaa, + 0x79, 0x6c, 0x72, 0xcc, 0x41, 0x3f, 0xe1, 0x3c, 0x4e, 0x56, 0x62, 0xce, 0xe3, 0x53, 0xb5, 0x4f, + 0xcd, 0xe3, 0xec, 0xf6, 0x9d, 0x7a, 0x1e, 0x27, 0xc2, 0x09, 0x19, 0x1d, 0xcd, 0x9a, 0xc7, 0x49, + 0x7c, 0x3e, 0x8f, 0x93, 0xd0, 0x84, 0x65, 0xa6, 0xcb, 0x3c, 0x4e, 0x52, 0x7e, 0x8a, 0xfc, 0x12, + 0xa1, 0x50, 0x4e, 0x32, 0x93, 0x73, 0xa3, 0xa8, 0x90, 0x47, 0x68, 0x1b, 0x4c, 0xc0, 0x4f, 0x36, + 0x9b, 0x2f, 0xe6, 0x31, 0xc5, 0xf9, 0xbc, 0x2b, 0x85, 0x98, 0x6c, 0xae, 0x69, 0xf8, 0xca, 0x8e, + 0x04, 0xd3, 0xa5, 0xc1, 0xbb, 0x6c, 0xde, 0x34, 0xbb, 0xf0, 0xed, 0x16, 0xc8, 0xa6, 0x0b, 0x5f, + 0x75, 0x0e, 0x4a, 0xf2, 0xcd, 0x25, 0xe9, 0x3e, 0xbf, 0x3f, 0x93, 0xb7, 0x23, 0x49, 0xba, 0xf9, + 0xc4, 0xc9, 0xea, 0xd4, 0x2d, 0x55, 0x27, 0xac, 0x64, 0x4b, 0x4f, 0x3b, 0xcf, 0xd7, 0xa5, 0xf6, + 0x90, 0x8a, 0x80, 0x95, 0xe8, 0xb4, 0x3e, 0xd7, 0x73, 0x4b, 0xc8, 0x36, 0x1a, 0x82, 0xd3, 0x70, + 0xcd, 0x88, 0x9c, 0x17, 0x6a, 0xab, 0x27, 0xd7, 0x54, 0x2c, 0x1f, 0x9d, 0x6b, 0x5e, 0xa0, 0x1f, + 0xc5, 0x35, 0x4d, 0xfd, 0x31, 0x9a, 0xce, 0xc4, 0x8b, 0x2f, 0xef, 0xb1, 0x9f, 0x7f, 0xce, 0x99, + 0x32, 0x1c, 0xa6, 0x18, 0x2e, 0xfa, 0xa9, 0x7d, 0x28, 0xae, 0xff, 0x24, 0x30, 0x57, 0xf8, 0x59, + 0xf4, 0xe4, 0x63, 0x28, 0x89, 0xe5, 0x2d, 0x66, 0x90, 0x85, 0x98, 0x3b, 0x74, 0x0b, 0xd2, 0x62, + 0x77, 0x82, 0x16, 0x9c, 0xc4, 0x52, 0x77, 0x12, 0x49, 0xe4, 0x9b, 0xb5, 0xd8, 0x76, 0xb8, 0x1d, + 0x74, 0xc2, 0x88, 0x36, 0xd3, 0xe6, 0x28, 0xb3, 0x31, 0xd2, 0xad, 0xc2, 0x44, 0xdf, 0x9d, 0x27, + 0xab, 0xb8, 0xb6, 0x99, 0xe0, 0x6e, 0xf6, 0xba, 0x6c, 0x36, 0xb8, 0xf4, 0xac, 0xa8, 0xa7, 0x45, + 0x66, 0x9b, 0xf2, 0xea, 0xce, 0x6f, 0x94, 0x12, 0xd1, 0x09, 0x7b, 0x97, 0x27, 0x22, 0x7e, 0xa0, + 0xe6, 0xb6, 0xc3, 0x5e, 0x92, 0x49, 0x3e, 0x76, 0x22, 0x9f, 0xc0, 0xa8, 0x24, 0xee, 0x2d, 0x90, + 0x24, 0x35, 0x0a, 0x64, 0x09, 0x26, 0x8c, 0x97, 0x5c, 0xea, 0x74, 0x93, 0xf5, 0xbe, 0xab, 0xcb, + 0x38, 0x4f, 0x18, 0x2f, 0xb6, 0x14, 0x97, 0xac, 0x77, 0x5c, 0xb9, 0x5c, 0xbe, 0x0f, 0x63, 0x42, + 0xa4, 0x5d, 0xa5, 0x91, 0x6f, 0xac, 0x9b, 0xd1, 0xbc, 0xa2, 0x3b, 0x4d, 0x37, 0x5a, 0xf4, 0xbd, + 0xc7, 0xee, 0x7e, 0x4f, 0xc1, 0xa4, 0x49, 0x76, 0xe7, 0xc9, 0x97, 0x98, 0xb4, 0x58, 0xa6, 0x92, + 0xa6, 0xd1, 0x33, 0x3f, 0x78, 0xe2, 0x7a, 0xfb, 0x3d, 0x58, 0x5e, 0x31, 0x59, 0x26, 0xe9, 0xa4, + 0xe3, 0xc9, 0x97, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x93, 0x49, 0xf7, 0xed, 0xa5, 0x06, 0x17, 0xd1, + 0xf5, 0xe6, 0xb4, 0x6d, 0xef, 0xca, 0xf4, 0x73, 0x1e, 0x44, 0x51, 0x1a, 0xfa, 0x1b, 0x7e, 0xd0, + 0xec, 0xcd, 0xb1, 0x62, 0x3a, 0xf3, 0x26, 0xc8, 0xa4, 0x30, 0x3e, 0x87, 0xf3, 0xb5, 0x5c, 0xd6, + 0xbd, 0x58, 0xf4, 0xd2, 0x24, 0x2f, 0xa0, 0x28, 0x4e, 0xd9, 0xee, 0xae, 0x3c, 0x57, 0x71, 0x4d, + 0x63, 0xfb, 0xd0, 0x56, 0x40, 0x1f, 0xd3, 0x00, 0x5d, 0xc6, 0x7b, 0x39, 0x4b, 0x9b, 0xe8, 0xb2, + 0xe7, 0xab, 0x70, 0xb6, 0x96, 0x62, 0x95, 0x47, 0xd2, 0xeb, 0xf2, 0x68, 0x0a, 0x7b, 0x7a, 0xc2, + 0x76, 0xf5, 0x70, 0x31, 0x1a, 0xbb, 0x4f, 0xa3, 0x9d, 0xd5, 0x1e, 0x52, 0x92, 0x6f, 0x1a, 0x24, + 0xe2, 0xee, 0x1d, 0x46, 0x59, 0xd3, 0x28, 0xd3, 0x18, 0xb9, 0x1f, 0xef, 0x27, 0xf2, 0x22, 0xa5, + 0x67, 0xb5, 0x79, 0x1c, 0xee, 0xe2, 0x5a, 0x28, 0xdc, 0xa6, 0x35, 0x13, 0x24, 0x87, 0xc4, 0xa6, + 0x3a, 0xcd, 0x83, 0x3a, 0x24, 0x55, 0x7e, 0xfc, 0xe3, 0xd3, 0x43, 0xc0, 0x2e, 0xa7, 0xdc, 0xe9, + 0xbb, 0xb2, 0xe0, 0x26, 0xd4, 0x35, 0xbf, 0xf1, 0x44, 0x37, 0xa1, 0x6a, 0x69, 0xed, 0xe7, 0xcc, + 0xa4, 0xf3, 0x62, 0xc5, 0xc7, 0xcc, 0xf3, 0xba, 0xd7, 0x98, 0x9e, 0xd8, 0x5e, 0x37, 0xa1, 0x9a, + 0x29, 0xf8, 0xef, 0x4a, 0xdb, 0x22, 0x56, 0x68, 0x72, 0xce, 0x15, 0x8d, 0x32, 0x2b, 0x22, 0x91, + 0x69, 0x56, 0xd4, 0x1b, 0x9a, 0x7f, 0x11, 0x40, 0xd2, 0x39, 0xf8, 0xd5, 0x61, 0x25, 0x37, 0x3d, + 0x7f, 0x17, 0xe7, 0xaf, 0x29, 0xe1, 0x32, 0x64, 0x08, 0x5e, 0x05, 0x22, 0x4e, 0x97, 0xc5, 0xa2, + 0xd4, 0x3d, 0x99, 0x6e, 0x17, 0xc8, 0x06, 0x9c, 0xbb, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, + 0x02, 0xb7, 0x11, 0x75, 0xbd, 0x55, 0x94, 0x67, 0x93, 0x0c, 0x9a, 0xdd, 0xb7, 0x18, 0xbf, 0x5a, + 0x36, 0xbf, 0xae, 0x74, 0x5d, 0xfc, 0x6b, 0xc5, 0x55, 0xc5, 0x69, 0x9a, 0x98, 0x3f, 0xc5, 0x87, + 0xb9, 0xfb, 0x4e, 0x3e, 0x69, 0x29, 0x8e, 0x7a, 0x22, 0x4e, 0x5b, 0x37, 0x61, 0x88, 0x13, 0xe5, + 0x6e, 0xa8, 0xe3, 0x3a, 0x0d, 0xb9, 0x03, 0xa3, 0xca, 0xff, 0x86, 0x18, 0x45, 0xb9, 0xed, 0xba, + 0x03, 0xa3, 0xfc, 0x68, 0x75, 0x72, 0x92, 0x0f, 0x60, 0x54, 0x39, 0xec, 0x9c, 0x7a, 0xa7, 0xff, + 0x18, 0x26, 0x74, 0xd7, 0x9d, 0xd3, 0x0b, 0xf2, 0xfb, 0x78, 0xf7, 0x2b, 0xaf, 0x58, 0xf2, 0xe9, + 0x67, 0x12, 0x99, 0xbe, 0x84, 0x48, 0xf9, 0x02, 0x29, 0x81, 0xb9, 0xcd, 0x3f, 0x9b, 0xa2, 0x26, + 0x1f, 0xc8, 0xd7, 0x54, 0x8a, 0x38, 0x8d, 0xd4, 0x45, 0x66, 0x93, 0x5c, 0xcc, 0x2f, 0x42, 0xac, + 0x16, 0xd8, 0x9e, 0xcd, 0x3e, 0xc9, 0x1d, 0x75, 0x6f, 0xd1, 0xe5, 0x71, 0xd9, 0x44, 0x2d, 0x2d, + 0x95, 0x83, 0x2e, 0x9f, 0xd1, 0xe5, 0xfc, 0xb4, 0x75, 0x38, 0x18, 0x0f, 0xf0, 0x14, 0x98, 0x2a, + 0xcd, 0xed, 0x5e, 0x97, 0x34, 0x78, 0xf1, 0xb1, 0x37, 0xcd, 0xae, 0x0b, 0x59, 0xb7, 0x53, 0xb4, + 0x78, 0x23, 0xfa, 0x52, 0xd8, 0xad, 0x4a, 0x0f, 0xc8, 0x93, 0x77, 0x36, 0xbf, 0x65, 0x17, 0x32, + 0x6e, 0xc5, 0x7b, 0x8e, 0x45, 0x1e, 0xbb, 0x5f, 0x42, 0xed, 0x30, 0x33, 0x18, 0x58, 0x3e, 0xb3, + 0xeb, 0x9a, 0x63, 0x45, 0x26, 0xa5, 0xda, 0xf4, 0x9e, 0xe0, 0x33, 0xb5, 0xec, 0x2c, 0x7d, 0xaf, + 0xf5, 0xe0, 0x22, 0x25, 0xf1, 0x7a, 0x4f, 0x3c, 0x75, 0xc7, 0x7a, 0x81, 0xef, 0xb0, 0xd9, 0xf5, + 0xf5, 0xc8, 0x3a, 0x98, 0x71, 0xed, 0xad, 0xdc, 0x4b, 0xb3, 0x19, 0x9a, 0xee, 0xa5, 0x5d, 0xfb, + 0x90, 0x27, 0xfe, 0x4f, 0xa1, 0x12, 0x7b, 0x8f, 0x9c, 0x6e, 0x10, 0xf2, 0xbd, 0x1a, 0x49, 0x4a, + 0x52, 0x21, 0xe9, 0x96, 0x86, 0x67, 0xee, 0x6a, 0x9e, 0x84, 0x43, 0xcd, 0x2d, 0x49, 0x78, 0xc5, + 0x25, 0xf2, 0x55, 0xe6, 0x65, 0xbe, 0xec, 0x62, 0x87, 0x15, 0xef, 0xf6, 0x5e, 0x0a, 0xa3, 0xf4, + 0x68, 0x9f, 0x9e, 0x91, 0x72, 0xee, 0x48, 0x30, 0xb2, 0xba, 0x0c, 0x6f, 0xef, 0xab, 0xc7, 0x72, + 0xce, 0xb8, 0x9e, 0x7e, 0x40, 0x9d, 0xf8, 0xad, 0x5a, 0x22, 0x76, 0xa0, 0xfe, 0x3e, 0x38, 0x5d, + 0x94, 0x7c, 0x68, 0x95, 0x85, 0xa1, 0x3c, 0xaa, 0xca, 0xb2, 0x0a, 0x06, 0x67, 0x47, 0x11, 0x3f, + 0x70, 0xa3, 0xe7, 0x8b, 0xf6, 0x5a, 0x6c, 0x56, 0xd0, 0x0b, 0x24, 0x6f, 0x90, 0x85, 0xf6, 0x1a, + 0xf9, 0x02, 0x97, 0x12, 0xc1, 0x7e, 0xc1, 0xf7, 0xa3, 0x30, 0x0a, 0x9c, 0x76, 0xad, 0x11, 0xb8, + 0xed, 0x28, 0xb7, 0xd3, 0xb1, 0x03, 0x78, 0x16, 0x99, 0xe6, 0x8f, 0x2a, 0x62, 0xcb, 0x67, 0x45, + 0xdf, 0x51, 0x6f, 0x72, 0xb2, 0x0a, 0xbb, 0x9c, 0x5c, 0x6a, 0x32, 0x9a, 0xfc, 0xcb, 0x64, 0x5a, + 0x87, 0xd9, 0x9c, 0x98, 0x45, 0xea, 0xf6, 0xb6, 0x7b, 0x4c, 0xa3, 0xb9, 0xee, 0x15, 0x93, 0x2f, + 0x61, 0x26, 0x33, 0xa8, 0x91, 0xb2, 0x40, 0x77, 0x0b, 0x79, 0xd4, 0x8b, 0xf9, 0x13, 0x28, 0xf3, + 0xd7, 0x20, 0xe8, 0xf4, 0x6c, 0xc4, 0xb7, 0x89, 0xdf, 0x08, 0xe5, 0x20, 0x24, 0xd7, 0xeb, 0x7c, + 0x3c, 0xf5, 0xe0, 0x7d, 0x1a, 0x03, 0x9b, 0x24, 0xd2, 0xa1, 0xab, 0x0f, 0x2f, 0xab, 0xb0, 0xdb, + 0x43, 0xa4, 0x2d, 0x98, 0xd9, 0xa5, 0x81, 0xfb, 0xf8, 0x79, 0x92, 0xa1, 0x94, 0x4c, 0x66, 0x69, + 0x37, 0x8e, 0x9f, 0xc1, 0xec, 0xa2, 0x7f, 0xd8, 0x16, 0x4f, 0xfe, 0x0c, 0x9e, 0xea, 0x2a, 0x3e, + 0xbb, 0xbc, 0xb7, 0x23, 0xd4, 0x5c, 0x7e, 0xe2, 0x7a, 0xe5, 0xff, 0xd6, 0x33, 0xb7, 0xbd, 0x7a, + 0xb8, 0x66, 0xd2, 0x6f, 0xe3, 0x24, 0xcc, 0xca, 0x64, 0xaf, 0x4f, 0xc2, 0x2e, 0x99, 0xee, 0x73, + 0x1e, 0x90, 0xcd, 0xe6, 0x24, 0xaf, 0xef, 0xc2, 0xf5, 0x04, 0xad, 0xdd, 0x90, 0x7b, 0x8b, 0x99, + 0xe6, 0x3b, 0xe1, 0x71, 0x9d, 0x99, 0x03, 0x3c, 0xb3, 0x9d, 0x5a, 0x64, 0x87, 0x56, 0xab, 0x8b, + 0x8a, 0x45, 0xf4, 0xd0, 0x0e, 0x0c, 0x13, 0x8d, 0xf8, 0x13, 0x3a, 0x6d, 0xb7, 0xd5, 0x3a, 0x45, + 0x8c, 0x4a, 0xed, 0xfb, 0x30, 0x5e, 0xd3, 0x2b, 0xcf, 0xa8, 0x24, 0x77, 0x52, 0xa8, 0x27, 0x44, + 0xbd, 0xdb, 0xde, 0xc5, 0x91, 0x54, 0x6d, 0x3c, 0x27, 0xea, 0x45, 0xae, 0xeb, 0x8c, 0x91, 0xb3, + 0x4d, 0xed, 0x02, 0x59, 0x29, 0x15, 0x95, 0xeb, 0x4c, 0x76, 0x9a, 0xb7, 0x3a, 0xcf, 0x32, 0x93, + 0xcc, 0x98, 0x49, 0xac, 0xde, 0xa9, 0x69, 0x95, 0x43, 0x7d, 0xd7, 0x94, 0x9b, 0xdc, 0xcf, 0x27, + 0xce, 0x52, 0xa7, 0xfb, 0xf9, 0xa4, 0x72, 0xdf, 0xe9, 0x7e, 0x3e, 0x19, 0x89, 0xed, 0x96, 0x91, + 0x57, 0x9c, 0x9e, 0xa7, 0x8b, 0x31, 0x42, 0xb1, 0xc9, 0xc8, 0x02, 0xf4, 0x50, 0x0f, 0x10, 0xc2, + 0x93, 0xfa, 0x74, 0xb1, 0xb5, 0x26, 0x03, 0x83, 0x24, 0xb2, 0x00, 0xdd, 0x83, 0x12, 0xcf, 0x6f, + 0x10, 0xc7, 0x54, 0x8c, 0xfd, 0x06, 0xd3, 0x69, 0x17, 0xba, 0x0c, 0x6a, 0x29, 0x19, 0x8d, 0x4e, + 0x99, 0xcc, 0x72, 0xc2, 0xd4, 0x75, 0x99, 0xaa, 0x10, 0xc7, 0x9c, 0x53, 0x86, 0xa9, 0x54, 0x18, + 0xba, 0xb9, 0xf3, 0x19, 0x25, 0x4a, 0xa5, 0x1c, 0xd7, 0x23, 0xd4, 0xa9, 0x2e, 0x65, 0x84, 0xad, + 0x9b, 0xbb, 0x90, 0x59, 0x26, 0x18, 0x45, 0x3c, 0x3b, 0x73, 0x76, 0x4e, 0xe9, 0xf8, 0x15, 0x58, + 0x17, 0x1c, 0x59, 0xcd, 0x8d, 0x93, 0xa0, 0x8a, 0x5a, 0xa9, 0x4a, 0x4e, 0x94, 0x91, 0xc8, 0xfa, + 0xf5, 0x8c, 0x87, 0x1a, 0x06, 0x46, 0xec, 0x0d, 0xd6, 0x3d, 0xab, 0x36, 0x79, 0x24, 0x93, 0xc5, + 0xe4, 0xd4, 0xd4, 0x8b, 0x41, 0xee, 0x08, 0x3e, 0x92, 0xe9, 0x61, 0x5e, 0x36, 0xe3, 0x3d, 0xb8, + 0x98, 0x78, 0xfd, 0x61, 0x32, 0xbe, 0x91, 0xfd, 0x44, 0x24, 0x53, 0x3c, 0xf9, 0x3a, 0xfb, 0x95, + 0xf4, 0x2b, 0x91, 0xc4, 0xb8, 0x9f, 0x76, 0xcd, 0x5b, 0x87, 0x49, 0x5c, 0x66, 0x64, 0x4a, 0xf6, + 0x38, 0x3e, 0x8d, 0x09, 0x4e, 0x06, 0x4a, 0x4a, 0x96, 0x2a, 0x97, 0xd9, 0x71, 0xf1, 0xa2, 0x98, + 0x27, 0x78, 0x9f, 0x33, 0x9f, 0x19, 0x23, 0x30, 0x6b, 0x17, 0x13, 0x79, 0xe3, 0xc9, 0xf7, 0xe1, + 0x4c, 0xfc, 0xd0, 0x98, 0xb3, 0xc8, 0x40, 0xeb, 0x62, 0x28, 0x3b, 0x13, 0xbf, 0x36, 0x3e, 0x3d, + 0xf9, 0x8a, 0xdc, 0x8a, 0x62, 0xf2, 0x4b, 0xa9, 0xb7, 0x32, 0x46, 0x1f, 0x4e, 0xb2, 0x23, 0x69, + 0xb2, 0x3d, 0xed, 0xe8, 0x34, 0xf0, 0x73, 0xcb, 0x0e, 0xbd, 0xa8, 0x7f, 0x6e, 0x5d, 0xc3, 0x43, + 0x2a, 0xf5, 0x37, 0x87, 0xcf, 0x3a, 0x5c, 0xc3, 0x70, 0x2d, 0x5b, 0x3c, 0x40, 0x5f, 0x36, 0x56, + 0x7e, 0xdb, 0x93, 0x41, 0x5e, 0x5a, 0x70, 0xb5, 0x67, 0xec, 0x49, 0x72, 0xcb, 0x70, 0x71, 0xe9, + 0x1d, 0xa5, 0xb2, 0xcb, 0xc9, 0x63, 0x3a, 0x2b, 0x84, 0xa3, 0xda, 0x67, 0xbb, 0x44, 0x93, 0x54, + 0xfb, 0x6c, 0xd7, 0x18, 0x90, 0x9f, 0x61, 0x06, 0x26, 0xb1, 0x47, 0x61, 0x08, 0x26, 0xea, 0xf1, + 0xa0, 0xd4, 0x5d, 0xaf, 0x7d, 0xae, 0x9a, 0x97, 0xa2, 0x29, 0x42, 0x3c, 0xd3, 0x5c, 0x16, 0x27, + 0xb1, 0x3c, 0xe6, 0xbd, 0x99, 0x74, 0x71, 0xad, 0xbe, 0xcc, 0x27, 0xe0, 0xa9, 0x5b, 0x9e, 0x03, + 0x5f, 0x58, 0xfa, 0xe9, 0x7f, 0xbb, 0x5c, 0xf8, 0xe9, 0xcf, 0x2e, 0x17, 0xfe, 0xd3, 0xcf, 0x2e, + 0x17, 0xfe, 0xeb, 0xcf, 0x2e, 0x17, 0xbe, 0x98, 0x3f, 0x59, 0x68, 0xe4, 0x46, 0xcb, 0xa5, 0x5e, + 0x74, 0x8b, 0xb3, 0x1b, 0xc2, 0xff, 0xee, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x65, 0x08, + 0x73, 0x4e, 0xa4, 0xe8, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -18157,6 +18158,7 @@ func (c *authServiceClient) DeleteAllSnowflakeSessions(ctx context.Context, in * return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) CreateSAMLIdPSession(ctx context.Context, in *CreateSAMLIdPSessionRequest, opts ...grpc.CallOption) (*CreateSAMLIdPSessionResponse, error) { out := new(CreateSAMLIdPSessionResponse) err := c.cc.Invoke(ctx, "/proto.AuthService/CreateSAMLIdPSession", in, out, opts...) @@ -18166,6 +18168,7 @@ func (c *authServiceClient) CreateSAMLIdPSession(ctx context.Context, in *Create return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) GetSAMLIdPSession(ctx context.Context, in *GetSAMLIdPSessionRequest, opts ...grpc.CallOption) (*GetSAMLIdPSessionResponse, error) { out := new(GetSAMLIdPSessionResponse) err := c.cc.Invoke(ctx, "/proto.AuthService/GetSAMLIdPSession", in, out, opts...) @@ -18175,6 +18178,7 @@ func (c *authServiceClient) GetSAMLIdPSession(ctx context.Context, in *GetSAMLId return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) ListSAMLIdPSessions(ctx context.Context, in *ListSAMLIdPSessionsRequest, opts ...grpc.CallOption) (*ListSAMLIdPSessionsResponse, error) { out := new(ListSAMLIdPSessionsResponse) err := c.cc.Invoke(ctx, "/proto.AuthService/ListSAMLIdPSessions", in, out, opts...) @@ -18184,6 +18188,7 @@ func (c *authServiceClient) ListSAMLIdPSessions(ctx context.Context, in *ListSAM return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) DeleteSAMLIdPSession(ctx context.Context, in *DeleteSAMLIdPSessionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/DeleteSAMLIdPSession", in, out, opts...) @@ -18193,6 +18198,7 @@ func (c *authServiceClient) DeleteSAMLIdPSession(ctx context.Context, in *Delete return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) DeleteAllSAMLIdPSessions(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/DeleteAllSAMLIdPSessions", in, out, opts...) @@ -18202,6 +18208,7 @@ func (c *authServiceClient) DeleteAllSAMLIdPSessions(ctx context.Context, in *em return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) DeleteUserSAMLIdPSessions(ctx context.Context, in *DeleteUserSAMLIdPSessionsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/DeleteUserSAMLIdPSessions", in, out, opts...) diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 80333403685a0..6cb986096e777 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -2933,17 +2933,29 @@ service AuthService { rpc DeleteAllSnowflakeSessions(google.protobuf.Empty) returns (google.protobuf.Empty); // CreateSAMLIdPSession creates web session with sub kind saml_idp used by the SAML IdP. - rpc CreateSAMLIdPSession(CreateSAMLIdPSessionRequest) returns (CreateSAMLIdPSessionResponse); + rpc CreateSAMLIdPSession(CreateSAMLIdPSessionRequest) returns (CreateSAMLIdPSessionResponse) { + option deprecated = true; + } // GetSAMLIdPSession returns a SAML IdP session with sub kind saml_idp. - rpc GetSAMLIdPSession(GetSAMLIdPSessionRequest) returns (GetSAMLIdPSessionResponse); + rpc GetSAMLIdPSession(GetSAMLIdPSessionRequest) returns (GetSAMLIdPSessionResponse) { + option deprecated = true; + } // ListSAMLIdPSessions gets all SAML IdP sessions. - rpc ListSAMLIdPSessions(ListSAMLIdPSessionsRequest) returns (ListSAMLIdPSessionsResponse); + rpc ListSAMLIdPSessions(ListSAMLIdPSessionsRequest) returns (ListSAMLIdPSessionsResponse) { + option deprecated = true; + } // DeleteSAMLIdPSession removes a SAML IdP session. - rpc DeleteSAMLIdPSession(DeleteSAMLIdPSessionRequest) returns (google.protobuf.Empty); + rpc DeleteSAMLIdPSession(DeleteSAMLIdPSessionRequest) returns (google.protobuf.Empty) { + option deprecated = true; + } // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. - rpc DeleteAllSAMLIdPSessions(google.protobuf.Empty) returns (google.protobuf.Empty); + rpc DeleteAllSAMLIdPSessions(google.protobuf.Empty) returns (google.protobuf.Empty) { + option deprecated = true; + } // DeleteUserSAMLIdPSessions deletes all user’s SAML IdP sessions. - rpc DeleteUserSAMLIdPSessions(DeleteUserSAMLIdPSessionsRequest) returns (google.protobuf.Empty); + rpc DeleteUserSAMLIdPSessions(DeleteUserSAMLIdPSessionsRequest) returns (google.protobuf.Empty) { + option deprecated = true; + } // GetWebSession gets a web session. rpc GetWebSession(types.GetWebSessionRequest) returns (GetWebSessionResponse); diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 5a0a47df67e82..1739238e83004 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -5611,6 +5611,7 @@ func (a *ServerWithRoles) GetSnowflakeSession(ctx context.Context, req types.Get } // GetSAMLIdPSession gets a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) GetSAMLIdPSession(ctx context.Context, req types.GetSAMLIdPSessionRequest) (types.WebSession, error) { if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead); err != nil { return nil, trace.Wrap(err) @@ -5653,6 +5654,7 @@ func (a *ServerWithRoles) GetSnowflakeSessions(ctx context.Context) ([]types.Web } // ListSAMLIdPSessions gets a paginated list of SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) ListSAMLIdPSessions(ctx context.Context, pageSize int, pageToken, user string) ([]types.WebSession, string, error) { if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbRead); err != nil { return nil, "", trace.Wrap(err) @@ -5694,6 +5696,7 @@ func (a *ServerWithRoles) CreateSnowflakeSession(ctx context.Context, req types. } // CreateSAMLIdPSession creates a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) CreateSAMLIdPSession(ctx context.Context, req types.CreateSAMLIdPSessionRequest) (types.WebSession, error) { // Check if this a proxy service. if !a.hasBuiltinRole(types.RoleProxy) { @@ -5742,6 +5745,7 @@ func (a *ServerWithRoles) DeleteSnowflakeSession(ctx context.Context, req types. } // DeleteSAMLIdPSession removes a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) DeleteSAMLIdPSession(ctx context.Context, req types.DeleteSAMLIdPSessionRequest) error { samlSession, err := a.authServer.GetSAMLIdPSession(ctx, types.GetSAMLIdPSessionRequest(req)) if err != nil { @@ -5798,6 +5802,7 @@ func (a *ServerWithRoles) DeleteUserAppSessions(ctx context.Context, req *proto. } // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) DeleteAllSAMLIdPSessions(ctx context.Context) error { if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) @@ -5810,6 +5815,7 @@ func (a *ServerWithRoles) DeleteAllSAMLIdPSessions(ctx context.Context) error { } // DeleteUserSAMLIdPSessions deletes all of a user's SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) DeleteUserSAMLIdPSessions(ctx context.Context, username string) error { // First, check if the current user can delete the request user sessions. if err := a.canDeleteWebSession(username); err != nil { diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 64f66f9549acf..2fbfde35ffcdd 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -1625,6 +1625,7 @@ func (g *GRPCServer) GetSnowflakeSessions(ctx context.Context, e *emptypb.Empty) } // GetSAMLIdPSession gets a SAML IdPsession. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) GetSAMLIdPSession(ctx context.Context, req *authpb.GetSAMLIdPSessionRequest) (*authpb.GetSAMLIdPSessionResponse, error) { auth, err := g.authenticate(ctx) if err != nil { @@ -1646,6 +1647,7 @@ func (g *GRPCServer) GetSAMLIdPSession(ctx context.Context, req *authpb.GetSAMLI } // ListSAMLIdPSessions gets a paginated list of SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) ListSAMLIdPSessions(ctx context.Context, req *authpb.ListSAMLIdPSessionsRequest) (*authpb.ListSAMLIdPSessionsResponse, error) { auth, err := g.authenticate(ctx) if err != nil { @@ -1744,6 +1746,7 @@ func (g *GRPCServer) CreateSnowflakeSession(ctx context.Context, req *authpb.Cre } // CreateSAMLIdPSession creates a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) CreateSAMLIdPSession(ctx context.Context, req *authpb.CreateSAMLIdPSessionRequest) (*authpb.CreateSAMLIdPSessionResponse, error) { auth, err := g.authenticate(ctx) if err != nil { @@ -1813,6 +1816,7 @@ func (g *GRPCServer) DeleteUserAppSessions(ctx context.Context, req *authpb.Dele } // DeleteSAMLIdPSession removes a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) DeleteSAMLIdPSession(ctx context.Context, req *authpb.DeleteSAMLIdPSessionRequest) (*emptypb.Empty, error) { auth, err := g.authenticate(ctx) if err != nil { @@ -1829,6 +1833,7 @@ func (g *GRPCServer) DeleteSAMLIdPSession(ctx context.Context, req *authpb.Delet } // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) DeleteAllSAMLIdPSessions(ctx context.Context, _ *emptypb.Empty) (*emptypb.Empty, error) { auth, err := g.authenticate(ctx) if err != nil { @@ -1843,6 +1848,7 @@ func (g *GRPCServer) DeleteAllSAMLIdPSessions(ctx context.Context, _ *emptypb.Em } // DeleteUserSAMLIdPSessions removes all of a user's SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (g *GRPCServer) DeleteUserSAMLIdPSessions(ctx context.Context, req *authpb.DeleteUserSAMLIdPSessionsRequest) (*emptypb.Empty, error) { auth, err := g.authenticate(ctx) if err != nil { diff --git a/lib/idp/saml/session.go b/lib/idp/saml/session.go deleted file mode 100644 index 441a06336d74d..0000000000000 --- a/lib/idp/saml/session.go +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package saml - -import ( - "net/http" -) - -const ( - // SAMLSessionCookieName is the name of the SAML IdP session cookie. - // This cookie is set by SAML IdP after a successful SAML authentication. - SAMLSessionCookieName = "__Host-saml_session" -) - -// SetCookie set's the SAML session cookie named by [SAMLSessionCookieName]. -func SetCookie(w http.ResponseWriter, sessionID string, maxAgeSeconds int) { - http.SetCookie(w, &http.Cookie{ - Name: SAMLSessionCookieName, - Value: sessionID, - MaxAge: maxAgeSeconds, - HttpOnly: true, - Secure: true, - Path: "/", - }) -} - -// ClearCookie wipes the session cookie to invalidate SAML user session. -func ClearCookie(w http.ResponseWriter) { - http.SetCookie(w, &http.Cookie{ - Name: SAMLSessionCookieName, - Value: "", - Path: "/", - HttpOnly: true, - Secure: true, - }) -} diff --git a/lib/services/local/session.go b/lib/services/local/session.go index 92f42aad2aaaa..02b597d6c1940 100644 --- a/lib/services/local/session.go +++ b/lib/services/local/session.go @@ -49,6 +49,7 @@ func (s *IdentityService) GetSnowflakeSession(ctx context.Context, req types.Get } // GetSAMLIdPSession gets a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) GetSAMLIdPSession(ctx context.Context, req types.GetSAMLIdPSessionRequest) (types.WebSession, error) { if err := req.Check(); err != nil { return nil, trace.Wrap(err) @@ -98,6 +99,7 @@ func (s *IdentityService) GetSnowflakeSessions(ctx context.Context) ([]types.Web } // ListSAMLIdPSessions gets a paginated list of SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) ListSAMLIdPSessions(ctx context.Context, pageSize int, pageToken, user string) ([]types.WebSession, string, error) { return s.listSessions(ctx, pageSize, pageToken, user, samlIdPPrefix, sessionsPrefix) } @@ -177,6 +179,7 @@ func (s *IdentityService) UpsertSnowflakeSession(ctx context.Context, session ty } // UpsertSAMLIdPSession creates a SAMLIdP web session. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) UpsertSAMLIdPSession(ctx context.Context, session types.WebSession) error { return s.upsertSession(ctx, session, samlIdPPrefix, sessionsPrefix) } @@ -218,6 +221,7 @@ func (s *IdentityService) DeleteSnowflakeSession(ctx context.Context, req types. } // DeleteSAMLIdPSession removes a SAML IdP session. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) DeleteSAMLIdPSession(ctx context.Context, req types.DeleteSAMLIdPSessionRequest) error { if err := s.Delete(ctx, backend.Key(samlIdPPrefix, sessionsPrefix, req.SessionID)); err != nil { return trace.Wrap(err) @@ -253,6 +257,7 @@ func (s *IdentityService) DeleteUserAppSessions(ctx context.Context, req *proto. } // DeleteUserSAMLIdPSessions removes all SAML IdP sessions for a particular user. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) DeleteUserSAMLIdPSessions(ctx context.Context, user string) error { var token string @@ -298,6 +303,7 @@ func (s *IdentityService) DeleteAllSnowflakeSessions(ctx context.Context) error } // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. +// TODO(Joerger): DELETE IN v18.0.0 func (s *IdentityService) DeleteAllSAMLIdPSessions(ctx context.Context) error { startKey := backend.ExactKey(samlIdPPrefix, sessionsPrefix) if err := s.DeleteRange(ctx, startKey, backend.RangeEnd(startKey)); err != nil { diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 6706ecf4a0778..38058f21ba4f0 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -85,7 +85,6 @@ import ( "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/httplib/csrf" - samlidp "github.com/gravitational/teleport/lib/idp/saml" "github.com/gravitational/teleport/lib/jwt" "github.com/gravitational/teleport/lib/limiter" "github.com/gravitational/teleport/lib/modules" @@ -2271,18 +2270,6 @@ func clientMetaFromReq(r *http.Request) *authclient.ForwardedClientMetadata { // // {"message": "ok"} func (h *Handler) deleteWebSession(w http.ResponseWriter, r *http.Request, _ httprouter.Params, ctx *SessionContext) (interface{}, error) { - // samlSessionCookie will not be set for users who are not authenticated with SAML IdP. - samlSessionCookie, err := r.Cookie(samlidp.SAMLSessionCookieName) - if err == nil && samlSessionCookie != nil && samlSessionCookie.Value != "" { - // TODO(sshah): Websession is not updated with SAML session details after SAML auth so - // it begs to check for a nil value below and then set a session with session ID - // retrieved from samlSessionCookie. We can skip this step below once we have a - // mechanism to update Websession with SAML session value. - if ctx.cfg.Session.GetSAMLSession() == nil { - ctx.cfg.Session.SetSAMLSession(&types.SAMLSessionData{ID: samlSessionCookie.Value}) - } - } - clt, err := ctx.GetClient() if err != nil { h.log. @@ -2301,8 +2288,7 @@ func (h *Handler) deleteWebSession(w http.ResponseWriter, r *http.Request, _ htt } } - err = h.logout(r.Context(), w, ctx) - if err != nil { + if err := h.logout(r.Context(), w, ctx); err != nil { return nil, trace.Wrap(err) } @@ -2340,8 +2326,6 @@ func (h *Handler) logout(ctx context.Context, w http.ResponseWriter, sctx *Sessi func clearSessionCookies(w http.ResponseWriter) { // Clear Web UI session cookie websession.ClearCookie(w) - // Clear SAML IdP session cookie - samlidp.ClearCookie(w) } type renewSessionRequest struct { diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 366ed5f9cd6e6..2c49462ce16b2 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -116,7 +116,6 @@ import ( "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/httplib/csrf" - samlidp "github.com/gravitational/teleport/lib/idp/saml" kubeproxy "github.com/gravitational/teleport/lib/kube/proxy" "github.com/gravitational/teleport/lib/limiter" "github.com/gravitational/teleport/lib/modules" @@ -9331,74 +9330,6 @@ func TestLogout(t *testing.T) { require.ErrorIs(t, err, trace.AccessDenied("need auth")) } -// TestSAMlSessionClearedOnLogout tests if SAML IdP session is cleared on logout. -func TestSAMlSessionClearedOnLogout(t *testing.T) { - t.Parallel() - ctx := context.Background() - env := newWebPack(t, 2) - - const user = "llama" - const samlSessionID = "saml_session_id" - - // create logged in session - pack := env.proxies[0].authPack(t, user, nil /* roles */) - - // manually add SAML IdP session. The actual SAML IdP session and session cookie is set - // by the SAML IdP and the code to do that is on teleport.e. - _, err := env.proxies[0].client.CreateSAMLIdPSession(ctx, types.CreateSAMLIdPSessionRequest{ - SessionID: samlSessionID, - Username: pack.user, - SAMLSession: &types.SAMLSessionData{ID: samlSessionID}, - }) - require.NoError(t, err) - // add SAML session session cookie to authenticated client pack. - jar, err := cookiejar.New(nil) - require.NoError(t, err) - setSAMLCookie := &http.Cookie{ - Name: samlidp.SAMLSessionCookieName, - Value: samlSessionID, - MaxAge: int(time.Second) * 5, - HttpOnly: true, - Secure: true, - Path: "/", - } - jar.SetCookies(&env.proxies[0].webURL, append(pack.cookies, setSAMLCookie)) - pack2 := env.proxies[0].newClient(t, roundtrip.BearerAuth(pack.session.Token), roundtrip.CookieJar(jar)) - - samlSession, err := env.proxies[0].client.GetSAMLIdPSession(ctx, types.GetSAMLIdPSessionRequest{ - SessionID: samlSessionID, - }) - require.NoError(t, err) - require.Equal(t, user, samlSession.GetUser()) - require.Equal(t, samlSessionID, samlSession.GetSAMLSession().ID) - - // logout from web. The saml session needs to be deleted and the proxy should - // respond with SAML session cookie with empty value. - resp, err := pack2.Delete(ctx, pack.clt.Endpoint("webapi", "sessions", "web")) - require.NoError(t, err) - require.True(t, hasEmptySAMLSessionCookieValue(resp.Cookies())) - _, err = env.proxies[0].client.GetSAMLIdPSession(ctx, types.GetSAMLIdPSessionRequest{ - SessionID: samlSessionID, - }) - require.ErrorContains(t, err, `key "/saml_idp/sessions/saml_session_id" is not found`) -} - -func hasEmptySAMLSessionCookieValue(cookies []*http.Cookie) bool { - samlCookieString := (&http.Cookie{ - Name: samlidp.SAMLSessionCookieName, - Value: "", - Path: "/", - HttpOnly: true, - Secure: true, - }).String() - for _, cookie := range cookies { - if cookie.String() == samlCookieString { - return true - } - } - return false -} - // initGRPCServer creates a gRPC server serving on the provided listener. func initGRPCServer(t *testing.T, env *webPack, listener net.Listener) { clusterName := env.server.ClusterName() diff --git a/lib/web/sessions.go b/lib/web/sessions.go index 278f96d95635b..6ee00459ad5fa 100644 --- a/lib/web/sessions.go +++ b/lib/web/sessions.go @@ -1022,13 +1022,7 @@ func (s *sessionCache) invalidateSession(ctx context.Context, sctx *SessionConte if err := clt.DeleteUserAppSessions(ctx, &proto.DeleteUserAppSessionsRequest{Username: sctx.GetUser()}); err != nil { sessionDeletionErrs = err } - if samlSession := sctx.cfg.Session.GetSAMLSession(); samlSession != nil && samlSession.ID != "" { - if err := clt.DeleteSAMLIdPSession(ctx, types.DeleteSAMLIdPSessionRequest{ - SessionID: samlSession.ID, - }); err != nil && !trace.IsNotFound(err) { - sessionDeletionErrs = errors.Join(sessionDeletionErrs, err) - } - } + // Delete just the session - leave the bearer token to linger to avoid // failing a client query still using the old token. if err := clt.WebSessions().Delete(ctx, types.DeleteWebSessionRequest{ From 82e93c136a085dd26333b08c88f25e815f023ae2 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Mon, 19 Aug 2024 10:08:31 +0200 Subject: [PATCH 12/51] Add refresh button to unified resources view (#45247) * Allow `useKeyBasedPagination.clear` to clear the state before fetching new items * Add refresh button to unified resources view * Make the icon button square * Remove redundant border color * Rephrase JSDoc for `options.clear` * Remove unnecessary curly braces --- .../UnifiedResources/FilterPanel.tsx | 15 +++++++++++++ .../UnifiedResources/UnifiedResources.tsx | 3 ++- .../useKeyBasedPagination.ts | 22 +++++++++++++------ .../ui/DocumentCluster/UnifiedResources.tsx | 7 +++--- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx index 312b0fbda8859..3437efc1bba65 100644 --- a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx +++ b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx @@ -31,6 +31,7 @@ import { Rows, ArrowsIn, ArrowsOut, + Refresh, } from 'design/Icon'; import { ViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; @@ -77,6 +78,7 @@ interface FilterPanelProps { ClusterDropdown?: JSX.Element; availabilityFilter?: ResourceAvailabilityFilter; changeAvailableResourceMode(mode: IncludedResourceMode): void; + onRefresh(): void; } export function FilterPanel({ @@ -94,6 +96,7 @@ export function FilterPanel({ hideViewModeOptions, changeAvailableResourceMode, ClusterDropdown = null, + onRefresh, }: FilterPanelProps) { const { sort, kinds } = params; @@ -149,6 +152,18 @@ export function FilterPanel({ {BulkActions} + + + + + {!hideViewModeOptions && ( <> {currentViewMode === ViewMode.LIST && ( diff --git a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx index ac73d4d010edc..2b9c698a16a8e 100644 --- a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx @@ -139,7 +139,7 @@ export type ResourceAvailabilityFilter = export interface UnifiedResourcesProps { params: UnifiedResourcesQueryParams; resourcesFetchAttempt: Attempt; - fetchResources(options?: { force?: boolean }): Promise; + fetchResources(options?: { force?: boolean; clear?: boolean }): Promise; resources: SharedUnifiedResource[]; Header?: React.ReactElement; /** @@ -506,6 +506,7 @@ export function UnifiedResources(props: UnifiedResourcesProps) { ); }} hideViewModeOptions={forceCardView} + onRefresh={() => fetchResources({ clear: true })} BulkActions={ <> {selectedResources.length > 0 && ( diff --git a/web/packages/shared/hooks/useInfiniteScroll/useKeyBasedPagination.ts b/web/packages/shared/hooks/useInfiniteScroll/useKeyBasedPagination.ts index 7112a332b6d0a..8c13495985168 100644 --- a/web/packages/shared/hooks/useInfiniteScroll/useKeyBasedPagination.ts +++ b/web/packages/shared/hooks/useInfiniteScroll/useKeyBasedPagination.ts @@ -83,7 +83,10 @@ export function useKeyBasedPagination({ }, [setState]); const fetch = useCallback( - async (options?: { force?: boolean }) => { + async (options?: { force?: boolean; clear?: boolean }) => { + if (options?.clear) { + clear(); + } const { finished, attempt, resources, startKey } = stateRef.current; if ( finished || @@ -154,7 +157,7 @@ export function useKeyBasedPagination({ }); } }, - [fetchFunc, stateRef, setState, fetchMoreSize, initialFetchSize] + [fetchFunc, stateRef, clear, setState, fetchMoreSize, initialFetchSize] ); function updateFetchedResources(modifiedResources: T[]) { @@ -209,12 +212,17 @@ type KeyBasedPagination = { * as a mere suggestion to fetch more data and can be called multiple times, * for example, when the user scrolls to the bottom of the page. * - * @param options.force Cancels a pending request, if there is one. - * Disregards whether error has previously occurred. Intended for using as an - * explicit user's action. Don't call it from `useInfiniteScroll`, or you'll - * risk flooding the server with requests! + * @param options - Options to control the fetch behavior. + * @param options.force - If true, cancels any pending request and + * disregards whether an error occurred previously. This option is intended for + * explicit user actions. Do not call it from `useInfiniteScroll` to avoid + * flooding the server with requests. + * @param options.clear - If true, cancels any pending request and clears + * the state (useful for fetching data from the beginning). Similarly to + * `force`, do not call it from `useInfiniteScroll` to avoid flooding + * the server with requests. */ - fetch(options?: { force?: boolean }): Promise; + fetch(options?: { force?: boolean; clear?: boolean }): Promise; /** Aborts a pending request and clears the state. **/ clear(): void; attempt: Attempt; diff --git a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx index f8ea11ef56e2f..1bb1bb8cfbeaf 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx @@ -259,7 +259,7 @@ const Resources = memo( }) => { const appContext = useAppContext(); - const { fetch, resources, attempt, clear } = useUnifiedResourcesFetch({ + const { fetch, resources, attempt } = useUnifiedResourcesFetch({ fetchFunc: useCallback( async (paginationParams, signal) => { // Block the call if we don't know yet what resources to show. @@ -316,11 +316,10 @@ const Resources = memo( const { onResourcesRefreshRequest } = props; useEffect(() => { const { cleanup } = onResourcesRefreshRequest(() => { - clear(); - fetch({ force: true }); + fetch({ clear: true }); }); return cleanup; - }, [onResourcesRefreshRequest, fetch, clear]); + }, [onResourcesRefreshRequest, fetch]); const resourceIds = props.userPreferences.clusterPreferences?.pinnedResources?.resourceIds; From 5108ac98fb09b2835b06e6b1a4b7e1537c7bb6dc Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Mon, 19 Aug 2024 12:28:16 +0100 Subject: [PATCH 13/51] Machine ID: Document Kubernetes Workload Attestation (#45369) * Add KWA features into the machine id config reference * Add example manifests for tbot service for workload attestation * Update docs/pages/enroll-resources/machine-id/workload-identity/workload-attestation.mdx Co-authored-by: Paul Gottschling * Add more detail to explanation of workload attestation * Add table * Update cspell * Fix spelling of connect * Fix spelling of attested --------- Co-authored-by: Paul Gottschling --- docs/cspell.json | 2 + .../machine-id/workload-identity.mdx | 1 + .../workload-attestation.mdx | 239 ++++++++++++++++++ .../reference/machine-id/configuration.mdx | 77 ++++-- 4 files changed, 300 insertions(+), 19 deletions(-) create mode 100644 docs/pages/enroll-resources/machine-id/workload-identity/workload-attestation.mdx diff --git a/docs/cspell.json b/docs/cspell.json index 06dc87b1b1986..dfbf86f56a1a8 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -116,6 +116,7 @@ "Kanban", "Keycloak", "Keyspaces", + "Kubelet", "Kubernetes", "Kubes", "LDAPS", @@ -284,6 +285,7 @@ "argoproj", "armv", "atburke", + "attested", "attrname", "auditctl", "auditd", diff --git a/docs/pages/enroll-resources/machine-id/workload-identity.mdx b/docs/pages/enroll-resources/machine-id/workload-identity.mdx index d8f78125ec175..af56023caad1f 100644 --- a/docs/pages/enroll-resources/machine-id/workload-identity.mdx +++ b/docs/pages/enroll-resources/machine-id/workload-identity.mdx @@ -148,6 +148,7 @@ Teleport's Workload Identity currently only supports issuing X.509-SVIDs. - [Getting Started](./workload-identity/getting-started.mdx): How to configure Teleport for Workload Identity. - [Best Practices](./workload-identity/best-practices.mdx): Best practices for using Workload Identity in Production. +- [Workload Attestation](./workload-identity/workload-attestation.mdx): Learn about using Workload Attestation to securely issue SVIDs to specific workloads. - [TSH Support](./workload-identity/tsh.mdx): How to use `tsh` with Workload Identity to issue SVIDs to users. - [AWS Roles Anywhere](./workload-identity/aws-roles-anywhere.mdx): Configuring AWS to accept Workload ID certificates as authentication using AWS Roles Anywhere. diff --git a/docs/pages/enroll-resources/machine-id/workload-identity/workload-attestation.mdx b/docs/pages/enroll-resources/machine-id/workload-identity/workload-attestation.mdx new file mode 100644 index 0000000000000..8bc4846432628 --- /dev/null +++ b/docs/pages/enroll-resources/machine-id/workload-identity/workload-attestation.mdx @@ -0,0 +1,239 @@ +--- +title: Workload Attestation +description: An overview of the Teleport Workload Identity Workload Attestation feature. +--- + + +Teleport Workload Identity is currently in Preview. This means that some +features may be missing. We're actively looking for design partners to help us +shape the future of Workload Identity and would love to +[hear your feedback](mailto:product@goteleport.com). + + +Workload Attestation is the process completed by `tbot` to assert the identity +of a workload that has connected to the Workload API and requested certificates. +The information gathered during attestation is used to decide which, if any, +SPIFFE IDs should be encoded into an SVID and issued to the workload. + +Workload Attestors are the individual components that perform this attestation. +They use the process ID of the workload to gather information about the workload +from platform-specific APIs. For example, the Kubernetes Workload Attestor +queries the local Kubelet API to determine which Kubernetes pod the process +belongs to. + +The result of the attestation process is known as attestation metadata. This +attestation metadata is referred to by the rules you configured for `tbot`'s +Workload API service. For example, you may state that only workloads running in +a specific Kubernetes namespace should be issued a specific SPIFFE ID. + +Additionally, this metadata is included in the log messages output by `tbot` +when it issues an SVID. This allows you to audit the issuance of SVIDs and +understand why a specific SPIFFE ID was issued to a workload. + +## Unix + +The Unix Workload Attestor is the most basic attestor and allows you to restrict +the issuance of SVIDs to specific Unix processes based on a range of criteria. + +### Attestation Metadata + +The following metadata is produced by the Unix Workload Attestor and is +available to be used when configuring rules for `tbot`'s Workload API service: + +| Field | Description | +|-------------------|------------------------------------------------------------------------------| +| `unix.attested` | Indicates that the workload has been attested by the Unix Workload Attestor. | +| `unix.pid` | The process ID of the attested workload. | +| `unix.uid` | The effective user ID of the attested workload. | +| `unix.gid` | The effective primary group ID of the attested workload. | + +## Kubernetes + +The Kubernetes Workload Attestor allows you to restrict the issuance of SVIDs +to specific Kubernetes workloads based on a range of criteria. + +It works by first determining the pod ID for a given process ID and then by +querying the local kubelet API for details about that pod. + +### Attestation Metadata + +The following metadata is produced by the Kubernetes Workload Attestor and is +available to be used when configuring rules for `tbot`'s Workload API service: + +| Field | Description | +|------------------------------|------------------------------------------------------------------------------------| +| `kubernetes.attested` | Indicates that the workload has been attested by the Kubernetes Workload Attestor. | +| `kubernetes.namespace` | The namespace of the Kubernetes Pod. | +| `kubernetes.service_account` | The service account of the Kubernetes Pod. | +| `kubernetes.pod_name` | The name of the Kubernetes Pod. | + +### Deployment Guidance + +To use Kubernetes Workload Attestation, `tbot` must be deployed as a daemon +set. This is because the unix domain socket can only be accessed by pods on the +same node as the agent. Additionally, the daemon set must have the `hostPID` +property set to `true` to allow the agent to access information about +processes within other containers. + +The daemon set must also have a service account assigned that allows it to query +the Kubelet API. This is an example role with the required RBAC: + +```yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tbot +rules: + - resources: ["pods","nodes","nodes/proxy"] + apiGroups: [""] + verbs: ["get"] +``` + +Mapping the Workload API Unix domain socket into the containers of workloads +can be done in two ways: + +- Directly configuring a hostPath volume for the `tbot` daemonset and workloads + which will need to connect to it. +- Using [spiffe-csi-driver](https://github.com/spiffe/spiffe-csi). + +Example manifests for required Kubernetes resources: + +```yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tbot +rules: + - resources: ["pods","nodes","nodes/proxy"] + apiGroups: [""] + verbs: ["get"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tbot +subjects: + - kind: ServiceAccount + name: tbot + namespace: default +roleRef: + kind: ClusterRole + name: tbot + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: tbot + namespace: default +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: tbot-config + namespace: default +data: + tbot.yaml: | + version: v2 + onboarding: + join_method: kubernetes + # replace with the name of a join token you have created. + token: example-token + storage: + type: memory + # ensure this is configured to the address of your Teleport Proxy Service. + proxy_server: example.teleport.sh:443 + services: + - type: spiffe-workload-api + listen: unix:///run/tbot/sockets/workload.sock + attestor: + kubernetes: + enabled: true + kubelet: + # skip verification of the Kubelet API certificate as this is not + # usually issued by the cluster CA. + skip_verify: true + # replace the svid entries with the SPIFFE IDs that you wish to issue, + # using the `rules` blocks to restrict these to specific Kubernetes + # workloads. + svids: + - path: /my-service + rules: + - kubernetes: + namespace: default + service_account: example-sa +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: tbot +spec: + selector: + matchLabels: + app: tbot + template: + metadata: + labels: + app: tbot + spec: + securityContext: + runAsUser: 0 + runAsGroup: 0 + hostPID: true + containers: + - name: tbot + image: public.ecr.aws/gravitational/tbot-distroless:(=teleport.version=) + imagePullPolicy: IfNotPresent + securityContext: + privileged: true + args: + - start + - -c + - /config/tbot.yaml + - --log-format + - json + volumeMounts: + - mountPath: /config + name: config + - mountPath: /var/run/secrets/tokens + name: join-sa-token + - name: tbot-sockets + mountPath: /run/tbot/sockets + readOnly: false + env: + - name: TELEPORT_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: KUBERNETES_TOKEN_PATH + value: /var/run/secrets/tokens/join-sa-token + serviceAccountName: tbot + volumes: + - name: tbot-sockets + hostPath: + path: /run/tbot/sockets + type: DirectoryOrCreate + - name: config + configMap: + name: tbot-config + - name: join-sa-token + projected: + sources: + - serviceAccountToken: + path: join-sa-token + # 600 seconds is the minimum that Kubernetes supports. We + # recommend this value is used. + expirationSeconds: 600 + # `example.teleport.sh` must be replaced with the name of + # your Teleport cluster. + audience: example.teleport.sh +``` + +## Next steps + +- [Workload Identity Overview](../workload-identity.mdx): Overview of Teleport +Workload Identity. +- [Best Practices](./best-practices.mdx): Best practices for using Workload +Identity in Production. +- Read the [configuration reference](../../../reference/machine-id/configuration.mdx) to explore +all the available configuration options. diff --git a/docs/pages/reference/machine-id/configuration.mdx b/docs/pages/reference/machine-id/configuration.mdx index 3ba87bf005797..f17189443858a 100644 --- a/docs/pages/reference/machine-id/configuration.mdx +++ b/docs/pages/reference/machine-id/configuration.mdx @@ -21,8 +21,6 @@ artifacts include configuration files, certificates, and cryptographic key material. Usually, artifacts are files, but this term is explicitly avoided because a destination isn't required to be a filesystem. -## Configuration v2 - From Teleport 14, `tbot` supports the v2 configuration version. ```yaml @@ -174,7 +172,7 @@ outputs: path: ./tbot-user ``` -### Outputs +## Outputs Outputs define what actions `tbot` should take when it runs. They describe the format of the certificates to be generated, the roles used to generate the certificates, and the @@ -183,7 +181,7 @@ destination where they should be written. There are multiple types of output. Select the one that is most appropriate for your intended use-case. -#### `identity` +### `identity` The `identity` output can be used to authenticate: @@ -224,7 +222,7 @@ app_name: grafana (!docs/pages/includes/machine-id/common-output-config.yaml!) ``` -#### `database` +### `database` The `database` output is used to generate credentials that can be used to access databases that have been configured with Teleport. @@ -255,7 +253,7 @@ format: tls (!docs/pages/includes/machine-id/common-output-config.yaml!) ``` -##### Supported formats +#### Supported formats You can provide the following values to the `format` configuration field in the `database` output type: @@ -267,7 +265,7 @@ the `database` output type: | `cockroach` | Provides `cockroach/node.key`, `cockroach/node.crt`, and `cockroach/ca.crt`. This is designed to be used with CockroachDB clients. | | `tls` | Provides `tls.key`, `tls.crt`, and `tls.cas`. This is for generic clients that require the specific file extensions. | -#### `kubernetes` +### `kubernetes` The `kubernetes` output is used to generate credentials that can be used to access Kubernetes clusters that have been configured with Teleport. @@ -290,7 +288,7 @@ kubernetes_cluster: my-cluster (!docs/pages/includes/machine-id/common-output-config.yaml!) ``` -#### `ssh_host` +### `ssh_host` The `ssh_host` output is used to generate the artifacts required to configure an OpenSSH server with Teleport in order to allow Teleport users to connect to @@ -313,7 +311,7 @@ principals: (!docs/pages/includes/machine-id/common-output-config.yaml!) ``` -#### `spiffe-svid` +### `spiffe-svid` The `spiffe-svid` output is used to generate a SPIFFE X509 SVID and write this to a configured destination. @@ -346,14 +344,14 @@ svid: (!docs/pages/includes/machine-id/common-output-config.yaml!) ``` -### Services +## Services Services are configurable long-lived components that run within `tbot`. Unlike Outputs, they may not necessarily generate artifacts. Typically, services provide supporting functionality for machine to machine access, for example, opening tunnels or providing APIs. -#### `spiffe-workload-api` +### `spiffe-workload-api` The `spiffe-workload-api` service opens a listener for a service that implements the SPIFFE Workload API. This service is used to provide SPIFFE SVIDs to @@ -372,6 +370,47 @@ type: spiffe-workload-api # - TCP: `tcp://
:` # - Unix socket: `unix:///` listen: unix:///opt/machine-id/workload.sock +# attestors allows Workload Attestation to be configured for this Workload +# API. +attestors: + # kubernetes is configuration for the Kubernetes Workload Attestor. See + # the Kubernetes Workload Attestor section for more information. + kubernetes: + # enabled specifies whether the Kubernetes Workload Attestor should be + # enabled. If unspecified, this defaults to false. + enabled: true + # kubelet holds configuration relevant to the Kubernetes Workload Attestors + # interaction with the Kubelet API. + kubelet: + # read_only_port is the port on which the Kubelet API is exposed for + # read-only operations. Since Kubernetes 1.16, the read-only port is + # typically disabled by default and secure_port should be used instead. + read_only_port: 10255 + # secure_port is the port on which the attestor should connect to the + # Kubelet secure API. If unspecified, this defaults to `10250`. This is + # mutually exclusive with ReadOnlyPort. + secure_port: 10250 + # token_path is the path to the token file that the Kubelet API client + # should use to authenticate with the Kubelet API. If unspecified, this + # defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + token_path: "/var/run/secrets/kubernetes.io/serviceaccount/token" + # ca_path is the path to the CA file that the Kubelet API client should + # use to validate the Kubelet API server's certificate. If unspecified, + # this defaults to `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`. + ca_path: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + # skip_verify is used to disable verification of the Kubelet API server's + # certificate. If unspecified, this defaults to false. + # + # If specified, the value specified in ca_path is ignored. + # + # This is useful in cases where the Kubelet API server has not been issued + # with a certificate signed by the Kubernetes cluster's CA. This is fairly + # common with a number of Kubernetes distributions. + skip_verify: true + # anonymous is used to disable authentication with the Kubelet API. If + # unspecified, this defaults to false. If set, the token_path field is + # ignored. + anonymous: false # svids specifies the SPIFFE SVIDs that the Workload API should provide. svids: # path specifies what the path element should be requested for the SPIFFE @@ -421,7 +460,7 @@ svids: gid: 50 ``` -#### `database-tunnel` +### `database-tunnel` The `database-tunnel` service opens a listener for a service that tunnels connections to a database server. @@ -453,7 +492,7 @@ database: postgres username: postgres ``` -#### `application-tunnel` +### `application-tunnel` The `application-tunnel` service opens a listener that tunnels connections to an application in Teleport. It supports both HTTP and TCP applications. This is @@ -481,7 +520,7 @@ listen: tcp://127.0.0.1:8084 app_name: my-application ``` -#### `ssh-multiplexer` +### `ssh-multiplexer` The `ssh-multiplexer` service opens a listener for a high-performance local SSH multiplexer. This is designed for use-cases which create a large number @@ -546,7 +585,7 @@ destination: - `v1.sock`: the Unix socket that the multiplexer listens on. - `agent.sock`: the Unix socket that the SSH agent listens on. -##### Using the SSH multiplexer programmatically +#### Using the SSH multiplexer programmatically To use the SSH multiplexer programmatically, your SSH client library will need to support one of two things: @@ -690,7 +729,7 @@ func main() { ``` -### Destinations +## Destinations A destination is somewhere that `tbot` can read and write artifacts. @@ -702,7 +741,7 @@ Destinations are used in two places in the `tbot` configuration: Destinations come in multiple types. Usually, the `directory` type is the most appropriate. -#### `directory` +### `directory` The `directory` destination type stores artifacts as files in a specified directory. @@ -739,7 +778,7 @@ symlinks: try-secure acls: try ``` -#### `memory` +### `memory` The `memory` destination type stores artifacts in the process memory. When the process exits, nothing is persisted. This destination type @@ -753,7 +792,7 @@ Configuration: type: memory ``` -#### `kubernetes_secret` +### `kubernetes_secret` The `kubernetes_secret` destination type stores artifacts in a Kubernetes secret. This allows them to be mounted into other containers deployed in From eef300af85a164868daf073056f5408b34a79d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Smoli=C5=84ski?= Date: Mon, 19 Aug 2024 14:48:20 +0200 Subject: [PATCH 14/51] tsh UI: Squash Okta roles in tsh login output (#45366) --- constants.go | 7 +++++++ tool/tsh/common/tsh.go | 31 ++++++++++++++++++++++++++++++- tool/tsh/common/tsh_test.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/constants.go b/constants.go index 912a3b2c605dd..bf003bd18741f 100644 --- a/constants.go +++ b/constants.go @@ -944,3 +944,10 @@ const ( // debug service. DebugServiceSocketName = "debug.sock" ) + +const ( + // OktaAccessRoleContext is the context used to name Okta Access role created by Okta access list sync + OktaAccessRoleContext = "access-okta-acl-role" + // OktaReviewerRoleContext is the context used to name Okta Reviewer role created by Okta Access List sync + OktaReviewerRoleContext = "reviewer-okta-acl-role" +) diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index f5c4432aeafa8..230db44722d38 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -4477,7 +4477,7 @@ func printStatus(debug bool, p *profileInfo, env map[string]string, isActive boo if cluster != "" { fmt.Printf(" Cluster: %v\n", cluster) } - fmt.Printf(" Roles: %v\n", strings.Join(p.Roles, ", ")) + fmt.Printf(" Roles: %v\n", rolesToString(debug, p.Roles)) if debug { var count int for k, v := range p.Traits { @@ -4535,6 +4535,35 @@ func printStatus(debug bool, p *profileInfo, env map[string]string, isActive boo fmt.Printf("\n") } +func isOktaRole(role string) bool { + return strings.Contains(role, teleport.OktaReviewerRoleContext) || strings.Contains(role, teleport.OktaAccessRoleContext) +} + +func rolesToString(debug bool, roles []string) string { + sort.Strings(roles) + var nonOktaRoles, oktaRoles []string + for _, role := range roles { + if isOktaRole(role) { + oktaRoles = append(oktaRoles, role) + } else { + nonOktaRoles = append(nonOktaRoles, role) + } + } + if len(oktaRoles) == 0 { + return strings.Join(nonOktaRoles, ", ") + } + + squashRolesThreshold := 9 + + if !debug && len(nonOktaRoles)+len(oktaRoles) > squashRolesThreshold { + oktaRolesText := fmt.Sprintf("and %v more Okta access list roles ...", len(oktaRoles)) + return strings.Join(append(nonOktaRoles, oktaRolesText), ", ") + } + // Keep okta roles at the end of list. + out := append(nonOktaRoles, oktaRoles...) + return strings.Join(out, ", ") +} + // printLoginInformation displays the provided profile information to the user. func printLoginInformation(cf *CLIConf, profile *client.ProfileStatus, profiles []*client.ProfileStatus, accessListsToReview []*accesslist.AccessList) error { env := getTshEnv() diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index 6f5cd9d7f1822..f19ac7891c466 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -6135,3 +6135,35 @@ func TestProxyTemplatesMakeClient(t *testing.T) { }) } } + +func TestRolesToString(t *testing.T) { + tests := []struct { + name string + roles []string + expected string + debug bool + }{ + { + name: "empty", + roles: []string{}, + expected: "", + }, + { + name: "exceed threshold okta roles should be squashed", + roles: append([]string{"app-figma-reviewer-okta-acl-role", "app-figma-access-okta-acl-role"}, []string{"r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"}...), + expected: "r1, r10, r2, r3, r4, r5, r6, r7, r8, r9, and 2 more Okta access list roles ...", + }, + { + name: "debug flag", + roles: append([]string{"app-figma-reviewer-okta-acl-role", "app-figma-access-okta-acl-role"}, []string{"r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"}...), + debug: true, + expected: "r1, r10, r2, r3, r4, r5, r6, r7, r8, r9, app-figma-access-okta-acl-role, app-figma-reviewer-okta-acl-role", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.expected, rolesToString(tc.debug, tc.roles)) + }) + } +} From 54ff17309824667289c41b2cbadceccf472a5b30 Mon Sep 17 00:00:00 2001 From: Forrest <30576607+fspmarshall@users.noreply.github.com> Date: Mon, 19 Aug 2024 06:38:26 -0700 Subject: [PATCH 15/51] improve max nodes benchmark (#45545) * improve max nodes benchmark * Update Makefile Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- Makefile | 2 +- lib/cache/cache_test.go | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 99f1cf6acb6f3..da61cda99f4bd 100644 --- a/Makefile +++ b/Makefile @@ -885,7 +885,7 @@ endif # todo: Use gotestsum when it is compatible with benchmark output. Currently will consider all benchmarks failed. .PHONY: test-go-bench test-go-bench: PACKAGES = $(shell grep --exclude-dir api --include "*_test.go" -lr testing.B . | xargs dirname | xargs go list | sort -u) -test-go-bench: BENCHMARK_SKIP_PATTERN = "^BenchmarkRoot|^BenchmarkGetMaxNodes$$" +test-go-bench: BENCHMARK_SKIP_PATTERN = "^BenchmarkRoot" test-go-bench: | $(TEST_LOG_DIR) go test -run ^$$ -bench . -skip $(BENCHMARK_SKIP_PATTERN) -benchtime 1x $(PACKAGES) \ | tee $(TEST_LOG_DIR)/bench.txt diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index c733695edeab1..1161aa27205ac 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -925,7 +925,7 @@ cpu: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz BenchmarkGetMaxNodes-16 1 1029199093 ns/op */ func BenchmarkGetMaxNodes(b *testing.B) { - benchGetNodes(b, backend.DefaultRangeLimit) + benchGetNodes(b, 1_000_000) } func benchGetNodes(b *testing.B, nodeCount int) { @@ -933,18 +933,32 @@ func benchGetNodes(b *testing.B, nodeCount int) { require.NoError(b, err) defer p.Close() - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() - for i := 0; i < nodeCount; i++ { - server := suite.NewServer(types.KindNode, uuid.New().String(), "127.0.0.1:2022", apidefaults.Namespace) - _, err := p.presenceS.UpsertNode(ctx, server) - require.NoError(b, err) + createErr := make(chan error, 1) + go func() { + for i := 0; i < nodeCount; i++ { + server := suite.NewServer(types.KindNode, uuid.New().String(), "127.0.0.1:2022", apidefaults.Namespace) + _, err := p.presenceS.UpsertNode(ctx, server) + if err != nil { + createErr <- err + return + } + } + }() + + timeout := time.After(time.Second * 90) + + for i := 0; i < nodeCount; i++ { select { case event := <-p.eventsC: require.Equal(b, EventProcessed, event.Type) - case <-time.After(200 * time.Millisecond): - b.Fatalf("timeout waiting for event, iteration=%d", i) + case err := <-createErr: + b.Fatalf("failed to create node: %v", err) + case <-timeout: + b.Fatalf("timeout waiting for event, progress=%d", i) } } From af43abc3ff46f0b32154271550d107fcd75d9e2b Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Mon, 19 Aug 2024 16:01:28 +0200 Subject: [PATCH 16/51] Update Vite to 5.4.1 (#45580) --- package.json | 2 +- pnpm-lock.yaml | 67 ++++++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 629ae25573c62..8064763ccf241 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "prettier": "^3.3.3", "storybook": "^8.2.7", "typescript": "^5.5.4", - "vite": "^5.3.5" + "vite": "^5.4.1" }, "dependencies": { "@codemirror/autocomplete": "^6.17.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fd352dff302c..cbb5527c2e0d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: version: 8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4) '@storybook/react-vite': specifier: ^8.2.7 - version: 8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.19.2)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1)) + version: 8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.19.2)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1)) '@testing-library/jest-dom': specifier: ^6.4.8 version: 6.4.8 @@ -162,8 +162,8 @@ importers: specifier: ^5.5.4 version: 5.5.4 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.11)(terser@5.31.1) + specifier: ^5.4.1 + version: 5.4.1(@types/node@20.14.11)(terser@5.31.1) e/web/teleport: {} @@ -192,7 +192,7 @@ importers: version: 21.1.7 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)) + version: 3.7.0(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)) babel-plugin-styled-components: specifier: ^2.1.4 version: 2.1.4(@babel/core@7.25.2)(styled-components@6.1.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -243,10 +243,10 @@ importers: version: 7.14.1(eslint@8.57.0)(typescript@5.5.4) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.3.0(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)) + version: 3.3.0(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)) + version: 4.3.2(typescript@5.5.4)(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)) web/packages/design: dependencies: @@ -447,7 +447,7 @@ importers: version: 1.2.2 electron-vite: specifier: ^2.3.0 - version: 2.3.0(@swc/core@1.7.4)(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)) + version: 2.3.0(@swc/core@1.7.4)(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)) events: specifier: 3.3.0 version: 3.3.0 @@ -5366,8 +5366,8 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -6351,8 +6351,8 @@ packages: vite: optional: true - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6360,6 +6360,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -6372,6 +6373,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -8005,13 +8008,13 @@ snapshots: '@types/yargs': 17.0.29 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.5.4) - vite: 5.3.5(@types/node@20.14.11)(terser@5.31.1) + vite: 5.4.1(@types/node@20.14.11)(terser@5.31.1) optionalDependencies: typescript: 5.5.4 @@ -8497,7 +8500,7 @@ snapshots: dependencies: storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)) - '@storybook/builder-vite@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1))': + '@storybook/builder-vite@8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1))': dependencies: '@storybook/csf-plugin': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2))) '@types/find-cache-dir': 3.2.1 @@ -8509,7 +8512,7 @@ snapshots: magic-string: 0.30.11 storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)) ts-dedent: 2.2.0 - vite: 5.3.5(@types/node@20.14.11)(terser@5.31.1) + vite: 5.4.1(@types/node@20.14.11)(terser@5.31.1) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -8582,11 +8585,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)) - '@storybook/react-vite@8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.19.2)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1))': + '@storybook/react-vite@8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.19.2)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1)) '@rollup/pluginutils': 5.1.0(rollup@4.19.2) - '@storybook/builder-vite': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.11)(terser@5.31.1)) + '@storybook/builder-vite': 8.2.7(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4)(vite@5.4.1(@types/node@20.14.11)(terser@5.31.1)) '@storybook/react': 8.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(typescript@5.5.4) find-up: 5.0.0 magic-string: 0.30.11 @@ -8596,7 +8599,7 @@ snapshots: resolve: 1.22.8 storybook: 8.2.7(@babel/preset-env@7.25.3(@babel/core@7.25.2)) tsconfig-paths: 4.2.0 - vite: 5.3.5(@types/node@20.14.11)(terser@5.31.1) + vite: 5.4.1(@types/node@20.14.11)(terser@5.31.1) transitivePeerDependencies: - '@preact/preset-vite' - rollup @@ -9238,10 +9241,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1))': dependencies: '@swc/core': 1.7.4 - vite: 5.3.5(@types/node@22.0.2)(terser@5.31.1) + vite: 5.4.1(@types/node@22.0.2)(terser@5.31.1) transitivePeerDependencies: - '@swc/helpers' @@ -10426,7 +10429,7 @@ snapshots: electron-to-chromium@1.5.4: {} - electron-vite@2.3.0(@swc/core@1.7.4)(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)): + electron-vite@2.3.0(@swc/core@1.7.4)(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)): dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) @@ -10434,7 +10437,7 @@ snapshots: esbuild: 0.21.5 magic-string: 0.30.11 picocolors: 1.0.1 - vite: 5.3.5(@types/node@22.0.2)(terser@5.31.1) + vite: 5.4.1(@types/node@22.0.2)(terser@5.31.1) optionalDependencies: '@swc/core': 1.7.4 transitivePeerDependencies: @@ -12750,7 +12753,7 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.40: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -13890,35 +13893,35 @@ snapshots: extsprintf: 1.4.1 optional: true - vite-plugin-wasm@3.3.0(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)): + vite-plugin-wasm@3.3.0(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)): dependencies: - vite: 5.3.5(@types/node@22.0.2)(terser@5.31.1) + vite: 5.4.1(@types/node@22.0.2)(terser@5.31.1) - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.0.2)(terser@5.31.1)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.1(@types/node@22.0.2)(terser@5.31.1)): dependencies: debug: 4.3.6 globrex: 0.1.2 tsconfck: 3.1.0(typescript@5.5.4) optionalDependencies: - vite: 5.3.5(@types/node@22.0.2)(terser@5.31.1) + vite: 5.4.1(@types/node@22.0.2)(terser@5.31.1) transitivePeerDependencies: - supports-color - typescript - vite@5.3.5(@types/node@20.14.11)(terser@5.31.1): + vite@5.4.1(@types/node@20.14.11)(terser@5.31.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 + postcss: 8.4.41 rollup: 4.19.2 optionalDependencies: '@types/node': 20.14.11 fsevents: 2.3.3 terser: 5.31.1 - vite@5.3.5(@types/node@22.0.2)(terser@5.31.1): + vite@5.4.1(@types/node@22.0.2)(terser@5.31.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 + postcss: 8.4.41 rollup: 4.19.2 optionalDependencies: '@types/node': 22.0.2 From 233ee5216a5e580b6652aea586c857ed3667eda4 Mon Sep 17 00:00:00 2001 From: Bernard Kim Date: Mon, 19 Aug 2024 09:49:47 -0700 Subject: [PATCH 17/51] Slack plugin now lists logins permitted by requested role (#45392) * Include logins * Add unit tests * Handle access denied gracefully * Update documentation with required permissions * Reduce doc * Address feedback * Imported twice * Improve loggin; Replace none -> - --- .../plugins/rbac-with-friendly-name.mdx | 5 + integrations/access/accessrequest/app.go | 22 +++++ integrations/access/accessrequest/app_test.go | 84 +++++++++++++++++ integrations/access/accessrequest/bot.go | 3 +- integrations/access/accessrequest/message.go | 45 ++++++++- .../access/accessrequest/message_test.go | 91 +++++++++++++++++++ integrations/access/common/teleport/client.go | 1 + integrations/lib/escape.go | 20 +++- integrations/lib/escape_test.go | 12 +++ integrations/lib/plugindata/access_request.go | 20 ++++ .../lib/plugindata/access_request_test.go | 12 ++- 11 files changed, 302 insertions(+), 13 deletions(-) create mode 100644 integrations/access/accessrequest/app_test.go create mode 100644 integrations/access/accessrequest/message_test.go diff --git a/docs/pages/includes/plugins/rbac-with-friendly-name.mdx b/docs/pages/includes/plugins/rbac-with-friendly-name.mdx index d390be84751da..553f036c9820b 100644 --- a/docs/pages/includes/plugins/rbac-with-friendly-name.mdx +++ b/docs/pages/includes/plugins/rbac-with-friendly-name.mdx @@ -24,6 +24,11 @@ spec: - resources: ['access_list'] verbs: ['list', 'read'] + # Optional: To display logins permitted by roles, the plugin also needs + # permission to read the role resource. + - resources: ['role'] + verbs: ['read'] + # Optional: To display user-friendly names in resource-based Access # Requests instead of resource IDs, the plugin also needs permission # to list the resources being requested. Include this along with the diff --git a/integrations/access/accessrequest/app.go b/integrations/access/accessrequest/app.go index 9d32482824fba..952e539e3ac6e 100644 --- a/integrations/access/accessrequest/app.go +++ b/integrations/access/accessrequest/app.go @@ -234,12 +234,20 @@ func (a *App) onPendingRequest(ctx context.Context, req types.AccessRequest) err return trace.Wrap(err) } + loginsByRole, err := a.getLoginsByRole(ctx, req) + if trace.IsAccessDenied(err) { + log.Warnf("Missing permissions to get logins by role. Please add role.read to the associated role. error: %s", err) + } else if err != nil { + return trace.Wrap(err) + } + reqData := pd.AccessRequestData{ User: req.GetUser(), Roles: req.GetRoles(), RequestReason: req.GetRequestReason(), SystemAnnotations: req.GetSystemAnnotations(), Resources: resourceNames, + LoginsByRole: loginsByRole, } _, err = a.pluginData.Create(ctx, reqID, PluginData{AccessRequestData: reqData}) @@ -488,6 +496,20 @@ func (a *App) updateMessages(ctx context.Context, reqID string, tag pd.Resolutio return nil } +func (a *App) getLoginsByRole(ctx context.Context, req types.AccessRequest) (map[string][]string, error) { + loginsByRole := make(map[string][]string, len(req.GetRoles())) + + for _, role := range req.GetRoles() { + currentRole, err := a.apiClient.GetRole(ctx, role) + if err != nil { + return nil, trace.Wrap(err) + } + loginsByRole[role] = currentRole.GetLogins(types.Allow) + } + + return loginsByRole, nil +} + func (a *App) getResourceNames(ctx context.Context, req types.AccessRequest) ([]string, error) { resourceNames := make([]string, 0, len(req.GetRequestedResourceIDs())) resourcesByCluster := accessrequest.GetResourceIDsByCluster(req) diff --git a/integrations/access/accessrequest/app_test.go b/integrations/access/accessrequest/app_test.go new file mode 100644 index 0000000000000..70e855ce3a897 --- /dev/null +++ b/integrations/access/accessrequest/app_test.go @@ -0,0 +1,84 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package accessrequest + +import ( + "context" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/integrations/access/common/teleport" +) + +type mockTeleportClient struct { + mock.Mock + teleport.Client +} + +func (m *mockTeleportClient) GetRole(ctx context.Context, name string) (types.Role, error) { + args := m.Called(ctx, name) + return args.Get(0).(types.Role), args.Error(1) +} + +func TestGetLoginsByRole(t *testing.T) { + teleportClient := &mockTeleportClient{} + teleportClient.On("GetRole", mock.Anything, "admin").Return(&types.RoleV6{ + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + Logins: []string{"root", "foo", "bar"}, + }, + }, + }, (error)(nil)) + teleportClient.On("GetRole", mock.Anything, "foo").Return(&types.RoleV6{ + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + Logins: []string{"foo"}, + }, + }, + }, (error)(nil)) + teleportClient.On("GetRole", mock.Anything, "dev").Return(&types.RoleV6{ + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + Logins: []string{}, + }, + }, + }, (error)(nil)) + + app := App{ + apiClient: teleportClient, + } + ctx := context.Background() + loginsByRole, err := app.getLoginsByRole(ctx, &types.AccessRequestV3{ + Spec: types.AccessRequestSpecV3{ + Roles: []string{"admin", "foo", "dev"}, + }, + }) + require.NoError(t, err) + + expected := map[string][]string{ + "admin": {"root", "foo", "bar"}, + "foo": {"foo"}, + "dev": {}, + } + require.Equal(t, expected, loginsByRole) + teleportClient.AssertNumberOfCalls(t, "GetRole", 3) +} diff --git a/integrations/access/accessrequest/bot.go b/integrations/access/accessrequest/bot.go index 2425ded76b996..ea92f962bf564 100644 --- a/integrations/access/accessrequest/bot.go +++ b/integrations/access/accessrequest/bot.go @@ -23,7 +23,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" - "github.com/gravitational/teleport/integrations/lib/plugindata" pd "github.com/gravitational/teleport/integrations/lib/plugindata" ) @@ -39,5 +38,5 @@ type MessagingBot interface { // This is used to change the access-request status and number of required approval remaining UpdateMessages(ctx context.Context, reqID string, data pd.AccessRequestData, messageData SentMessages, reviews []types.AccessReview) error // NotifyUser notifies the user if their access request status has changed - NotifyUser(ctx context.Context, reqID string, ard plugindata.AccessRequestData) error + NotifyUser(ctx context.Context, reqID string, ard pd.AccessRequestData) error } diff --git a/integrations/access/accessrequest/message.go b/integrations/access/accessrequest/message.go index 68cec7f271c35..b09783b41046e 100644 --- a/integrations/access/accessrequest/message.go +++ b/integrations/access/accessrequest/message.go @@ -21,6 +21,7 @@ package accessrequest import ( "fmt" "net/url" + "slices" "strings" "text/template" "time" @@ -36,7 +37,8 @@ import ( // for message section texts, so we truncate all reasons to a generous but // conservative limit const ( - requestReasonLimit = 500 + requestInlineLimit = 500 + requestReasonLimit resolutionReasonLimit ReviewReasonLimit ) @@ -70,6 +72,8 @@ func MsgStatusText(tag pd.ResolutionTag, reason string) string { return statusText } +// MsgFields constructs and returns the Access Request message. List values are +// constructed in sorted order. func MsgFields(reqID string, reqData pd.AccessRequestData, clusterName string, webProxyURL *url.URL) string { var builder strings.Builder builder.Grow(128) @@ -77,14 +81,27 @@ func MsgFields(reqID string, reqData pd.AccessRequestData, clusterName string, w msgFieldToBuilder(&builder, "ID", reqID) msgFieldToBuilder(&builder, "Cluster", clusterName) + sortedRoles := sortList(reqData.Roles) + if len(reqData.User) > 0 { msgFieldToBuilder(&builder, "User", reqData.User) } - if len(reqData.Roles) > 0 { - msgFieldToBuilder(&builder, "Role(s)", strings.Join(reqData.Roles, ",")) + if len(reqData.LoginsByRole) > 0 { + for _, role := range sortedRoles { + sortedLogins := sortList(reqData.LoginsByRole[role]) + loginStr := "-" + if len(sortedLogins) > 0 { + loginStr = strings.Join(sortedLogins, ", ") + } + msgFieldToBuilder(&builder, "Role", lib.MarkdownEscapeInLine(role, requestInlineLimit), + "Login(s)", lib.MarkdownEscapeInLine(loginStr, requestInlineLimit)) + } + } else if len(reqData.Roles) > 0 { + msgFieldToBuilder(&builder, "Role(s)", lib.MarkdownEscapeInLine(strings.Join(sortedRoles, ","), requestInlineLimit)) } if len(reqData.Resources) > 0 { - msgFieldToBuilder(&builder, "Resource(s)", strings.Join(reqData.Resources, ",")) + sortedResources := sortList(reqData.Resources) + msgFieldToBuilder(&builder, "Resource(s)", lib.MarkdownEscapeInLine(strings.Join(sortedResources, ","), requestInlineLimit)) } if reqData.RequestReason != "" { msgFieldToBuilder(&builder, "Reason", lib.MarkdownEscape(reqData.RequestReason, requestReasonLimit)) @@ -134,10 +151,28 @@ func MsgReview(review types.AccessReview) (string, error) { return builder.String(), nil } -func msgFieldToBuilder(b *strings.Builder, field, value string) { +func msgFieldToBuilder(b *strings.Builder, field, value string, additionalFields ...string) { b.WriteString("*") b.WriteString(field) b.WriteString("*: ") b.WriteString(value) + + for i := 0; i < len(additionalFields)-1; i += 2 { + field := additionalFields[i] + value := additionalFields[i+1] + b.WriteString(" *") + b.WriteString(field) + b.WriteString("*: ") + b.WriteString(value) + } + b.WriteString("\n") } + +// sortedList returns a sorted copy of the src. +func sortList(src []string) []string { + sorted := make([]string, len(src)) + copy(sorted, src) + slices.Sort(sorted) + return sorted +} diff --git a/integrations/access/accessrequest/message_test.go b/integrations/access/accessrequest/message_test.go new file mode 100644 index 0000000000000..ca5ba448e2457 --- /dev/null +++ b/integrations/access/accessrequest/message_test.go @@ -0,0 +1,91 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package accessrequest + +import ( + "fmt" + "net/url" + + "github.com/gravitational/teleport/integrations/lib/plugindata" +) + +func ExampleMsgFields_roles() { + id := "00000000-0000-0000-0000-000000000000" + req := plugindata.AccessRequestData{ + User: "example@goteleport.com", + Roles: []string{"foo", "bar"}, + Resources: []string{"/example.teleport.sh/node/0000"}, + RequestReason: "test", + } + cluster := "example.teleport.sh" + webProxyURL := &url.URL{ + Scheme: "https", + Host: "example.teleport.sh", + RawPath: "web/requests/00000000-0000-0000-0000-000000000000", + } + + msg := MsgFields(id, req, cluster, webProxyURL) + fmt.Println(msg) + + // Output: *ID*: 00000000-0000-0000-0000-000000000000 + // *Cluster*: example.teleport.sh + // *User*: example@goteleport.com + // *Role(s)*: `bar,foo` + // *Resource(s)*: `/example.teleport.sh/node/0000` + // *Reason*: ``` + // test``` + // *Link*: https://example.teleport.sh/web/requests/00000000-0000-0000-0000-000000000000 +} + +func ExampleMsgFields_logins() { + id := "00000000-0000-0000-0000-000000000000" + req := plugindata.AccessRequestData{ + User: "example@goteleport.com", + Roles: []string{"admin", "foo", "bar", "dev"}, + LoginsByRole: map[string][]string{ + "admin": {"foo", "bar", "root"}, + "foo": {"foo"}, + "bar": {"bar"}, + "dev": {}, + }, + Resources: []string{"/example.teleport.sh/node/0000"}, + RequestReason: "test", + } + cluster := "example.teleport.sh" + webProxyURL := &url.URL{ + Scheme: "https", + Host: "example.teleport.sh", + RawPath: "web/requests/00000000-0000-0000-0000-000000000000", + } + + msg := MsgFields(id, req, cluster, webProxyURL) + fmt.Println(msg) + + // Output: *ID*: 00000000-0000-0000-0000-000000000000 + // *Cluster*: example.teleport.sh + // *User*: example@goteleport.com + // *Role*: `admin` *Login(s)*: `bar, foo, root` + // *Role*: `bar` *Login(s)*: `bar` + // *Role*: `dev` *Login(s)*: `-` + // *Role*: `foo` *Login(s)*: `foo` + // *Resource(s)*: `/example.teleport.sh/node/0000` + // *Reason*: ``` + // test``` + // *Link*: https://example.teleport.sh/web/requests/00000000-0000-0000-0000-000000000000 +} diff --git a/integrations/access/common/teleport/client.go b/integrations/access/common/teleport/client.go index 675c9578d939e..081c4c17b6aa8 100644 --- a/integrations/access/common/teleport/client.go +++ b/integrations/access/common/teleport/client.go @@ -36,6 +36,7 @@ type Client interface { types.Events Ping(context.Context) (proto.PingResponse, error) GetAccessRequests(ctx context.Context, filter types.AccessRequestFilter) ([]types.AccessRequest, error) + GetRole(ctx context.Context, name string) (types.Role, error) SubmitAccessReview(ctx context.Context, params types.AccessReviewSubmission) (types.AccessRequest, error) SetAccessRequestState(ctx context.Context, params types.AccessRequestUpdate) error ListResources(ctx context.Context, req proto.ListResourcesRequest) (*types.ListResourcesResponse, error) diff --git a/integrations/lib/escape.go b/integrations/lib/escape.go index 80af0b95d6a8f..c8b9f80ab6126 100644 --- a/integrations/lib/escape.go +++ b/integrations/lib/escape.go @@ -26,15 +26,29 @@ import "strings" // Backticks are escaped and thus count as two runes for the purpose of the // truncation. func MarkdownEscape(t string, n int) string { + return markdownEscape(t, n, "```\n", "```") +} + +// MarkdownEscapeInLine wraps some text `t` in backticks (escaping any backtick +// inside the message), limiting the length of the message to `n` runes (inside +// the single preformatted block). The text is trimmed before escaping. +// Backticks are escaped and thus count as two runes for the purpose of the +// truncation. +func MarkdownEscapeInLine(t string, n int) string { + return markdownEscape(t, n, "`", "`") +} + +func markdownEscape(t string, n int, startBackticks, endBackticks string) string { t = strings.TrimSpace(t) if t == "" { return "(empty)" } + var b strings.Builder - b.WriteString("```\n") + b.WriteString(startBackticks) for i, r := range t { if i >= n { - b.WriteString("``` (truncated)") + b.WriteString(endBackticks + " (truncated)") return b.String() } b.WriteRune(r) @@ -45,6 +59,6 @@ func MarkdownEscape(t string, n int) string { n-- } } - b.WriteString("```") + b.WriteString(endBackticks) return b.String() } diff --git a/integrations/lib/escape_test.go b/integrations/lib/escape_test.go index 930c7b0995a8a..39474fb1b2a0d 100644 --- a/integrations/lib/escape_test.go +++ b/integrations/lib/escape_test.go @@ -31,3 +31,15 @@ func ExampleMarkdownEscape() { // "```\n`\ufefffoo`\ufeff `\ufeffbar`\ufeff```" // "```\n1234567890``` (truncated)" } + +func ExampleMarkdownEscapeInLine() { + fmt.Printf("%q\n", MarkdownEscapeInLine(" ", 1000)) + fmt.Printf("%q\n", MarkdownEscapeInLine("abc", 1000)) + fmt.Printf("%q\n", MarkdownEscapeInLine("`foo` `bar`", 1000)) + fmt.Printf("%q\n", MarkdownEscapeInLine(" 123456789012345 ", 10)) + + // Output: "(empty)" + // "`abc`" + // "``\ufefffoo`\ufeff `\ufeffbar`\ufeff`" + // "`1234567890` (truncated)" +} diff --git a/integrations/lib/plugindata/access_request.go b/integrations/lib/plugindata/access_request.go index 451a849e20aa2..fd70d44927144 100644 --- a/integrations/lib/plugindata/access_request.go +++ b/integrations/lib/plugindata/access_request.go @@ -48,6 +48,7 @@ type AccessRequestData struct { SystemAnnotations map[string][]string Resources []string SuggestedReviewers []string + LoginsByRole map[string][]string } // DecodeAccessRequestData deserializes a string map to PluginData struct. @@ -92,6 +93,17 @@ func DecodeAccessRequestData(dataMap map[string]string) (data AccessRequestData, data.SuggestedReviewers = nil } } + + if str, ok := dataMap["logins_by_role"]; ok { + err = json.Unmarshal([]byte(str), &data.LoginsByRole) + if err != nil { + err = trace.Wrap(err) + return + } + if len(data.LoginsByRole) == 0 { + data.LoginsByRole = nil + } + } return } @@ -135,5 +147,13 @@ func EncodeAccessRequestData(data AccessRequestData) (map[string]string, error) } result["suggested_reviewers"] = string(reviewers) } + + if len(data.LoginsByRole) != 0 { + logins, err := json.Marshal(data.LoginsByRole) + if err != nil { + return nil, trace.Wrap(err) + } + result["logins_by_role"] = string(logins) + } return result, nil } diff --git a/integrations/lib/plugindata/access_request_test.go b/integrations/lib/plugindata/access_request_test.go index 05c128da7aa83..a19a5ebd1c9d0 100644 --- a/integrations/lib/plugindata/access_request_test.go +++ b/integrations/lib/plugindata/access_request_test.go @@ -33,12 +33,15 @@ var sampleAccessRequestData = AccessRequestData{ ResolutionTag: ResolvedApproved, ResolutionReason: "foo ok", SuggestedReviewers: []string{"foouser"}, + LoginsByRole: map[string][]string{ + "role-foo": {"login-foo", "login-bar"}, + }, } func TestEncodeAccessRequestData(t *testing.T) { dataMap, err := EncodeAccessRequestData(sampleAccessRequestData) assert.NoError(t, err) - assert.Len(t, dataMap, 8) + assert.Len(t, dataMap, 9) assert.Equal(t, "user-foo", dataMap["user"]) assert.Equal(t, "role-foo,role-bar", dataMap["roles"]) assert.Equal(t, `["cluster/node/foo","cluster/node/bar"]`, dataMap["resources"]) @@ -46,7 +49,9 @@ func TestEncodeAccessRequestData(t *testing.T) { assert.Equal(t, "3", dataMap["reviews_count"]) assert.Equal(t, "APPROVED", dataMap["resolution"]) assert.Equal(t, "foo ok", dataMap["resolve_reason"]) - assert.Equal(t, "[\"foouser\"]", dataMap["suggested_reviewers"]) + assert.Equal(t, `["foouser"]`, dataMap["suggested_reviewers"]) + assert.Equal(t, `{"role-foo":["login-foo","login-bar"]}`, dataMap["logins_by_role"]) + } func TestDecodeAccessRequestData(t *testing.T) { @@ -58,7 +63,8 @@ func TestDecodeAccessRequestData(t *testing.T) { "reviews_count": "3", "resolution": "APPROVED", "resolve_reason": "foo ok", - "suggested_reviewers": "[\"foouser\"]", + "suggested_reviewers": `["foouser"]`, + "logins_by_role": `{"role-foo":["login-foo","login-bar"]}`, }) assert.NoError(t, err) assert.Equal(t, sampleAccessRequestData, pluginData) From 46b18b8f228c6b64a741c5c8cf149199d0a50c95 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Mon, 19 Aug 2024 11:01:11 -0600 Subject: [PATCH 18/51] Increase timeout for DB tests (#45572) 1 second doesn't seem to be enough time for CI. See https://github.com/gravitational/teleport/actions/runs/10425674958/job/28877085681 for example. --- lib/srv/db/audit_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/srv/db/audit_test.go b/lib/srv/db/audit_test.go index f5bd259bd19f1..d4bb2b221f4c7 100644 --- a/lib/srv/db/audit_test.go +++ b/lib/srv/db/audit_test.go @@ -416,8 +416,8 @@ func waitForAnyEvent(t *testing.T, testCtx *testContext) events.AuditEvent { select { case event := <-testCtx.emitter.C(): return event - case <-time.After(time.Second): - require.FailNow(t, "timed out waiting for an audit event", "didn't receive any event after 1 second") + case <-time.After(3 * time.Second): + require.FailNow(t, "timed out waiting for an audit event", "didn't receive any event in time") } return nil } @@ -463,8 +463,8 @@ func waitForEvent(t *testing.T, testCtx *testContext, code string) events.AuditE continue } return event - case <-time.After(time.Second): - require.FailNow(t, "timed out waiting for an audit event", "didn't receive %v event after 1 second", code) + case <-time.After(3 * time.Second): + require.FailNow(t, "timed out waiting for an audit event", "didn't receive %v event in time", code) } } } From 7f35ef11675a3a683251a9d8b07106e30a7656bf Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Mon, 19 Aug 2024 14:53:49 -0300 Subject: [PATCH 19/51] Rollback Go to 1.22.6 (#45593) --- .golangci.yml | 2 +- build.assets/Dockerfile-grpcbox | 2 +- build.assets/tooling/go.mod | 2 +- build.assets/versions.mk | 2 +- go.mod | 2 +- integrations/event-handler/go.mod | 2 +- integrations/terraform/go.mod | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index df34ec1f5fe02..e1c59dc06dbfa 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -196,6 +196,6 @@ output: uniq-by-line: false run: - go: '1.23' + go: '1.22' build-tags: [] timeout: 15m diff --git a/build.assets/Dockerfile-grpcbox b/build.assets/Dockerfile-grpcbox index 09972f9de5132..dcb558518d7f1 100644 --- a/build.assets/Dockerfile-grpcbox +++ b/build.assets/Dockerfile-grpcbox @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -FROM docker.io/golang:1.23 +FROM docker.io/golang:1.22 # Image layers go from less likely to most likely to change. RUN apt-get update && \ diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 463bf493ddd1b..14db47e7fa4c9 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/build.assets/tooling -go 1.23.0 +go 1.22.6 require ( github.com/Masterminds/sprig/v3 v3.2.3 diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 39fca72040d5a..9b23853ec6ad9 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -3,7 +3,7 @@ # Keep versions in sync with devbox.json, when applicable. # Sync with devbox.json. -GOLANG_VERSION ?= go1.23.0 +GOLANG_VERSION ?= go1.22.6 GOLANGCI_LINT_VERSION ?= v1.60.1 NODE_VERSION ?= 20.14.0 diff --git a/go.mod b/go.mod index 67a8ee5b5c29e..2c595a779134d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport -go 1.23.0 +go 1.22.6 require ( cloud.google.com/go/cloudsqlconn v1.11.1 diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 19399a3c99411..1dcb22957eb46 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.23.0 +go 1.22.6 require ( github.com/alecthomas/kong v0.9.0 diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 9031b3a4da604..44a3d0eec43c3 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/terraform -go 1.23.0 +go 1.22.6 // Doc generation tooling require github.com/hashicorp/terraform-plugin-docs v0.0.0 // replaced From bf197d70f8b086a183c01e9a87261a0139598ae6 Mon Sep 17 00:00:00 2001 From: Anton Miniailo Date: Mon, 19 Aug 2024 13:53:56 -0400 Subject: [PATCH 20/51] Don't try to enroll private EKS clusters if running in Teleport Cloud. (#45589) * Don't try to enroll private EKS clusters if running in Teleport Cloud. * Be more explicit in test about EndpointPublicAccess. * Add test case for private cluster not in cloud. * Improve the error wording. Co-authored-by: Marco Dinis * Fix error message in the test. --------- Co-authored-by: Marco Dinis --- .../awsoidc/eks_enroll_clusters.go | 5 ++ .../awsoidc/eks_enroll_clusters_test.go | 62 ++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/lib/integrations/awsoidc/eks_enroll_clusters.go b/lib/integrations/awsoidc/eks_enroll_clusters.go index cda75ccfccb52..26e0c31fe9f77 100644 --- a/lib/integrations/awsoidc/eks_enroll_clusters.go +++ b/lib/integrations/awsoidc/eks_enroll_clusters.go @@ -312,6 +312,11 @@ func enrollEKSCluster(ctx context.Context, log *slog.Logger, clock clockwork.Clo return "", trace.BadParameter(`can't enroll EKS cluster %q - expected "ACTIVE" state, got %q.`, clusterName, eksCluster.Status) } + // We can't discover private EKS clusters for cloud clients, since we know that auth server is running in our VPC. + if req.IsCloud && !eksCluster.ResourcesVpcConfig.EndpointPublicAccess { + return "", trace.AccessDenied(`can't enroll %q because it is not accessible from Teleport Cloud, please enable endpoint public access in your EKS cluster and try again.`, clusterName) + } + principalArn, err := getAccessEntryPrincipalArn(ctx, clt.GetCallerIdentity) if err != nil { return "", trace.Wrap(err) diff --git a/lib/integrations/awsoidc/eks_enroll_clusters_test.go b/lib/integrations/awsoidc/eks_enroll_clusters_test.go index c9a2396292bb4..4250babf8ca27 100644 --- a/lib/integrations/awsoidc/eks_enroll_clusters_test.go +++ b/lib/integrations/awsoidc/eks_enroll_clusters_test.go @@ -90,14 +90,20 @@ func TestEnrollEKSClusters(t *testing.T) { testEKSClusters := []eksTypes.Cluster{ { - Name: aws.String("EKS1"), + Name: aws.String("EKS1"), + ResourcesVpcConfig: &eksTypes.VpcConfigResponse{ + EndpointPublicAccess: true, + }, Arn: aws.String(clustersBaseArn + "1"), Tags: map[string]string{"label1": "value1"}, CertificateAuthority: &eksTypes.Certificate{Data: aws.String(testCAData)}, Status: eksTypes.ClusterStatusActive, }, { - Name: aws.String("EKS2"), + Name: aws.String("EKS2"), + ResourcesVpcConfig: &eksTypes.VpcConfigResponse{ + EndpointPublicAccess: true, + }, Arn: aws.String(clustersBaseArn + "2"), Tags: map[string]string{"label2": "value2"}, CertificateAuthority: &eksTypes.Certificate{Data: aws.String(testCAData)}, @@ -229,6 +235,58 @@ func TestEnrollEKSClusters(t *testing.T) { `can't enroll EKS cluster "EKS1" - expected "ACTIVE" state, got "PENDING".`) }, }, + { + name: "private cluster in cloud is not enrolled", + enrollClient: baseClient, + eksClusters: []eksTypes.Cluster{ + { + Name: aws.String("EKS3"), + ResourcesVpcConfig: &eksTypes.VpcConfigResponse{ + EndpointPublicAccess: false, + }, + Arn: aws.String(clustersBaseArn + "3"), + Tags: map[string]string{"label3": "value3"}, + CertificateAuthority: &eksTypes.Certificate{Data: aws.String(testCAData)}, + Status: eksTypes.ClusterStatusActive, + }, + }, + request: EnrollEKSClustersRequest{ + Region: "us-east-1", + AgentVersion: "1.2.3", + IsCloud: true, + }, + requestClusterNames: []string{"EKS3"}, + responseCheck: func(t *testing.T, response *EnrollEKSClusterResponse) { + require.Len(t, response.Results, 1) + require.ErrorContains(t, response.Results[0].Error, + `can't enroll "EKS3" because it is not accessible from Teleport Cloud, please enable endpoint public access in your EKS cluster and try again.`) + }, + }, + { + name: "private cluster not in cloud is enrolled", + enrollClient: baseClient, + eksClusters: []eksTypes.Cluster{ + { + Name: aws.String("EKS3"), + ResourcesVpcConfig: &eksTypes.VpcConfigResponse{ + EndpointPublicAccess: false, + }, + Arn: aws.String(clustersBaseArn + "3"), + Tags: map[string]string{"label3": "value3"}, + CertificateAuthority: &eksTypes.Certificate{Data: aws.String(testCAData)}, + Status: eksTypes.ClusterStatusActive, + }, + }, + request: EnrollEKSClustersRequest{ + Region: "us-east-1", + AgentVersion: "1.2.3", + }, + requestClusterNames: []string{"EKS3"}, + responseCheck: func(t *testing.T, response *EnrollEKSClusterResponse) { + require.Len(t, response.Results, 1) + require.NoError(t, response.Results[0].Error) + }, + }, { name: "cluster with already present agent is not enrolled", enrollClient: func(t *testing.T, clusters []eksTypes.Cluster) EnrollEKSCLusterClient { From bd0affa30605cbae3f83d9713a70dc7295bb520f Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Mon, 19 Aug 2024 15:02:44 -0300 Subject: [PATCH 21/51] chore: Bump Buf to v1.37.0 (#45587) --- build.assets/versions.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 9b23853ec6ad9..d7bd212a5d060 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -17,7 +17,7 @@ LIBPCSCLITE_VERSION ?= 1.9.9-teleport DEVTOOLSET ?= devtoolset-12 # Protogen related versions. -BUF_VERSION ?= v1.36.0 +BUF_VERSION ?= v1.37.0 # Keep in sync with api/proto/buf.yaml (and buf.lock). GOGO_PROTO_TAG ?= v1.3.2 NODE_GRPC_TOOLS_VERSION ?= 1.12.4 From d9120e09359b63c2d483d99a9af014e42c955922 Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Mon, 19 Aug 2024 11:11:40 -0700 Subject: [PATCH 22/51] Discover: Create app server event (#45242) * Create app server event * Emit create app server event --- .../proto/go/usageevents/v1/usageevents.pb.go | 1066 +++-- .../teleport/usageevents/v1/usageevents.proto | 8 + gen/proto/go/prehog/v1alpha/teleport.pb.go | 3486 +++++++++-------- gen/proto/ts/prehog/v1alpha/teleport_pb.ts | 97 +- lib/usagereporter/teleport/types.go | 11 + lib/usagereporter/teleport/types_discover.go | 22 + .../teleport/usagereporter_test.go | 23 + lib/usagereporter/web/userevent.go | 2 + lib/usagereporter/web/userevent_discover.go | 9 + .../web/userevent_discover_test.go | 19 + proto/prehog/v1alpha/teleport.proto | 9 + .../Discover/AwsMangementConsole/index.tsx | 2 +- .../teleport/src/services/userEvent/types.ts | 1 + 13 files changed, 2734 insertions(+), 2021 deletions(-) diff --git a/api/gen/proto/go/usageevents/v1/usageevents.pb.go b/api/gen/proto/go/usageevents/v1/usageevents.pb.go index 73c5c5f33079a..ccefc6e535e87 100644 --- a/api/gen/proto/go/usageevents/v1/usageevents.pb.go +++ b/api/gen/proto/go/usageevents/v1/usageevents.pb.go @@ -2245,6 +2245,70 @@ func (m *UIDiscoverCreateNodeEvent) GetStatus() *DiscoverStepStatus { return nil } +// UIDiscoverCreateAppServerEvent is emitted when an app server is created. +type UIDiscoverCreateAppServerEvent struct { + Metadata *DiscoverMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Resource *DiscoverResourceMetadata `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` + Status *DiscoverStepStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UIDiscoverCreateAppServerEvent) Reset() { *m = UIDiscoverCreateAppServerEvent{} } +func (m *UIDiscoverCreateAppServerEvent) String() string { return proto.CompactTextString(m) } +func (*UIDiscoverCreateAppServerEvent) ProtoMessage() {} +func (*UIDiscoverCreateAppServerEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_94cf2ca1c69fd564, []int{29} +} +func (m *UIDiscoverCreateAppServerEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UIDiscoverCreateAppServerEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UIDiscoverCreateAppServerEvent.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UIDiscoverCreateAppServerEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_UIDiscoverCreateAppServerEvent.Merge(m, src) +} +func (m *UIDiscoverCreateAppServerEvent) XXX_Size() int { + return m.Size() +} +func (m *UIDiscoverCreateAppServerEvent) XXX_DiscardUnknown() { + xxx_messageInfo_UIDiscoverCreateAppServerEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_UIDiscoverCreateAppServerEvent proto.InternalMessageInfo + +func (m *UIDiscoverCreateAppServerEvent) GetMetadata() *DiscoverMetadata { + if m != nil { + return m.Metadata + } + return nil +} + +func (m *UIDiscoverCreateAppServerEvent) GetResource() *DiscoverResourceMetadata { + if m != nil { + return m.Resource + } + return nil +} + +func (m *UIDiscoverCreateAppServerEvent) GetStatus() *DiscoverStepStatus { + if m != nil { + return m.Status + } + return nil +} + // UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user is finished with the step that configures IAM policy for an RDS database. type UIDiscoverDatabaseConfigureIAMPolicyEvent struct { Metadata *DiscoverMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` @@ -2263,7 +2327,7 @@ func (m *UIDiscoverDatabaseConfigureIAMPolicyEvent) String() string { } func (*UIDiscoverDatabaseConfigureIAMPolicyEvent) ProtoMessage() {} func (*UIDiscoverDatabaseConfigureIAMPolicyEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{29} + return fileDescriptor_94cf2ca1c69fd564, []int{30} } func (m *UIDiscoverDatabaseConfigureIAMPolicyEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2327,7 +2391,7 @@ func (m *UIDiscoverPrincipalsConfigureEvent) Reset() { *m = UIDiscoverPr func (m *UIDiscoverPrincipalsConfigureEvent) String() string { return proto.CompactTextString(m) } func (*UIDiscoverPrincipalsConfigureEvent) ProtoMessage() {} func (*UIDiscoverPrincipalsConfigureEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{30} + return fileDescriptor_94cf2ca1c69fd564, []int{31} } func (m *UIDiscoverPrincipalsConfigureEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2392,7 +2456,7 @@ func (m *UIDiscoverTestConnectionEvent) Reset() { *m = UIDiscoverTestCon func (m *UIDiscoverTestConnectionEvent) String() string { return proto.CompactTextString(m) } func (*UIDiscoverTestConnectionEvent) ProtoMessage() {} func (*UIDiscoverTestConnectionEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{31} + return fileDescriptor_94cf2ca1c69fd564, []int{32} } func (m *UIDiscoverTestConnectionEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2456,7 +2520,7 @@ func (m *UIDiscoverCompletedEvent) Reset() { *m = UIDiscoverCompletedEve func (m *UIDiscoverCompletedEvent) String() string { return proto.CompactTextString(m) } func (*UIDiscoverCompletedEvent) ProtoMessage() {} func (*UIDiscoverCompletedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{32} + return fileDescriptor_94cf2ca1c69fd564, []int{33} } func (m *UIDiscoverCompletedEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2517,7 +2581,7 @@ func (m *UICreateNewRoleClickEvent) Reset() { *m = UICreateNewRoleClickE func (m *UICreateNewRoleClickEvent) String() string { return proto.CompactTextString(m) } func (*UICreateNewRoleClickEvent) ProtoMessage() {} func (*UICreateNewRoleClickEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{33} + return fileDescriptor_94cf2ca1c69fd564, []int{34} } func (m *UICreateNewRoleClickEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2557,7 +2621,7 @@ func (m *UICreateNewRoleSaveClickEvent) Reset() { *m = UICreateNewRoleSa func (m *UICreateNewRoleSaveClickEvent) String() string { return proto.CompactTextString(m) } func (*UICreateNewRoleSaveClickEvent) ProtoMessage() {} func (*UICreateNewRoleSaveClickEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{34} + return fileDescriptor_94cf2ca1c69fd564, []int{35} } func (m *UICreateNewRoleSaveClickEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2597,7 +2661,7 @@ func (m *UICreateNewRoleCancelClickEvent) Reset() { *m = UICreateNewRole func (m *UICreateNewRoleCancelClickEvent) String() string { return proto.CompactTextString(m) } func (*UICreateNewRoleCancelClickEvent) ProtoMessage() {} func (*UICreateNewRoleCancelClickEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{35} + return fileDescriptor_94cf2ca1c69fd564, []int{36} } func (m *UICreateNewRoleCancelClickEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2641,7 +2705,7 @@ func (m *UICreateNewRoleViewDocumentationClickEvent) String() string { } func (*UICreateNewRoleViewDocumentationClickEvent) ProtoMessage() {} func (*UICreateNewRoleViewDocumentationClickEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{36} + return fileDescriptor_94cf2ca1c69fd564, []int{37} } func (m *UICreateNewRoleViewDocumentationClickEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2689,7 +2753,7 @@ func (m *AssistCompletionEvent) Reset() { *m = AssistCompletionEvent{} } func (m *AssistCompletionEvent) String() string { return proto.CompactTextString(m) } func (*AssistCompletionEvent) ProtoMessage() {} func (*AssistCompletionEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{37} + return fileDescriptor_94cf2ca1c69fd564, []int{38} } func (m *AssistCompletionEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2832,7 @@ func (m *AssistExecutionEvent) Reset() { *m = AssistExecutionEvent{} } func (m *AssistExecutionEvent) String() string { return proto.CompactTextString(m) } func (*AssistExecutionEvent) ProtoMessage() {} func (*AssistExecutionEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{38} + return fileDescriptor_94cf2ca1c69fd564, []int{39} } func (m *AssistExecutionEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2847,7 +2911,7 @@ func (m *AssistNewConversationEvent) Reset() { *m = AssistNewConversatio func (m *AssistNewConversationEvent) String() string { return proto.CompactTextString(m) } func (*AssistNewConversationEvent) ProtoMessage() {} func (*AssistNewConversationEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{39} + return fileDescriptor_94cf2ca1c69fd564, []int{40} } func (m *AssistNewConversationEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2903,7 +2967,7 @@ func (m *AssistAccessRequest) Reset() { *m = AssistAccessRequest{} } func (m *AssistAccessRequest) String() string { return proto.CompactTextString(m) } func (*AssistAccessRequest) ProtoMessage() {} func (*AssistAccessRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{40} + return fileDescriptor_94cf2ca1c69fd564, []int{41} } func (m *AssistAccessRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2980,7 +3044,7 @@ func (m *AssistAction) Reset() { *m = AssistAction{} } func (m *AssistAction) String() string { return proto.CompactTextString(m) } func (*AssistAction) ProtoMessage() {} func (*AssistAction) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{41} + return fileDescriptor_94cf2ca1c69fd564, []int{42} } func (m *AssistAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3114,7 @@ func (m *AccessListMetadata) Reset() { *m = AccessListMetadata{} } func (m *AccessListMetadata) String() string { return proto.CompactTextString(m) } func (*AccessListMetadata) ProtoMessage() {} func (*AccessListMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{42} + return fileDescriptor_94cf2ca1c69fd564, []int{43} } func (m *AccessListMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3098,7 +3162,7 @@ func (m *AccessListCreate) Reset() { *m = AccessListCreate{} } func (m *AccessListCreate) String() string { return proto.CompactTextString(m) } func (*AccessListCreate) ProtoMessage() {} func (*AccessListCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{43} + return fileDescriptor_94cf2ca1c69fd564, []int{44} } func (m *AccessListCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3146,7 +3210,7 @@ func (m *AccessListUpdate) Reset() { *m = AccessListUpdate{} } func (m *AccessListUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListUpdate) ProtoMessage() {} func (*AccessListUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{44} + return fileDescriptor_94cf2ca1c69fd564, []int{45} } func (m *AccessListUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3194,7 +3258,7 @@ func (m *AccessListDelete) Reset() { *m = AccessListDelete{} } func (m *AccessListDelete) String() string { return proto.CompactTextString(m) } func (*AccessListDelete) ProtoMessage() {} func (*AccessListDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{45} + return fileDescriptor_94cf2ca1c69fd564, []int{46} } func (m *AccessListDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3242,7 +3306,7 @@ func (m *AccessListMemberCreate) Reset() { *m = AccessListMemberCreate{} func (m *AccessListMemberCreate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberCreate) ProtoMessage() {} func (*AccessListMemberCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{46} + return fileDescriptor_94cf2ca1c69fd564, []int{47} } func (m *AccessListMemberCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3290,7 +3354,7 @@ func (m *AccessListMemberUpdate) Reset() { *m = AccessListMemberUpdate{} func (m *AccessListMemberUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberUpdate) ProtoMessage() {} func (*AccessListMemberUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{47} + return fileDescriptor_94cf2ca1c69fd564, []int{48} } func (m *AccessListMemberUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3338,7 +3402,7 @@ func (m *AccessListMemberDelete) Reset() { *m = AccessListMemberDelete{} func (m *AccessListMemberDelete) String() string { return proto.CompactTextString(m) } func (*AccessListMemberDelete) ProtoMessage() {} func (*AccessListMemberDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{48} + return fileDescriptor_94cf2ca1c69fd564, []int{49} } func (m *AccessListMemberDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3390,7 +3454,7 @@ func (m *AccessListGrantsToUser) Reset() { *m = AccessListGrantsToUser{} func (m *AccessListGrantsToUser) String() string { return proto.CompactTextString(m) } func (*AccessListGrantsToUser) ProtoMessage() {} func (*AccessListGrantsToUser) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{49} + return fileDescriptor_94cf2ca1c69fd564, []int{50} } func (m *AccessListGrantsToUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3455,7 +3519,7 @@ func (m *AccessListReviewCreate) Reset() { *m = AccessListReviewCreate{} func (m *AccessListReviewCreate) String() string { return proto.CompactTextString(m) } func (*AccessListReviewCreate) ProtoMessage() {} func (*AccessListReviewCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{50} + return fileDescriptor_94cf2ca1c69fd564, []int{51} } func (m *AccessListReviewCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3540,7 +3604,7 @@ func (m *AccessListReviewDelete) Reset() { *m = AccessListReviewDelete{} func (m *AccessListReviewDelete) String() string { return proto.CompactTextString(m) } func (*AccessListReviewDelete) ProtoMessage() {} func (*AccessListReviewDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{51} + return fileDescriptor_94cf2ca1c69fd564, []int{52} } func (m *AccessListReviewDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3602,7 +3666,7 @@ func (m *IntegrationEnrollMetadata) Reset() { *m = IntegrationEnrollMeta func (m *IntegrationEnrollMetadata) String() string { return proto.CompactTextString(m) } func (*IntegrationEnrollMetadata) ProtoMessage() {} func (*IntegrationEnrollMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{52} + return fileDescriptor_94cf2ca1c69fd564, []int{53} } func (m *IntegrationEnrollMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3665,7 +3729,7 @@ func (m *UIIntegrationEnrollStartEvent) Reset() { *m = UIIntegrationEnro func (m *UIIntegrationEnrollStartEvent) String() string { return proto.CompactTextString(m) } func (*UIIntegrationEnrollStartEvent) ProtoMessage() {} func (*UIIntegrationEnrollStartEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{53} + return fileDescriptor_94cf2ca1c69fd564, []int{54} } func (m *UIIntegrationEnrollStartEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3714,7 +3778,7 @@ func (m *UIIntegrationEnrollCompleteEvent) Reset() { *m = UIIntegrationE func (m *UIIntegrationEnrollCompleteEvent) String() string { return proto.CompactTextString(m) } func (*UIIntegrationEnrollCompleteEvent) ProtoMessage() {} func (*UIIntegrationEnrollCompleteEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{54} + return fileDescriptor_94cf2ca1c69fd564, []int{55} } func (m *UIIntegrationEnrollCompleteEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3834,7 @@ func (m *ResourceCreateEvent) Reset() { *m = ResourceCreateEvent{} } func (m *ResourceCreateEvent) String() string { return proto.CompactTextString(m) } func (*ResourceCreateEvent) ProtoMessage() {} func (*ResourceCreateEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{55} + return fileDescriptor_94cf2ca1c69fd564, []int{56} } func (m *ResourceCreateEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3842,7 +3906,7 @@ func (m *DiscoveredDatabaseMetadata) Reset() { *m = DiscoveredDatabaseMe func (m *DiscoveredDatabaseMetadata) String() string { return proto.CompactTextString(m) } func (*DiscoveredDatabaseMetadata) ProtoMessage() {} func (*DiscoveredDatabaseMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{56} + return fileDescriptor_94cf2ca1c69fd564, []int{57} } func (m *DiscoveredDatabaseMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3912,7 +3976,7 @@ func (m *FeatureRecommendationEvent) Reset() { *m = FeatureRecommendatio func (m *FeatureRecommendationEvent) String() string { return proto.CompactTextString(m) } func (*FeatureRecommendationEvent) ProtoMessage() {} func (*FeatureRecommendationEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{57} + return fileDescriptor_94cf2ca1c69fd564, []int{58} } func (m *FeatureRecommendationEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3982,7 +4046,7 @@ func (m *TAGExecuteQueryEvent) Reset() { *m = TAGExecuteQueryEvent{} } func (m *TAGExecuteQueryEvent) String() string { return proto.CompactTextString(m) } func (*TAGExecuteQueryEvent) ProtoMessage() {} func (*TAGExecuteQueryEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{58} + return fileDescriptor_94cf2ca1c69fd564, []int{59} } func (m *TAGExecuteQueryEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4047,7 +4111,7 @@ func (m *SecurityReportGetResultEvent) Reset() { *m = SecurityReportGetR func (m *SecurityReportGetResultEvent) String() string { return proto.CompactTextString(m) } func (*SecurityReportGetResultEvent) ProtoMessage() {} func (*SecurityReportGetResultEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{59} + return fileDescriptor_94cf2ca1c69fd564, []int{60} } func (m *SecurityReportGetResultEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4108,7 +4172,7 @@ func (m *DiscoveryFetchEvent) Reset() { *m = DiscoveryFetchEvent{} } func (m *DiscoveryFetchEvent) String() string { return proto.CompactTextString(m) } func (*DiscoveryFetchEvent) ProtoMessage() {} func (*DiscoveryFetchEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{60} + return fileDescriptor_94cf2ca1c69fd564, []int{61} } func (m *DiscoveryFetchEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4211,6 +4275,7 @@ type UsageEventOneOf struct { // *UsageEventOneOf_DiscoveryFetchEvent // *UsageEventOneOf_UiDiscoverCreateDiscoveryConfig // *UsageEventOneOf_UiDiscoverKubeEksEnrollEvent + // *UsageEventOneOf_UiDiscoverCreateAppServerEvent Event isUsageEventOneOf_Event `protobuf_oneof:"event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4221,7 +4286,7 @@ func (m *UsageEventOneOf) Reset() { *m = UsageEventOneOf{} } func (m *UsageEventOneOf) String() string { return proto.CompactTextString(m) } func (*UsageEventOneOf) ProtoMessage() {} func (*UsageEventOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_94cf2ca1c69fd564, []int{61} + return fileDescriptor_94cf2ca1c69fd564, []int{62} } func (m *UsageEventOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4421,6 +4486,9 @@ type UsageEventOneOf_UiDiscoverCreateDiscoveryConfig struct { type UsageEventOneOf_UiDiscoverKubeEksEnrollEvent struct { UiDiscoverKubeEksEnrollEvent *UIDiscoverKubeEKSEnrollEvent `protobuf:"bytes,56,opt,name=ui_discover_kube_eks_enroll_event,json=uiDiscoverKubeEksEnrollEvent,proto3,oneof" json:"ui_discover_kube_eks_enroll_event,omitempty"` } +type UsageEventOneOf_UiDiscoverCreateAppServerEvent struct { + UiDiscoverCreateAppServerEvent *UIDiscoverCreateAppServerEvent `protobuf:"bytes,57,opt,name=ui_discover_create_app_server_event,json=uiDiscoverCreateAppServerEvent,proto3,oneof" json:"ui_discover_create_app_server_event,omitempty"` +} func (*UsageEventOneOf_UiBannerClick) isUsageEventOneOf_Event() {} func (*UsageEventOneOf_UiOnboardCompleteGoToDashboardClick) isUsageEventOneOf_Event() {} @@ -4477,6 +4545,7 @@ func (*UsageEventOneOf_AccessListReviewDelete) isUsageEventOneOf_Event() func (*UsageEventOneOf_DiscoveryFetchEvent) isUsageEventOneOf_Event() {} func (*UsageEventOneOf_UiDiscoverCreateDiscoveryConfig) isUsageEventOneOf_Event() {} func (*UsageEventOneOf_UiDiscoverKubeEksEnrollEvent) isUsageEventOneOf_Event() {} +func (*UsageEventOneOf_UiDiscoverCreateAppServerEvent) isUsageEventOneOf_Event() {} func (m *UsageEventOneOf) GetEvent() isUsageEventOneOf_Event { if m != nil { @@ -4870,6 +4939,13 @@ func (m *UsageEventOneOf) GetUiDiscoverKubeEksEnrollEvent() *UIDiscoverKubeEKSEn return nil } +func (m *UsageEventOneOf) GetUiDiscoverCreateAppServerEvent() *UIDiscoverCreateAppServerEvent { + if x, ok := m.GetEvent().(*UsageEventOneOf_UiDiscoverCreateAppServerEvent); ok { + return x.UiDiscoverCreateAppServerEvent + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*UsageEventOneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -4928,6 +5004,7 @@ func (*UsageEventOneOf) XXX_OneofWrappers() []interface{} { (*UsageEventOneOf_DiscoveryFetchEvent)(nil), (*UsageEventOneOf_UiDiscoverCreateDiscoveryConfig)(nil), (*UsageEventOneOf_UiDiscoverKubeEksEnrollEvent)(nil), + (*UsageEventOneOf_UiDiscoverCreateAppServerEvent)(nil), } } @@ -4970,6 +5047,7 @@ func init() { proto.RegisterType((*UIDiscoverEC2InstanceSelectionEvent)(nil), "teleport.usageevents.v1.UIDiscoverEC2InstanceSelectionEvent") proto.RegisterType((*UIDiscoverDeployEICEEvent)(nil), "teleport.usageevents.v1.UIDiscoverDeployEICEEvent") proto.RegisterType((*UIDiscoverCreateNodeEvent)(nil), "teleport.usageevents.v1.UIDiscoverCreateNodeEvent") + proto.RegisterType((*UIDiscoverCreateAppServerEvent)(nil), "teleport.usageevents.v1.UIDiscoverCreateAppServerEvent") proto.RegisterType((*UIDiscoverDatabaseConfigureIAMPolicyEvent)(nil), "teleport.usageevents.v1.UIDiscoverDatabaseConfigureIAMPolicyEvent") proto.RegisterType((*UIDiscoverPrincipalsConfigureEvent)(nil), "teleport.usageevents.v1.UIDiscoverPrincipalsConfigureEvent") proto.RegisterType((*UIDiscoverTestConnectionEvent)(nil), "teleport.usageevents.v1.UIDiscoverTestConnectionEvent") @@ -5010,308 +5088,310 @@ func init() { } var fileDescriptor_94cf2ca1c69fd564 = []byte{ - // 4806 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0xdb, 0x8f, 0xdb, 0x48, - 0x76, 0xb7, 0xa8, 0xf6, 0xf5, 0xb8, 0xdd, 0xa6, 0xcb, 0x76, 0x5b, 0x6d, 0xbb, 0x7d, 0x91, 0xef, - 0xed, 0xd9, 0xee, 0x71, 0xcf, 0xec, 0x8c, 0x77, 0x67, 0xbe, 0x6f, 0xc2, 0xa6, 0xd8, 0x2d, 0xba, - 0x25, 0x51, 0x53, 0xa4, 0xec, 0xed, 0x59, 0x2c, 0x0a, 0x6c, 0xb1, 0xba, 0x4d, 0x58, 0x2d, 0xf6, - 0x90, 0x54, 0x7b, 0x3a, 0x41, 0xb0, 0x9b, 0x2b, 0x82, 0xcc, 0x6e, 0x90, 0x00, 0x41, 0x10, 0x60, - 0x80, 0x20, 0x41, 0x2e, 0xc8, 0x43, 0x80, 0x3c, 0x05, 0xfb, 0x98, 0xec, 0x5b, 0x1e, 0x03, 0x04, - 0x79, 0xca, 0x4b, 0x30, 0xff, 0x40, 0x9e, 0x12, 0x20, 0x41, 0x82, 0x04, 0x55, 0x45, 0x4a, 0x94, - 0x44, 0x89, 0x9c, 0x89, 0x07, 0x0b, 0xb4, 0xdf, 0xc4, 0xaa, 0x73, 0xf9, 0xd5, 0xa9, 0x53, 0xa7, - 0x8a, 0x75, 0x0e, 0x05, 0x0f, 0x43, 0xda, 0xa1, 0xfb, 0x9e, 0x1f, 0xae, 0xf4, 0x02, 0x7b, 0x97, - 0xd2, 0x03, 0xda, 0x0d, 0x83, 0x95, 0x83, 0xc7, 0xc9, 0xc7, 0xe5, 0x7d, 0xdf, 0x0b, 0x3d, 0x74, - 0x39, 0x26, 0x5d, 0x4e, 0xf6, 0x1d, 0x3c, 0x2e, 0x2f, 0x01, 0x6a, 0xe9, 0x6b, 0x76, 0xb7, 0x4b, - 0x7d, 0xb5, 0xe3, 0xb6, 0x5f, 0x6a, 0xac, 0x07, 0x5d, 0x84, 0xe3, 0x76, 0x87, 0xfa, 0x61, 0x49, - 0xba, 0x29, 0x3d, 0x38, 0x8d, 0xc5, 0x43, 0x79, 0x1d, 0x1e, 0xb4, 0x74, 0xa3, 0xbb, 0xed, 0xd9, - 0xbe, 0xa3, 0x7a, 0x7b, 0xfb, 0x1d, 0x1a, 0xd2, 0x0d, 0xcf, 0xf2, 0x2a, 0x76, 0xf0, 0x42, 0x34, - 0x0e, 0x24, 0x5c, 0x81, 0x53, 0xbd, 0x80, 0xfa, 0x5d, 0x7b, 0x8f, 0x46, 0x42, 0xfa, 0xcf, 0xe5, - 0xbb, 0x70, 0xbb, 0x2f, 0x47, 0x71, 0x9c, 0x75, 0xd7, 0x0f, 0x42, 0x4c, 0x03, 0xaf, 0xe7, 0xb7, - 0xe9, 0x40, 0x44, 0x79, 0x29, 0xa1, 0x6e, 0x94, 0xac, 0x66, 0x87, 0x49, 0xc0, 0xe5, 0x8f, 0xe0, - 0x56, 0x9f, 0xd6, 0xa4, 0xa1, 0xea, 0x53, 0x87, 0x76, 0x43, 0xd7, 0xee, 0x98, 0xbd, 0xed, 0x3d, - 0x37, 0xcc, 0xc6, 0x94, 0x14, 0xf0, 0x71, 0x8f, 0x06, 0xa1, 0xeb, 0x75, 0xbb, 0xb6, 0xeb, 0xd3, - 0xbc, 0x02, 0x7e, 0x19, 0xee, 0xf6, 0x05, 0x60, 0xba, 0xeb, 0x06, 0x0c, 0xe0, 0x0b, 0xbb, 0xd3, - 0xa1, 0xdd, 0xdd, 0xbc, 0x42, 0xd0, 0x02, 0x9c, 0xda, 0xdb, 0xb1, 0x49, 0x78, 0xb8, 0x4f, 0x4b, - 0x45, 0xde, 0x77, 0x72, 0x6f, 0xc7, 0xb6, 0x0e, 0xf7, 0x29, 0x5a, 0x04, 0xe8, 0x78, 0xbb, 0x6e, - 0x97, 0xec, 0x74, 0xbc, 0x57, 0xa5, 0x19, 0xde, 0x79, 0x9a, 0xb7, 0xac, 0x77, 0xbc, 0x57, 0x02, - 0x3f, 0xa6, 0x6d, 0xef, 0x80, 0xfa, 0x87, 0xaa, 0xe7, 0xd0, 0x40, 0xf5, 0xba, 0xa1, 0xdb, 0xed, - 0xd1, 0x9c, 0x93, 0xf2, 0x01, 0x2c, 0x8e, 0x09, 0xd8, 0x3f, 0xcc, 0xc9, 0xfc, 0x21, 0x5c, 0x1f, - 0x61, 0x6e, 0xfa, 0x6e, 0x37, 0xcc, 0xc9, 0x5d, 0x06, 0xb9, 0xe2, 0x06, 0x9c, 0xb9, 0x4e, 0x43, - 0xdb, 0xb1, 0x43, 0x1b, 0xcd, 0x41, 0xd1, 0x75, 0x22, 0xca, 0xa2, 0xeb, 0x94, 0x6d, 0x28, 0xc5, - 0x34, 0xb1, 0x0f, 0xf4, 0x69, 0x35, 0x38, 0xe5, 0x47, 0x6d, 0x9c, 0x63, 0x6e, 0xf5, 0xe1, 0xf2, - 0x04, 0x7f, 0x5f, 0x1e, 0x15, 0x82, 0xfb, 0xac, 0xe5, 0x97, 0x80, 0xe2, 0x5e, 0x33, 0xa4, 0xfb, - 0x66, 0x68, 0x87, 0xbd, 0x00, 0x7d, 0x04, 0x27, 0x02, 0xfe, 0x2b, 0x12, 0x7d, 0x3f, 0x53, 0xb4, - 0x60, 0xc4, 0x11, 0x1b, 0x5b, 0x4b, 0xd4, 0xf7, 0x3d, 0x3f, 0x9a, 0x50, 0xf1, 0x50, 0xfe, 0x33, - 0x09, 0xe6, 0x5b, 0x7a, 0x82, 0xc5, 0x0f, 0xa9, 0x23, 0x4c, 0xa5, 0xc1, 0xa9, 0xbd, 0x68, 0x68, - 0x5c, 0xe7, 0x99, 0x1c, 0xc3, 0x89, 0x6d, 0x81, 0xfb, 0xac, 0x48, 0xed, 0x03, 0x2f, 0x72, 0x21, - 0x8f, 0x72, 0x00, 0x8f, 0x47, 0x1d, 0x83, 0x2f, 0xff, 0xb7, 0x04, 0x37, 0x07, 0x30, 0x63, 0xa3, - 0x99, 0xb4, 0x43, 0xdb, 0x6c, 0x85, 0xbc, 0x56, 0xc0, 0xf5, 0xc4, 0x34, 0x0a, 0xc8, 0x8f, 0x73, - 0x4f, 0xe3, 0x40, 0x5c, 0x2c, 0x22, 0x31, 0xfe, 0x99, 0xaf, 0x3f, 0xfe, 0xdf, 0x28, 0xb2, 0x20, - 0x14, 0x13, 0xe8, 0xdd, 0x90, 0xee, 0xfa, 0x36, 0x1b, 0xb9, 0xf2, 0xdc, 0x34, 0xf4, 0x8a, 0xaa, - 0x7a, 0xdd, 0x2e, 0x6d, 0x87, 0x47, 0xde, 0x0e, 0x3f, 0x2d, 0x26, 0xfd, 0xa0, 0x62, 0x87, 0xf6, - 0xb6, 0x1d, 0x50, 0x5c, 0x31, 0xb5, 0xae, 0xef, 0x75, 0x3a, 0x47, 0x7d, 0xfc, 0xe8, 0x09, 0x94, - 0x02, 0xee, 0xf4, 0xd4, 0x21, 0xb1, 0xe4, 0x80, 0xb4, 0xbd, 0x5e, 0x37, 0x2c, 0x1d, 0xbb, 0x29, - 0x3d, 0x98, 0xc1, 0xf3, 0x71, 0x7f, 0x0c, 0x25, 0x50, 0x59, 0x6f, 0xf9, 0x3f, 0x24, 0xb8, 0x36, - 0xb0, 0xdc, 0x66, 0x6f, 0x9b, 0x6a, 0x9b, 0x6f, 0x88, 0xd5, 0xca, 0x4f, 0xa1, 0xd4, 0xd2, 0x55, - 0xbb, 0xd3, 0xb1, 0x3c, 0x85, 0xc7, 0x8b, 0xc4, 0x86, 0xb0, 0x0c, 0x33, 0xed, 0x68, 0xc4, 0x73, - 0xab, 0xd7, 0x26, 0x4a, 0x57, 0x2d, 0x05, 0x33, 0xc2, 0xf2, 0x4f, 0x8e, 0x27, 0xed, 0x58, 0xa1, - 0xfb, 0x1d, 0xef, 0xd0, 0xa4, 0xfe, 0x81, 0xdb, 0xa6, 0x47, 0xde, 0xfb, 0x76, 0xe1, 0xac, 0xc3, - 0x07, 0x4c, 0xf6, 0x68, 0xf8, 0xc2, 0x73, 0xb8, 0xcb, 0xcd, 0xad, 0xae, 0x4d, 0x94, 0x35, 0xcd, - 0x50, 0xcb, 0xa2, 0xa9, 0xce, 0x25, 0xe1, 0x59, 0x27, 0xf1, 0x84, 0x6c, 0x38, 0x13, 0x29, 0xe2, - 0x47, 0x90, 0xe3, 0x5c, 0xcd, 0x2f, 0xfc, 0x5f, 0xd4, 0xb0, 0xb3, 0x0b, 0x06, 0xa7, 0xff, 0xbb, - 0x4c, 0x60, 0x36, 0x09, 0x00, 0x2d, 0xc2, 0x42, 0x45, 0x6b, 0xd6, 0x8c, 0x2d, 0x52, 0xd7, 0xac, - 0xaa, 0x51, 0x21, 0xad, 0x86, 0xd9, 0xd4, 0x54, 0x7d, 0x5d, 0xd7, 0x2a, 0x72, 0x01, 0xcd, 0x03, - 0x1a, 0xee, 0x56, 0x5a, 0x96, 0x21, 0x4b, 0xa8, 0x04, 0x17, 0x87, 0xdb, 0xeb, 0x4a, 0xa3, 0xa5, - 0xd4, 0xe4, 0x62, 0x99, 0x02, 0x0c, 0x54, 0xa3, 0xab, 0x70, 0x39, 0xa2, 0xb3, 0xb6, 0x9a, 0xda, - 0x88, 0xf0, 0xeb, 0x70, 0x25, 0xd9, 0xa9, 0x37, 0x4c, 0x4b, 0xa9, 0xd5, 0x88, 0xa9, 0x62, 0xbd, - 0x69, 0xc9, 0x12, 0xba, 0x02, 0xf3, 0xc9, 0x7e, 0xa5, 0xae, 0x7c, 0x62, 0x34, 0x88, 0xa6, 0x9a, - 0x72, 0xb1, 0xfc, 0xc5, 0x31, 0xb8, 0x33, 0x18, 0xbf, 0xea, 0x53, 0x3b, 0xa4, 0xf1, 0xd3, 0xa1, - 0xea, 0x75, 0x77, 0xdc, 0xdd, 0x23, 0xef, 0x97, 0x1e, 0x9c, 0x6d, 0xf3, 0x91, 0x0e, 0xfb, 0xe5, - 0xd3, 0x1c, 0x0e, 0x33, 0xd9, 0x60, 0xcb, 0xe2, 0x77, 0xec, 0x9f, 0xed, 0xc4, 0x53, 0xf9, 0x2f, - 0x24, 0x98, 0x4d, 0x76, 0x33, 0xef, 0x51, 0x8d, 0xc6, 0xba, 0xbe, 0x91, 0xee, 0x3d, 0x63, 0xdd, - 0xca, 0x73, 0x93, 0x68, 0xea, 0x2a, 0x31, 0xcd, 0xba, 0x2c, 0xb1, 0xf9, 0x4f, 0xef, 0xd6, 0x74, - 0x55, 0x93, 0x8b, 0xe9, 0xec, 0xb8, 0x62, 0x72, 0x17, 0x98, 0x41, 0x0b, 0x70, 0x29, 0x85, 0x7d, - 0xd3, 0x94, 0x8f, 0x95, 0xff, 0x4b, 0x82, 0x1b, 0x29, 0xfb, 0x65, 0xf4, 0x5e, 0x70, 0xe4, 0x03, - 0xff, 0xaf, 0x14, 0x93, 0x8b, 0x23, 0x1e, 0xbe, 0x98, 0xb9, 0x9e, 0x4f, 0xeb, 0x56, 0xcd, 0x3c, - 0xf2, 0x36, 0xf8, 0x9d, 0x22, 0x3c, 0x4e, 0x06, 0xc8, 0xe0, 0x65, 0xe8, 0xed, 0xb3, 0x6d, 0xf0, - 0x80, 0x56, 0x5c, 0x9f, 0xb6, 0x43, 0xcf, 0x3f, 0xb4, 0x3c, 0xaf, 0x13, 0xe8, 0xdd, 0x20, 0xb4, - 0xdf, 0x80, 0xd3, 0xc0, 0xe7, 0x45, 0x58, 0xce, 0x32, 0x48, 0xdf, 0x45, 0x8e, 0xbc, 0x35, 0xfe, - 0xaa, 0x08, 0xf7, 0x06, 0xd6, 0x50, 0x7a, 0xa1, 0x17, 0xff, 0x4e, 0x1c, 0x21, 0x8f, 0xfc, 0x0e, - 0x72, 0x1f, 0xce, 0xa5, 0x1f, 0xa7, 0xe7, 0xfc, 0xe1, 0x63, 0xf4, 0x8f, 0x8a, 0x70, 0x7b, 0x60, - 0x2e, 0x4d, 0x5d, 0xe5, 0xab, 0xa6, 0xfb, 0x26, 0xbd, 0x8b, 0xfe, 0xbb, 0x04, 0x0b, 0xa3, 0x27, - 0x2e, 0xb6, 0x51, 0xbd, 0x61, 0x03, 0x17, 0x27, 0x87, 0x86, 0xe7, 0x1c, 0xfd, 0x18, 0xf1, 0x9b, - 0x45, 0x78, 0x38, 0x65, 0x1b, 0xd5, 0x95, 0x7a, 0xd3, 0xeb, 0xb8, 0xed, 0xc3, 0x23, 0x6f, 0x88, - 0xff, 0x91, 0xa0, 0x3c, 0x30, 0x44, 0xd3, 0x77, 0xbb, 0x6d, 0x77, 0xdf, 0xee, 0x04, 0x6f, 0xce, - 0x76, 0xf1, 0x9f, 0x12, 0x2c, 0x0e, 0x2c, 0x60, 0xd1, 0x20, 0x8c, 0xae, 0x9e, 0xde, 0x84, 0xc8, - 0xf7, 0x6f, 0x12, 0x94, 0x12, 0x01, 0x20, 0x4a, 0x3d, 0x38, 0x47, 0x7e, 0xdc, 0x57, 0x59, 0xdc, - 0x8b, 0xe2, 0x1d, 0x7d, 0x85, 0xbd, 0x4e, 0x32, 0x3d, 0x72, 0x83, 0x39, 0xc4, 0x50, 0xa7, 0x69, - 0x1f, 0x24, 0x09, 0x6e, 0xb1, 0x57, 0x90, 0x61, 0x6e, 0xb6, 0x61, 0x76, 0x12, 0x24, 0x6f, 0xc1, - 0xd2, 0x08, 0xc9, 0x33, 0x97, 0xbe, 0xaa, 0x78, 0xed, 0xde, 0x1e, 0xed, 0x86, 0xf6, 0xf0, 0x95, - 0x4d, 0xf9, 0x6f, 0x24, 0xb8, 0xa4, 0x04, 0x81, 0xcb, 0x7c, 0x8f, 0x4f, 0x41, 0xdf, 0xf7, 0xee, - 0xc3, 0xb9, 0xb6, 0xd7, 0x3d, 0xa0, 0x7e, 0xc0, 0x79, 0x48, 0xff, 0xea, 0x7e, 0x2e, 0xd9, 0xac, - 0x3b, 0xe8, 0x16, 0xcc, 0x86, 0x5e, 0x68, 0x77, 0x48, 0xe8, 0xbd, 0xa4, 0x5d, 0x71, 0x35, 0x3d, - 0x83, 0xcf, 0xf0, 0x36, 0x8b, 0x37, 0xa1, 0xdb, 0x70, 0x76, 0xdf, 0xf7, 0xf6, 0xf6, 0xc3, 0x98, - 0x66, 0x86, 0xd3, 0xcc, 0x8a, 0xc6, 0x88, 0xe8, 0x11, 0x9c, 0x6f, 0xf7, 0x31, 0xc4, 0x84, 0xe2, - 0xe4, 0x20, 0x0f, 0x3a, 0x04, 0x71, 0xf9, 0x1f, 0x25, 0xb8, 0x28, 0x70, 0x6b, 0x9f, 0xd1, 0x76, - 0xef, 0x6b, 0xc0, 0x5e, 0x04, 0xe8, 0x7a, 0x0e, 0x8d, 0x4e, 0x28, 0x02, 0xf4, 0x69, 0xd6, 0xc2, - 0x0f, 0x27, 0x63, 0xa3, 0x9a, 0xc9, 0x31, 0xaa, 0x63, 0x79, 0x47, 0x75, 0x7c, 0xc2, 0xa8, 0x9e, - 0xc0, 0x15, 0x31, 0xa8, 0x06, 0x7d, 0xa5, 0x26, 0xe0, 0xf6, 0xf3, 0x2d, 0x6d, 0x3b, 0xa4, 0xbb, - 0x9e, 0x7f, 0x18, 0xe7, 0x5b, 0xe2, 0xe7, 0xf2, 0x5f, 0x4b, 0x70, 0x41, 0xb0, 0x2a, 0xed, 0x36, - 0x0d, 0x02, 0x4c, 0x3f, 0xed, 0xd1, 0x20, 0x64, 0x18, 0x63, 0xff, 0x15, 0xf7, 0x3f, 0x82, 0x71, - 0x36, 0x6e, 0xe4, 0x17, 0x2a, 0x3f, 0x97, 0x19, 0xfc, 0x42, 0x82, 0xd9, 0x18, 0x31, 0x6b, 0x46, - 0xf3, 0x70, 0xc2, 0xe6, 0xbf, 0x22, 0x8c, 0xd1, 0xd3, 0xcf, 0x07, 0xdd, 0x1d, 0x40, 0xc2, 0x90, - 0x35, 0x37, 0x08, 0x27, 0x66, 0xb0, 0xbe, 0x0f, 0xf2, 0x80, 0x4a, 0xac, 0x39, 0xb4, 0x31, 0x16, - 0xbb, 0x26, 0xc7, 0x89, 0x71, 0x15, 0x83, 0xe8, 0x35, 0x2c, 0xbc, 0xb5, 0xef, 0x7c, 0x73, 0xc2, - 0x2b, 0x94, 0xc5, 0xde, 0xd7, 0x27, 0xdc, 0x86, 0xf9, 0x64, 0xff, 0xde, 0x76, 0x7c, 0xc2, 0xfb, - 0x46, 0x55, 0xbc, 0x6e, 0x13, 0xa5, 0xa8, 0x78, 0xdd, 0x86, 0xfa, 0xc5, 0xa4, 0x8a, 0x0d, 0xdf, - 0xee, 0x86, 0x81, 0xe5, 0xb5, 0x02, 0xea, 0xa3, 0x65, 0xb8, 0xc0, 0x03, 0x13, 0xf1, 0xbd, 0x0e, - 0x0d, 0xc8, 0x2e, 0xeb, 0xa3, 0xc2, 0xf5, 0x8e, 0xe3, 0xf3, 0xbc, 0x8b, 0x85, 0xf6, 0x60, 0x43, - 0x74, 0xa0, 0xb7, 0xe1, 0xa2, 0xa0, 0x0f, 0x7d, 0xdb, 0x0d, 0x07, 0x0c, 0x45, 0xce, 0x80, 0x78, - 0x9f, 0xc5, 0xbb, 0x22, 0x8e, 0xf2, 0x1f, 0xcc, 0x24, 0x95, 0x63, 0x7a, 0xe0, 0xd2, 0x57, 0xaf, - 0x79, 0x96, 0xd0, 0x13, 0x58, 0x70, 0xec, 0xc3, 0x80, 0xec, 0xdb, 0x41, 0x48, 0xba, 0xf4, 0xb3, - 0x90, 0xd8, 0x3d, 0xc7, 0x0d, 0x09, 0x9b, 0xa8, 0x08, 0xda, 0x25, 0x46, 0xd0, 0xb4, 0x59, 0xc8, - 0xfb, 0x2c, 0x54, 0x58, 0x6f, 0x85, 0x41, 0x58, 0x87, 0x1b, 0x7b, 0xdc, 0xe4, 0xc1, 0x0b, 0x77, - 0x9f, 0xf8, 0xf4, 0xd3, 0x9e, 0xeb, 0x53, 0xb6, 0x81, 0x05, 0xa4, 0xfd, 0xc2, 0xee, 0xee, 0x52, - 0x87, 0xaf, 0xf1, 0x53, 0x78, 0x71, 0x40, 0x86, 0x13, 0x54, 0xaa, 0x20, 0x42, 0x4f, 0xa0, 0xe4, - 0xf3, 0xa1, 0x91, 0x1d, 0x26, 0x84, 0x76, 0xdb, 0x87, 0x7d, 0x01, 0xc7, 0xb8, 0x80, 0x79, 0xd1, - 0xbf, 0x1e, 0x77, 0xc7, 0x9c, 0x1f, 0xc2, 0xd5, 0x88, 0xd3, 0xb1, 0x0f, 0x89, 0xb7, 0x43, 0xf6, - 0xbc, 0x6e, 0xf8, 0xa2, 0xcf, 0x7c, 0x9c, 0x33, 0x5f, 0x16, 0x24, 0x15, 0xfb, 0xd0, 0xd8, 0xa9, - 0xb3, 0xfe, 0x98, 0xfb, 0x3b, 0xb0, 0xd0, 0xed, 0x31, 0x60, 0x8c, 0xd3, 0xa7, 0x7b, 0xde, 0x01, - 0x75, 0x48, 0x04, 0xb5, 0x74, 0x82, 0x8f, 0x7c, 0x5e, 0x10, 0x18, 0x3b, 0x58, 0x74, 0x0b, 0x17, - 0x0b, 0xca, 0xbf, 0x2f, 0x8d, 0x4f, 0xcc, 0x6b, 0x76, 0x3c, 0xf4, 0x18, 0x2e, 0xd9, 0xbc, 0x9f, - 0x74, 0xdc, 0x20, 0x24, 0xd1, 0x40, 0x5d, 0x27, 0x4a, 0x68, 0x23, 0x7b, 0x44, 0xbf, 0xee, 0x94, - 0x7f, 0x2c, 0xc1, 0x42, 0x22, 0x59, 0x2a, 0xd2, 0x5d, 0x93, 0x22, 0x23, 0x5a, 0x83, 0x63, 0x2f, - 0xdd, 0xae, 0x90, 0x37, 0xb7, 0xba, 0x3c, 0x11, 0xe5, 0x98, 0xc4, 0x4d, 0xb7, 0xeb, 0x60, 0xce, - 0x8b, 0xae, 0xc2, 0xe9, 0x5e, 0x40, 0x7d, 0xc2, 0x0b, 0x0c, 0x66, 0x06, 0x05, 0x06, 0x0d, 0x7b, - 0x8f, 0x96, 0x3d, 0x76, 0x54, 0x1a, 0xe3, 0xe6, 0x49, 0x77, 0xb1, 0x5b, 0x36, 0xc6, 0x6c, 0xb5, - 0x9a, 0x1f, 0x45, 0xca, 0x5a, 0xf5, 0xe1, 0x66, 0x8a, 0xc2, 0xf8, 0xe0, 0xfa, 0xcd, 0xe8, 0xfc, - 0x67, 0x09, 0x2e, 0xf4, 0xab, 0x68, 0xf8, 0xda, 0x14, 0x7a, 0x72, 0xed, 0xea, 0x89, 0x7b, 0x18, - 0xe2, 0xf9, 0xee, 0xae, 0xdb, 0x8d, 0x66, 0xb7, 0x7f, 0x0f, 0x63, 0xf0, 0x56, 0x74, 0x17, 0xe6, - 0xda, 0x1d, 0xaf, 0xe7, 0x90, 0x7d, 0xdf, 0x3b, 0x70, 0x1d, 0xea, 0x47, 0xc6, 0x3e, 0xcb, 0x5b, - 0x9b, 0x51, 0x23, 0x32, 0xe0, 0x94, 0x13, 0xbd, 0xae, 0xf2, 0xa5, 0x73, 0x66, 0xf5, 0x9d, 0xcc, - 0x03, 0x30, 0x75, 0xe2, 0x37, 0xdc, 0xc1, 0xe8, 0x62, 0x21, 0xe5, 0x67, 0x70, 0x65, 0x32, 0x1d, - 0xba, 0x0c, 0x27, 0x9d, 0xed, 0xe4, 0xe8, 0x4e, 0x38, 0xdb, 0x7c, 0x5c, 0x37, 0xe0, 0x8c, 0xb3, - 0x4d, 0x78, 0x0d, 0x54, 0xdb, 0xeb, 0x44, 0x63, 0x02, 0x67, 0xbb, 0x19, 0xb5, 0x94, 0xff, 0x55, - 0x82, 0x2b, 0xeb, 0xd4, 0x0e, 0x7b, 0x3e, 0xc5, 0xb4, 0xed, 0xed, 0xed, 0xd1, 0xae, 0x93, 0x38, - 0x46, 0x0d, 0xb9, 0x95, 0x34, 0xec, 0x56, 0xe8, 0xbb, 0x70, 0x72, 0x47, 0xb0, 0x46, 0xae, 0x7b, - 0x73, 0xe2, 0x18, 0x63, 0x15, 0x31, 0x03, 0xfa, 0x0c, 0x16, 0xa3, 0x9f, 0xc4, 0x1f, 0xd2, 0x4b, - 0x12, 0xaf, 0x0d, 0x73, 0xab, 0xef, 0x66, 0x4a, 0x1c, 0x62, 0x8e, 0xde, 0x1f, 0xae, 0xee, 0x4c, - 0xee, 0x2c, 0xbf, 0x82, 0x8b, 0x96, 0xb2, 0x21, 0x4e, 0xc2, 0xf4, 0xe3, 0x1e, 0xf5, 0xa3, 0xeb, - 0x83, 0x1b, 0x20, 0x8e, 0x49, 0x84, 0x9d, 0x6b, 0x45, 0xb5, 0xcb, 0x0c, 0x06, 0xde, 0xd4, 0x60, - 0x2d, 0x03, 0x02, 0xea, 0xec, 0xd2, 0xf8, 0x68, 0x25, 0x08, 0x34, 0xd6, 0xc2, 0x4e, 0xc9, 0x6e, - 0x40, 0x82, 0x1e, 0x8f, 0x07, 0x51, 0xc8, 0x3d, 0xed, 0x06, 0xa6, 0x68, 0x28, 0xaf, 0xc3, 0x35, - 0x93, 0xb6, 0x7b, 0xbe, 0x1b, 0x1e, 0x62, 0x3e, 0xa4, 0x0d, 0x1a, 0x62, 0x1a, 0xf4, 0x3a, 0xd1, - 0x22, 0x44, 0x70, 0x2c, 0x61, 0x66, 0xfe, 0x9b, 0xb5, 0xb1, 0x98, 0x1f, 0xc5, 0x7f, 0xfe, 0xbb, - 0x6c, 0xc3, 0x85, 0x7e, 0xde, 0x68, 0x9d, 0x86, 0xed, 0x17, 0x82, 0x7d, 0xdc, 0x33, 0xa5, 0x34, - 0xcf, 0x1c, 0x5b, 0x0e, 0xc5, 0xf1, 0xe5, 0x50, 0xfe, 0xa7, 0xf7, 0xe0, 0x5c, 0x8b, 0xd9, 0x9b, - 0x8b, 0x36, 0xba, 0xd4, 0xd8, 0x41, 0x2d, 0x38, 0xd7, 0x73, 0xc9, 0x36, 0x2f, 0x95, 0x23, 0x6d, - 0xf6, 0x56, 0x94, 0x19, 0x56, 0xc7, 0x2b, 0xeb, 0xaa, 0x05, 0x7c, 0xb6, 0xe7, 0x26, 0x5a, 0xd1, - 0x17, 0x12, 0x3c, 0xec, 0xb9, 0xc4, 0x13, 0x95, 0x63, 0x24, 0x3a, 0x5c, 0x52, 0xb2, 0xeb, 0x91, - 0xd0, 0x23, 0x4e, 0x5c, 0x5a, 0x17, 0x69, 0x14, 0x2f, 0x93, 0xca, 0x14, 0x8d, 0xf9, 0xea, 0xf3, - 0xaa, 0x05, 0x7c, 0xbb, 0xe7, 0x66, 0xd2, 0xa2, 0xcf, 0x25, 0xb8, 0x9d, 0x40, 0x67, 0x3b, 0x0e, - 0xd9, 0x71, 0x7d, 0xbe, 0x0b, 0x44, 0x36, 0x14, 0xb8, 0xc4, 0x1a, 0xff, 0x30, 0x1b, 0xd7, 0xe4, - 0x7a, 0xbf, 0x6a, 0x01, 0x5f, 0xef, 0x43, 0x4a, 0x25, 0x1b, 0xb5, 0x55, 0x0a, 0x9a, 0x8e, 0x1d, - 0xf6, 0x67, 0xe7, 0x78, 0x5e, 0x5b, 0x65, 0x14, 0x17, 0x0e, 0xd9, 0x6a, 0x32, 0x2d, 0xfa, 0x75, - 0x09, 0x6e, 0x26, 0xd0, 0x05, 0x34, 0x24, 0xed, 0x7e, 0x1d, 0x22, 0x09, 0x78, 0x09, 0x20, 0xdf, - 0xce, 0xcf, 0xac, 0x7e, 0x37, 0x1b, 0xd4, 0xa4, 0x2a, 0xc6, 0x6a, 0x01, 0x5f, 0xeb, 0xa3, 0x49, - 0x21, 0x42, 0xbf, 0x2b, 0xc1, 0x9d, 0x04, 0x0c, 0x3f, 0xca, 0x39, 0xb2, 0xc3, 0x88, 0x28, 0x46, - 0x8c, 0xa1, 0x9c, 0xe4, 0x50, 0xfe, 0x7f, 0x36, 0x94, 0x69, 0xe5, 0x8c, 0xd5, 0x02, 0xbe, 0xd9, - 0x87, 0x33, 0x81, 0x30, 0xb6, 0x8c, 0x1f, 0x15, 0x08, 0x92, 0x36, 0x8b, 0x27, 0xa4, 0x1d, 0x15, - 0x28, 0x46, 0xd3, 0x75, 0x2a, 0xd3, 0x32, 0x19, 0xe5, 0x8d, 0xc2, 0x32, 0x93, 0x89, 0xd0, 0x67, - 0x70, 0x2d, 0x0d, 0xc5, 0xfe, 0x61, 0x84, 0xe0, 0x34, 0x47, 0xf0, 0x5e, 0x7e, 0x04, 0xc9, 0xfa, - 0xc8, 0x6a, 0x01, 0x97, 0xc6, 0xb4, 0x47, 0x04, 0xe8, 0x97, 0x60, 0x71, 0x5c, 0xf3, 0xbe, 0xef, - 0x76, 0xc3, 0x48, 0x35, 0x70, 0xd5, 0xef, 0xe7, 0x55, 0x3d, 0x52, 0x5d, 0x59, 0x2d, 0xe0, 0x85, - 0x11, 0xdd, 0x03, 0x0a, 0xd4, 0x81, 0x85, 0x9e, 0x4b, 0x9c, 0x28, 0x64, 0xb2, 0xfd, 0xc5, 0x0f, - 0xa9, 0x43, 0xb8, 0xf0, 0xd2, 0x19, 0xae, 0x78, 0x25, 0x47, 0xc6, 0x3e, 0x59, 0xa3, 0x58, 0x2d, - 0xe0, 0xf9, 0x9e, 0x9b, 0x5a, 0xbd, 0xf8, 0xb9, 0x70, 0xbf, 0xbe, 0xba, 0xfe, 0xd2, 0x0c, 0xe2, - 0x44, 0x4d, 0xa4, 0x79, 0x96, 0x6b, 0xfe, 0x4e, 0x0e, 0xcd, 0xe9, 0x65, 0x87, 0xc2, 0xf3, 0x32, - 0x4a, 0x13, 0x7f, 0xc8, 0x1d, 0xaf, 0x0f, 0x26, 0x2a, 0x6e, 0x09, 0x44, 0x9d, 0x4a, 0x04, 0xe4, - 0x2c, 0x07, 0xf2, 0xed, 0xaf, 0x55, 0xe5, 0x22, 0x7c, 0x6e, 0x4a, 0x55, 0xd2, 0x6f, 0x89, 0x00, - 0x3a, 0x40, 0x10, 0x1d, 0x5d, 0x06, 0xeb, 0x52, 0x80, 0x98, 0xe3, 0x20, 0x9e, 0xe4, 0x01, 0x91, - 0x56, 0x4c, 0x50, 0x2d, 0xe0, 0x1b, 0x09, 0x1c, 0xa9, 0xf5, 0x06, 0x7f, 0x28, 0xa2, 0xe7, 0x38, - 0x94, 0x76, 0x7c, 0x8b, 0x4e, 0xf6, 0xc2, 0x4e, 0x10, 0x01, 0x3a, 0xc7, 0x01, 0xfd, 0xbf, 0xaf, - 0x00, 0x68, 0x3c, 0xbd, 0x5f, 0x2d, 0xe0, 0x3b, 0xe3, 0xa8, 0x06, 0x74, 0x61, 0x27, 0xca, 0x70, - 0xfe, 0x4c, 0x82, 0x27, 0xc3, 0xf3, 0xc4, 0x93, 0xc3, 0xc4, 0xe6, 0xd9, 0x61, 0xe2, 0xc4, 0xe9, - 0x61, 0x12, 0x7a, 0x5e, 0x27, 0x20, 0xae, 0xc8, 0x98, 0x47, 0x48, 0x65, 0x8e, 0xf4, 0x69, 0xae, - 0xf9, 0xcb, 0x95, 0x84, 0xaf, 0x16, 0xf0, 0xe3, 0xe4, 0xa4, 0xe6, 0xcb, 0xdc, 0xff, 0x54, 0x82, - 0x77, 0x73, 0x8d, 0x61, 0x60, 0x6e, 0x81, 0xff, 0x3c, 0xc7, 0xbf, 0xf1, 0xb5, 0xf1, 0x0f, 0x27, - 0x41, 0xaa, 0x05, 0xbc, 0x9c, 0x05, 0x7e, 0x24, 0x6d, 0xf2, 0x47, 0x12, 0x3c, 0x4a, 0x22, 0xb7, - 0x7b, 0xec, 0xe4, 0xd1, 0x3f, 0x6d, 0x27, 0x0a, 0x1e, 0x05, 0x60, 0xc4, 0x01, 0x7f, 0x94, 0x03, - 0xf0, 0xb4, 0xb4, 0x76, 0xb5, 0x80, 0xef, 0x0d, 0x80, 0x4e, 0x4d, 0x80, 0xff, 0xa5, 0x04, 0x2b, - 0x19, 0x9e, 0xeb, 0xda, 0x7b, 0x64, 0x9f, 0x27, 0xc3, 0x22, 0x90, 0x17, 0x38, 0xc8, 0xb5, 0xaf, - 0xe3, 0xbf, 0xc3, 0x79, 0xb5, 0x6a, 0x01, 0x3f, 0x9c, 0xe2, 0xc4, 0xba, 0xbd, 0x97, 0x4c, 0xc2, - 0xfd, 0x9e, 0x04, 0xf7, 0x92, 0x50, 0xf7, 0xfb, 0xb9, 0xaa, 0xb1, 0x79, 0xbf, 0xc8, 0x11, 0x7e, - 0x90, 0x03, 0xe1, 0xa4, 0x84, 0x57, 0xb5, 0x80, 0xcb, 0x03, 0x68, 0x13, 0xd3, 0x62, 0xbf, 0x2a, - 0xc1, 0xad, 0x24, 0xa6, 0x90, 0x06, 0x21, 0x43, 0xd3, 0x1d, 0x8a, 0xc7, 0x97, 0x32, 0x77, 0xbf, - 0x29, 0xd9, 0xa7, 0x6a, 0x01, 0x2f, 0x0e, 0x90, 0xa4, 0xa5, 0xa7, 0x7c, 0xb8, 0x9a, 0xc4, 0x10, - 0x9f, 0x73, 0xe3, 0x7d, 0x68, 0x3e, 0x23, 0xe5, 0x32, 0x29, 0xfd, 0x23, 0xb6, 0xdd, 0x09, 0xa9, - 0xa1, 0x0e, 0x94, 0x7a, 0x2e, 0x3b, 0x84, 0xd9, 0x21, 0x25, 0x5d, 0xfa, 0x8a, 0x5f, 0x90, 0x45, - 0x3b, 0xee, 0xe5, 0x8c, 0x57, 0xee, 0x89, 0x89, 0x97, 0x6a, 0x01, 0x5f, 0xec, 0xb9, 0xe3, 0x9d, - 0xe8, 0x90, 0x6f, 0xf2, 0xa3, 0xda, 0x02, 0xfb, 0x20, 0x56, 0x59, 0xca, 0xb4, 0xf0, 0x94, 0x74, - 0x8e, 0x18, 0x68, 0x3a, 0x01, 0xfa, 0x21, 0xdc, 0x48, 0x1b, 0x28, 0x4f, 0xf7, 0x44, 0xca, 0x17, - 0x32, 0x37, 0x98, 0xa9, 0xa9, 0xa2, 0x6a, 0x01, 0x5f, 0x19, 0x1d, 0xf5, 0x80, 0x04, 0xfd, 0x89, - 0x08, 0x21, 0xa3, 0x08, 0xc4, 0x95, 0x58, 0x32, 0x9d, 0x14, 0xa1, 0xb9, 0xc2, 0xd1, 0xa8, 0x79, - 0xd1, 0x4c, 0xc9, 0x4a, 0x55, 0x0b, 0xf8, 0xee, 0x08, 0xb0, 0x74, 0x6a, 0xf4, 0xe7, 0x12, 0x2c, - 0x27, 0x5d, 0xd0, 0x1d, 0x5c, 0xaa, 0x10, 0xfb, 0x55, 0x40, 0x3c, 0xd7, 0x69, 0xc7, 0xcb, 0x22, - 0xf2, 0xca, 0xab, 0x99, 0xaf, 0x10, 0xf9, 0x3e, 0x0d, 0xa8, 0x16, 0xf0, 0x83, 0x81, 0x97, 0x26, - 0x69, 0x5f, 0x05, 0x86, 0xeb, 0xb4, 0x87, 0x3e, 0x23, 0xf8, 0xb1, 0x04, 0x77, 0xd3, 0x8f, 0x0c, - 0x4e, 0x40, 0x28, 0xbf, 0xfe, 0x89, 0xe0, 0x5d, 0xcb, 0x7d, 0x84, 0x4a, 0xaf, 0xd8, 0x1f, 0x3e, - 0x42, 0xf5, 0x69, 0x9c, 0x20, 0x59, 0x9f, 0x1e, 0x0a, 0xb7, 0x66, 0xfb, 0x6d, 0xe8, 0x11, 0x91, - 0x67, 0x11, 0xb3, 0x18, 0xa1, 0x58, 0xcc, 0x5c, 0xba, 0xe9, 0x25, 0xe0, 0x91, 0x47, 0xa7, 0x97, - 0x87, 0xff, 0x00, 0xce, 0xdb, 0x3c, 0xe1, 0x43, 0x06, 0xe9, 0x96, 0xd2, 0x75, 0xae, 0x69, 0xf2, - 0x05, 0x61, 0x6a, 0x72, 0xb2, 0x5a, 0xc0, 0xb2, 0x3d, 0xd2, 0x11, 0x87, 0xc4, 0xa4, 0x0b, 0x44, - 0x96, 0xe5, 0xc7, 0xe3, 0x68, 0x64, 0x37, 0x32, 0x17, 0xec, 0x94, 0x4b, 0x45, 0x11, 0x12, 0xa7, - 0xdd, 0x3a, 0x46, 0x47, 0xe5, 0x14, 0x10, 0xfd, 0x5b, 0x00, 0x81, 0xe3, 0x66, 0xe6, 0x3c, 0x4f, - 0xbf, 0x6b, 0x14, 0xf3, 0x9c, 0x71, 0x1f, 0xf9, 0x6b, 0x12, 0x0f, 0x22, 0xf1, 0x7b, 0xe3, 0xa7, - 0xc9, 0x8f, 0xe0, 0xe2, 0x57, 0xc6, 0x5b, 0x79, 0xdf, 0x5e, 0x27, 0x7d, 0x42, 0x37, 0xf4, 0xf6, - 0x9a, 0x42, 0x84, 0x3e, 0x81, 0x68, 0xb2, 0x08, 0x8d, 0x73, 0xb5, 0xa5, 0x32, 0xd7, 0xfa, 0xad, - 0x8c, 0x69, 0x1f, 0xce, 0xed, 0x56, 0x0b, 0xf8, 0x9c, 0x3d, 0xdc, 0x8e, 0xf6, 0xe0, 0x72, 0x24, - 0x9b, 0x05, 0xa8, 0x64, 0x8a, 0xb7, 0x74, 0x3b, 0xe3, 0x8e, 0x72, 0x72, 0xa6, 0xb5, 0x5a, 0xc0, - 0x97, 0xec, 0xb4, 0x5e, 0xb4, 0x0d, 0x97, 0x06, 0xb7, 0x24, 0x22, 0x30, 0x8a, 0xe9, 0xbc, 0xc3, - 0x95, 0xbd, 0x35, 0x51, 0x59, 0xca, 0x2d, 0x6e, 0xb5, 0x80, 0x2f, 0xf8, 0x29, 0x97, 0xbb, 0xaf, - 0xe0, 0xda, 0x84, 0x6b, 0x44, 0xa1, 0xea, 0x6e, 0xc6, 0xb8, 0x26, 0x5f, 0x7d, 0xb2, 0x80, 0xbf, - 0x33, 0xf9, 0x62, 0x74, 0x1b, 0xa2, 0x51, 0x93, 0x28, 0x37, 0xe0, 0x8b, 0x24, 0x72, 0xe9, 0x5e, - 0xc6, 0xe0, 0x52, 0x12, 0xcf, 0x6c, 0x70, 0x76, 0x4a, 0x3e, 0xba, 0x06, 0x67, 0xfb, 0x3a, 0xf8, - 0x2c, 0xdd, 0xe7, 0xb2, 0xef, 0x66, 0xca, 0x66, 0xc4, 0xd5, 0x02, 0x9e, 0xb5, 0x93, 0x29, 0xe3, - 0x2d, 0x40, 0xc9, 0x34, 0x86, 0x98, 0x91, 0xd2, 0x83, 0x8c, 0x8a, 0x91, 0xd1, 0x94, 0x2d, 0x8f, - 0x26, 0xa3, 0x69, 0xdc, 0x11, 0xd1, 0x3d, 0x9e, 0x5c, 0x2c, 0x3d, 0xcc, 0x2d, 0x5a, 0x64, 0x23, - 0x87, 0x45, 0x47, 0x19, 0xca, 0x11, 0xd1, 0x0e, 0xcf, 0xed, 0x94, 0x96, 0x72, 0x8b, 0x16, 0xc9, - 0xa0, 0x61, 0xd1, 0x51, 0x82, 0xa8, 0x03, 0x0b, 0x49, 0xd1, 0x22, 0xe1, 0x14, 0xdb, 0xe5, 0x51, - 0xc6, 0xbd, 0x40, 0x7a, 0xce, 0xb6, 0x5a, 0xc0, 0xf3, 0x76, 0x7a, 0x36, 0x37, 0x5d, 0x5b, 0x64, - 0xaa, 0xb7, 0xbe, 0xa2, 0xb6, 0xbe, 0xc1, 0xc6, 0xb4, 0x45, 0x66, 0x4b, 0xd7, 0x16, 0x59, 0xef, - 0x5b, 0x5f, 0x51, 0x5b, 0xdf, 0x86, 0x63, 0xda, 0x22, 0x4b, 0xee, 0xc1, 0x95, 0xa4, 0x36, 0x9e, - 0x4f, 0x0d, 0xd8, 0x6e, 0xd9, 0x0b, 0xa8, 0x5f, 0x5a, 0xce, 0xad, 0x2e, 0x99, 0xd5, 0x1d, 0x56, - 0x37, 0x94, 0xef, 0xfd, 0x6d, 0x09, 0xca, 0xc9, 0x03, 0x02, 0x6d, 0xaf, 0x8a, 0x57, 0xe2, 0x6e, - 0xf2, 0x9a, 0xa5, 0xb4, 0x92, 0x79, 0x27, 0x9b, 0x59, 0x4e, 0x2b, 0xee, 0x64, 0xfb, 0x64, 0xed, - 0x71, 0x32, 0xf4, 0x12, 0x2e, 0xa7, 0xdc, 0xb0, 0x50, 0xb7, 0x4d, 0x4b, 0x6f, 0x67, 0x1e, 0xb1, - 0x27, 0x14, 0xb3, 0x8a, 0x23, 0xf6, 0x48, 0xa7, 0xdb, 0xa6, 0xa3, 0xca, 0xe2, 0xe3, 0xa6, 0xe7, - 0xd0, 0xd2, 0xe3, 0xdc, 0xca, 0x46, 0x0a, 0x48, 0x87, 0x95, 0x0d, 0x3a, 0xd1, 0xf7, 0xe1, 0x7c, - 0x68, 0xef, 0x46, 0xfb, 0x10, 0x65, 0x1b, 0xa2, 0x7f, 0x58, 0x5a, 0xcd, 0xd8, 0x8b, 0xd2, 0x52, - 0x2b, 0x6c, 0x2f, 0x0a, 0xed, 0xdd, 0x64, 0x3b, 0x0a, 0xe1, 0x4a, 0x10, 0x25, 0x43, 0x88, 0xcf, - 0x25, 0x91, 0x5d, 0xca, 0x2f, 0xb2, 0x7b, 0x9d, 0xb0, 0xf4, 0x4e, 0xc6, 0x95, 0xd4, 0xb4, 0x3c, - 0x4a, 0xb5, 0x80, 0x2f, 0x07, 0xe9, 0xfd, 0xa3, 0xcb, 0x22, 0x4a, 0xe5, 0x46, 0x4b, 0xfe, 0xdd, - 0xdc, 0x7e, 0x9a, 0x2c, 0x00, 0x18, 0xf6, 0xd3, 0xa1, 0xd2, 0x80, 0x74, 0x6d, 0xd1, 0x22, 0xfc, - 0xf6, 0x57, 0xd4, 0x96, 0xb6, 0x08, 0x87, 0xf2, 0xdd, 0xdb, 0x70, 0x29, 0x76, 0x8c, 0x43, 0xb2, - 0x43, 0xc3, 0xf6, 0x8b, 0x68, 0x0f, 0x7c, 0x2f, 0x63, 0x47, 0x4a, 0x49, 0x26, 0xb1, 0x1d, 0xc9, - 0x49, 0xc9, 0x31, 0xfd, 0x64, 0xe4, 0x36, 0x2f, 0x72, 0xc0, 0x81, 0x5e, 0xf1, 0x8e, 0x5f, 0x7a, - 0x3f, 0xf7, 0xe5, 0xd9, 0xe4, 0xef, 0xa0, 0x86, 0xaf, 0xf4, 0x52, 0xe9, 0xd0, 0x8f, 0x46, 0xde, - 0xec, 0x5f, 0xf6, 0xb6, 0x29, 0xa1, 0x2f, 0x47, 0x5e, 0x13, 0x9e, 0xe4, 0xbe, 0xe0, 0x1c, 0xff, - 0x3c, 0x75, 0xf8, 0x82, 0x93, 0xf7, 0xbf, 0x4c, 0xbe, 0x1e, 0xac, 0x9d, 0x84, 0xe3, 0x5c, 0xd2, - 0xd3, 0x63, 0xa7, 0x8a, 0xf2, 0x0c, 0x23, 0xee, 0x1f, 0x21, 0x99, 0x43, 0xc7, 0xb7, 0xcd, 0xfc, - 0x85, 0x61, 0xe9, 0xef, 0xce, 0x0d, 0x3e, 0xf5, 0x8f, 0x4f, 0x39, 0xe8, 0x16, 0x2c, 0x56, 0x74, - 0x53, 0x35, 0x9e, 0x69, 0x98, 0x60, 0xcd, 0x34, 0x5a, 0x58, 0x1d, 0xfd, 0x50, 0xef, 0x1a, 0x94, - 0xc6, 0x49, 0x4c, 0x0d, 0x3f, 0xd3, 0xb0, 0x2c, 0xa1, 0x9b, 0x70, 0x6d, 0xbc, 0x77, 0xb3, 0xb5, - 0xa6, 0xe1, 0x86, 0x66, 0x69, 0xa6, 0x5c, 0x44, 0xef, 0xc0, 0xca, 0x38, 0x45, 0x45, 0xb1, 0x94, - 0x35, 0xc5, 0xd4, 0x48, 0xd3, 0x30, 0xad, 0x0d, 0xac, 0x99, 0xc4, 0xd4, 0x6a, 0xeb, 0xa4, 0x6a, - 0x98, 0x96, 0x56, 0x91, 0x67, 0xd0, 0xdb, 0xf0, 0xd6, 0x14, 0xa6, 0xfa, 0x96, 0xf9, 0x71, 0x6d, - 0x88, 0xe3, 0x18, 0x5a, 0x85, 0xe5, 0x69, 0x1c, 0x46, 0x63, 0xc3, 0xa8, 0xac, 0x0d, 0xf1, 0x1c, - 0x47, 0x8f, 0xe0, 0x7e, 0x1e, 0x68, 0xb8, 0x62, 0xca, 0x27, 0xd0, 0x03, 0xb8, 0x93, 0x09, 0x89, - 0x51, 0x9e, 0x44, 0xf7, 0xa0, 0x3c, 0x4e, 0xa9, 0x34, 0x9b, 0x35, 0x5d, 0x55, 0x2c, 0xdd, 0x68, - 0x90, 0xaa, 0x65, 0x35, 0xe5, 0x53, 0xe8, 0x2e, 0xdc, 0x9a, 0x4e, 0x67, 0xa9, 0x4d, 0xf9, 0x74, - 0x3a, 0xd9, 0x73, 0xbd, 0x51, 0x31, 0x9e, 0x9b, 0xa4, 0xa2, 0x99, 0x9b, 0x96, 0xd1, 0x94, 0x01, - 0xbd, 0x05, 0x0f, 0xa6, 0xe0, 0x33, 0x3f, 0xae, 0x89, 0x39, 0xe3, 0x18, 0xcf, 0x64, 0x18, 0x78, - 0x30, 0x74, 0xad, 0x62, 0x56, 0xf5, 0x75, 0x4b, 0x9e, 0x45, 0xef, 0xc2, 0xdb, 0xb9, 0xe4, 0x27, - 0x4d, 0x7c, 0x36, 0x43, 0x0f, 0xd6, 0x2a, 0xfa, 0xf0, 0xd4, 0xcf, 0xe5, 0x9d, 0x94, 0x0d, 0xb5, - 0x29, 0x9f, 0xcb, 0x35, 0x29, 0x8c, 0x52, 0xce, 0x6d, 0x1e, 0x46, 0x7d, 0x1e, 0x7d, 0x00, 0xef, - 0x7f, 0x15, 0xf3, 0x44, 0xeb, 0xa1, 0xa6, 0x99, 0xa6, 0x8c, 0xd0, 0xb7, 0xe0, 0x61, 0x1e, 0x66, - 0xe5, 0x93, 0x16, 0xd6, 0xe4, 0x0b, 0xe8, 0x3e, 0xdc, 0x9e, 0x42, 0x5e, 0xd9, 0x6a, 0x28, 0x75, - 0xa3, 0xb2, 0x26, 0x5f, 0xcc, 0x70, 0x71, 0x55, 0x31, 0x4d, 0xa5, 0x51, 0xc1, 0x0a, 0xd9, 0xd4, - 0xb6, 0xcc, 0xa6, 0xa2, 0x6a, 0xa6, 0x7c, 0x29, 0x63, 0xd6, 0x06, 0x3c, 0xc9, 0x39, 0x98, 0x47, - 0x4f, 0xe0, 0xdd, 0x29, 0x5c, 0x5a, 0x4d, 0x31, 0x2d, 0x5d, 0x35, 0x35, 0x05, 0xab, 0xd5, 0x21, - 0xce, 0xcb, 0xb9, 0xe6, 0x3b, 0xe2, 0x57, 0xd4, 0xaa, 0x26, 0x97, 0x32, 0xac, 0x25, 0x38, 0xea, - 0x5a, 0xdd, 0xc0, 0x5b, 0x95, 0x35, 0x79, 0x21, 0x97, 0x02, 0x6e, 0x59, 0x22, 0x14, 0x5c, 0xc9, - 0x18, 0x8c, 0xe0, 0x50, 0x6b, 0x2d, 0xd3, 0x1a, 0x71, 0xde, 0xab, 0x68, 0x09, 0xee, 0x65, 0x7a, - 0x97, 0x98, 0xc5, 0x6b, 0x68, 0x19, 0x96, 0x72, 0xf9, 0x97, 0xa0, 0x5f, 0xcc, 0x98, 0xcc, 0x01, - 0x7d, 0x5d, 0x57, 0xb1, 0x61, 0x1a, 0xeb, 0x96, 0x7c, 0x1d, 0xbd, 0x07, 0xab, 0xd3, 0x26, 0xd3, - 0x50, 0x37, 0xb1, 0xa1, 0xa8, 0xd5, 0x91, 0x38, 0x77, 0x23, 0xc3, 0xf7, 0xe3, 0xd8, 0xa8, 0x58, - 0x35, 0xc5, 0x94, 0x6f, 0x66, 0xac, 0x29, 0xb3, 0x61, 0x3c, 0x5f, 0xaf, 0x29, 0x9b, 0x9a, 0x7c, - 0x6b, 0x82, 0x5c, 0x43, 0x4d, 0x58, 0xb7, 0x62, 0x92, 0x26, 0x36, 0xbe, 0xb7, 0x25, 0x97, 0x27, - 0xb8, 0x62, 0x92, 0xba, 0xaa, 0x6f, 0x54, 0x89, 0xf2, 0x4c, 0xd1, 0x6b, 0xca, 0x9a, 0x5e, 0xd3, - 0xad, 0x2d, 0xf9, 0x36, 0x7a, 0x1f, 0xde, 0xc9, 0xe0, 0xe2, 0x2b, 0x44, 0x57, 0x09, 0xd6, 0x36, - 0x74, 0xd3, 0xc2, 0x3c, 0x74, 0xca, 0x77, 0xd2, 0xa3, 0xb0, 0xa9, 0xd4, 0x6b, 0xc9, 0x10, 0x2b, - 0xdf, 0x45, 0x65, 0xb8, 0x3e, 0x4e, 0xa7, 0xa9, 0xab, 0xe2, 0x93, 0xf4, 0x86, 0xaa, 0xc9, 0xf7, - 0x26, 0x38, 0x9d, 0xa1, 0x8e, 0x86, 0x61, 0xd2, 0x30, 0x1a, 0x44, 0xa9, 0xc8, 0xf7, 0xd1, 0x1d, - 0xb8, 0x39, 0x6d, 0x5f, 0xe4, 0x9f, 0x2a, 0x3f, 0x48, 0xf7, 0xfd, 0xe4, 0x0e, 0xa0, 0x3c, 0x37, - 0x89, 0x6a, 0x34, 0x4c, 0xa3, 0xa6, 0xc9, 0x0f, 0x97, 0xfe, 0x54, 0x82, 0xb9, 0xe1, 0x7f, 0xba, - 0x41, 0x37, 0xe0, 0x6a, 0x5f, 0x82, 0x69, 0x29, 0x56, 0xcb, 0x1c, 0xd9, 0xbe, 0xaf, 0xc2, 0xe5, - 0x51, 0x02, 0xb3, 0xa5, 0xaa, 0x2c, 0x52, 0x49, 0xa9, 0x9d, 0x9b, 0x7a, 0xb3, 0xa9, 0x55, 0xe4, - 0x22, 0x5a, 0x80, 0x4b, 0xa3, 0x9d, 0x1a, 0xc6, 0x06, 0x96, 0x67, 0xd2, 0xf8, 0x94, 0x35, 0x03, - 0xf3, 0x9d, 0x78, 0xe9, 0x67, 0x45, 0x98, 0x51, 0x2d, 0x05, 0x5d, 0x80, 0x73, 0xaa, 0xa5, 0x8c, - 0xff, 0xa7, 0x00, 0x6b, 0x54, 0x5a, 0x56, 0x95, 0x0d, 0xac, 0xa1, 0xa9, 0x96, 0xc1, 0xce, 0x11, - 0x97, 0xe1, 0x02, 0x6f, 0x57, 0x2d, 0xfd, 0x19, 0x3b, 0x5e, 0x98, 0xa6, 0x6e, 0x34, 0xd8, 0xf1, - 0xa1, 0xdf, 0xc1, 0x20, 0x13, 0xac, 0x7d, 0xdc, 0xd2, 0x4c, 0xcb, 0x94, 0x67, 0xe2, 0x8e, 0x26, - 0xd6, 0xea, 0x7a, 0xab, 0x4e, 0xcc, 0x56, 0xb3, 0x69, 0x60, 0x4b, 0x3e, 0x16, 0x77, 0x58, 0x98, - 0x2d, 0xe9, 0x0a, 0xa9, 0x68, 0xcf, 0x74, 0x16, 0x0b, 0x8f, 0xc7, 0xba, 0x5b, 0xcd, 0x0d, 0xac, - 0x54, 0x34, 0xb2, 0xa6, 0x34, 0x1a, 0x1a, 0x96, 0x4f, 0xc4, 0x0c, 0x6b, 0x7a, 0xad, 0xa6, 0x37, - 0x36, 0x88, 0xd9, 0xaa, 0xd7, 0x15, 0xbc, 0x25, 0x9f, 0x8c, 0x47, 0x10, 0xe9, 0xae, 0xe9, 0xa6, - 0x25, 0x9f, 0xe2, 0x5f, 0x9e, 0x0f, 0x1a, 0xeb, 0x46, 0x43, 0xb7, 0x0c, 0xac, 0x37, 0x36, 0xe4, - 0xd3, 0xfc, 0x9b, 0x76, 0x4b, 0x21, 0xda, 0xf7, 0x2c, 0x0d, 0x37, 0x94, 0x1a, 0x51, 0x5a, 0x15, - 0xdd, 0x22, 0xa6, 0x65, 0x60, 0x65, 0x43, 0x93, 0x21, 0x06, 0x60, 0x6c, 0x32, 0x14, 0x26, 0xb3, - 0xdd, 0x56, 0x43, 0x95, 0xcf, 0x20, 0x19, 0x66, 0x39, 0x5f, 0xc3, 0xc2, 0x0a, 0xd1, 0x2b, 0xf2, - 0xec, 0xd2, 0xdf, 0x9e, 0x80, 0x4b, 0xa9, 0x25, 0x97, 0x6c, 0xb7, 0xd0, 0x1b, 0x96, 0xb6, 0x21, - 0xfc, 0x9c, 0x68, 0x0d, 0x6c, 0xd4, 0x6a, 0x64, 0x53, 0x6f, 0x8c, 0x7e, 0x7f, 0x7f, 0x0b, 0x16, - 0x27, 0x11, 0x9a, 0x35, 0x45, 0xdd, 0x94, 0x25, 0xe6, 0xa4, 0x93, 0x48, 0x98, 0xe3, 0x19, 0x7a, - 0x45, 0x95, 0x8b, 0xec, 0xfc, 0x31, 0x89, 0xaa, 0xa9, 0x6c, 0x68, 0xb8, 0xd2, 0xb2, 0xb6, 0xe4, - 0x99, 0x69, 0xfa, 0xb4, 0xba, 0xa2, 0xd7, 0xe4, 0x63, 0xec, 0xb0, 0x38, 0x89, 0xe4, 0xa9, 0x8e, - 0x15, 0xf9, 0x38, 0xba, 0x0d, 0x37, 0x26, 0x51, 0x70, 0x87, 0xc3, 0x15, 0xf9, 0x04, 0x5b, 0xd9, - 0x93, 0x88, 0xea, 0x8a, 0x65, 0x69, 0xb8, 0x6e, 0x98, 0x96, 0x7c, 0x72, 0xda, 0xf0, 0xea, 0x26, - 0xb1, 0x34, 0xa5, 0x6e, 0xca, 0xa7, 0xa6, 0x51, 0x19, 0x4d, 0x73, 0x43, 0x6b, 0xe8, 0x9a, 0x7c, - 0x7a, 0x1a, 0x74, 0x36, 0x9d, 0x32, 0x4c, 0x1d, 0x9c, 0x52, 0x5f, 0x97, 0xcf, 0x4c, 0xc7, 0xad, - 0x56, 0xf5, 0x86, 0xc6, 0x27, 0x1f, 0x7d, 0x1b, 0x1e, 0x67, 0xd3, 0x91, 0x0d, 0xdd, 0xaa, 0xb6, - 0xd6, 0xf8, 0x8a, 0x61, 0x2b, 0xe5, 0x2c, 0x5a, 0x81, 0x47, 0x39, 0xd8, 0x54, 0x1d, 0xab, 0x35, - 0x4d, 0xd5, 0xe5, 0x39, 0x16, 0x7d, 0xf2, 0xe9, 0xa9, 0x29, 0x6b, 0xf2, 0x39, 0xb6, 0xc3, 0xe5, - 0x20, 0x7f, 0xaa, 0x35, 0x36, 0xf5, 0x86, 0x29, 0xcb, 0x39, 0xe9, 0x95, 0x86, 0xa9, 0xaf, 0xd5, - 0x34, 0xf9, 0xfc, 0x34, 0xf3, 0xb0, 0xbd, 0x50, 0x57, 0xb5, 0x86, 0xf1, 0x5c, 0x46, 0xd3, 0x26, - 0xac, 0xbf, 0x82, 0x2e, 0x2c, 0x7d, 0x04, 0x27, 0xa3, 0x0b, 0x56, 0xb6, 0xbe, 0xd7, 0x35, 0xc5, - 0x62, 0x67, 0x82, 0xb1, 0xd8, 0x18, 0x77, 0x8c, 0x46, 0x0b, 0x69, 0xe9, 0x8f, 0x25, 0xb8, 0x3a, - 0xa5, 0xd0, 0x93, 0x59, 0x2f, 0x66, 0xc6, 0x9a, 0x6a, 0xd4, 0xeb, 0x5a, 0xa3, 0x22, 0x10, 0xa5, - 0xc6, 0xe1, 0x25, 0xb8, 0x37, 0x9d, 0xbc, 0x61, 0x58, 0x82, 0x56, 0x62, 0x96, 0x98, 0x4e, 0x5b, - 0x31, 0x1a, 0x9a, 0x5c, 0x5c, 0xfb, 0xc1, 0xdf, 0x7f, 0x79, 0x5d, 0xfa, 0x87, 0x2f, 0xaf, 0x4b, - 0xff, 0xf2, 0xe5, 0x75, 0xe9, 0x13, 0x63, 0xd7, 0x0d, 0x5f, 0xf4, 0xb6, 0x97, 0xdb, 0xde, 0xde, - 0xca, 0xae, 0x6f, 0x1f, 0xb8, 0x22, 0x01, 0x67, 0x77, 0x56, 0xfa, 0xff, 0x55, 0x68, 0xef, 0xbb, - 0x2b, 0xbb, 0xb4, 0xbb, 0xc2, 0x8b, 0x72, 0x57, 0x76, 0xbd, 0x91, 0x3f, 0x2f, 0xfc, 0x20, 0xf1, - 0x78, 0xf0, 0x78, 0xfb, 0x04, 0x27, 0x7b, 0xe7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x4e, 0xa0, - 0xc8, 0x4e, 0xec, 0x50, 0x00, 0x00, + // 4847 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0xdb, 0x6f, 0x1b, 0x49, + 0x76, 0x37, 0x5b, 0xf2, 0xf5, 0x58, 0x96, 0xdb, 0x65, 0x5b, 0xa6, 0x6c, 0xcb, 0x17, 0xfa, 0x2e, + 0xcf, 0x48, 0x63, 0xcd, 0xcd, 0xb3, 0x33, 0xdf, 0x37, 0x69, 0x35, 0x5b, 0x62, 0x5b, 0x24, 0x9b, + 0x53, 0xdd, 0xb4, 0x57, 0xb3, 0x58, 0x14, 0x5a, 0xec, 0x92, 0xdc, 0x30, 0xc5, 0xe6, 0x74, 0x37, + 0xe5, 0x51, 0x82, 0x60, 0x37, 0xb7, 0x45, 0x90, 0xd9, 0x0d, 0x12, 0x20, 0x08, 0x02, 0x0c, 0x10, + 0x24, 0xc8, 0x05, 0x79, 0x08, 0x90, 0xa7, 0x60, 0x1f, 0x93, 0x7d, 0xcb, 0x63, 0x80, 0x3c, 0x06, + 0x08, 0x82, 0xf9, 0x07, 0xf2, 0x94, 0x00, 0xb9, 0x21, 0x41, 0x55, 0x75, 0x93, 0x4d, 0xb2, 0xc9, + 0xee, 0x99, 0x78, 0xb0, 0x80, 0xfd, 0x46, 0x56, 0x9d, 0x53, 0xe7, 0x57, 0xa7, 0x4e, 0x9d, 0x3a, + 0x55, 0xe7, 0x90, 0x70, 0x3f, 0xa4, 0x6d, 0xda, 0xf5, 0xfc, 0x70, 0xb5, 0x17, 0xd8, 0x7b, 0x94, + 0x1e, 0xd0, 0x4e, 0x18, 0xac, 0x1e, 0x3c, 0x4c, 0x7e, 0x5d, 0xe9, 0xfa, 0x5e, 0xe8, 0xa1, 0x8b, + 0x31, 0xe9, 0x4a, 0xb2, 0xef, 0xe0, 0x61, 0x69, 0x19, 0x50, 0x53, 0x5f, 0xb7, 0x3b, 0x1d, 0xea, + 0xab, 0x6d, 0xb7, 0xf5, 0x5c, 0x63, 0x3d, 0xe8, 0x3c, 0x1c, 0xb5, 0xdb, 0xd4, 0x0f, 0x8b, 0xd2, + 0x75, 0xe9, 0xde, 0x49, 0x2c, 0xbe, 0x94, 0x36, 0xe0, 0x5e, 0x53, 0x37, 0x3a, 0x3b, 0x9e, 0xed, + 0x3b, 0xaa, 0xb7, 0xdf, 0x6d, 0xd3, 0x90, 0x6e, 0x7a, 0x96, 0x57, 0xb6, 0x83, 0x67, 0xa2, 0x71, + 0x30, 0xc2, 0x25, 0x38, 0xd1, 0x0b, 0xa8, 0xdf, 0xb1, 0xf7, 0x69, 0x34, 0x48, 0xff, 0x7b, 0xe9, + 0x36, 0xdc, 0xec, 0x8f, 0xa3, 0x38, 0xce, 0x86, 0xeb, 0x07, 0x21, 0xa6, 0x81, 0xd7, 0xf3, 0x5b, + 0x74, 0x30, 0x44, 0x69, 0x39, 0x21, 0x6e, 0x94, 0xac, 0x6a, 0x87, 0x49, 0xc0, 0xa5, 0x8f, 0xe1, + 0x46, 0x9f, 0xd6, 0xa4, 0xa1, 0xea, 0x53, 0x87, 0x76, 0x42, 0xd7, 0x6e, 0x9b, 0xbd, 0x9d, 0x7d, + 0x37, 0xcc, 0xc6, 0x94, 0x1c, 0xe0, 0x93, 0x1e, 0x0d, 0x42, 0xd7, 0xeb, 0x74, 0x6c, 0xd7, 0xa7, + 0x79, 0x07, 0xf8, 0x65, 0xb8, 0xdd, 0x1f, 0x00, 0xd3, 0x3d, 0x37, 0x60, 0x00, 0x9f, 0xd9, 0xed, + 0x36, 0xed, 0xec, 0xe5, 0x1d, 0x04, 0x2d, 0xc2, 0x89, 0xfd, 0x5d, 0x9b, 0x84, 0x87, 0x5d, 0x5a, + 0x9c, 0xe1, 0x7d, 0xc7, 0xf7, 0x77, 0x6d, 0xeb, 0xb0, 0x4b, 0xd1, 0x12, 0x40, 0xdb, 0xdb, 0x73, + 0x3b, 0x64, 0xb7, 0xed, 0xbd, 0x28, 0xce, 0xf2, 0xce, 0x93, 0xbc, 0x65, 0xa3, 0xed, 0xbd, 0x10, + 0xf8, 0x31, 0x6d, 0x79, 0x07, 0xd4, 0x3f, 0x54, 0x3d, 0x87, 0x06, 0xaa, 0xd7, 0x09, 0xdd, 0x4e, + 0x8f, 0xe6, 0x5c, 0x94, 0x0f, 0x61, 0x69, 0x6c, 0x80, 0xee, 0x61, 0x4e, 0xe6, 0x8f, 0xe0, 0xea, + 0x08, 0x73, 0xc3, 0x77, 0x3b, 0x61, 0x4e, 0xee, 0x12, 0xc8, 0x65, 0x37, 0xe0, 0xcc, 0x35, 0x1a, + 0xda, 0x8e, 0x1d, 0xda, 0x68, 0x1e, 0x66, 0x5c, 0x27, 0xa2, 0x9c, 0x71, 0x9d, 0x92, 0x0d, 0xc5, + 0x98, 0x26, 0xb6, 0x81, 0x3e, 0xad, 0x06, 0x27, 0xfc, 0xa8, 0x8d, 0x73, 0xcc, 0xaf, 0xdd, 0x5f, + 0x99, 0x60, 0xef, 0x2b, 0xa3, 0x83, 0xe0, 0x3e, 0x6b, 0xe9, 0x39, 0xa0, 0xb8, 0xd7, 0x0c, 0x69, + 0xd7, 0x0c, 0xed, 0xb0, 0x17, 0xa0, 0x8f, 0xe1, 0x58, 0xc0, 0x3f, 0x45, 0x43, 0xdf, 0xcd, 0x1c, + 0x5a, 0x30, 0xe2, 0x88, 0x8d, 0xed, 0x25, 0xea, 0xfb, 0x9e, 0x1f, 0x2d, 0xa8, 0xf8, 0x52, 0xfa, + 0x53, 0x09, 0x16, 0x9a, 0x7a, 0x82, 0xc5, 0x0f, 0xa9, 0x23, 0x54, 0xa5, 0xc1, 0x89, 0xfd, 0x68, + 0x6a, 0x5c, 0xe6, 0xa9, 0x1c, 0xd3, 0x89, 0x75, 0x81, 0xfb, 0xac, 0x48, 0xed, 0x03, 0x9f, 0xe1, + 0x83, 0x3c, 0xc8, 0x01, 0x3c, 0x9e, 0x75, 0x0c, 0xbe, 0xf4, 0xdf, 0x12, 0x5c, 0x1f, 0xc0, 0x8c, + 0x95, 0x66, 0xd2, 0x36, 0x6d, 0xb1, 0x1d, 0xf2, 0x52, 0x01, 0xd7, 0x12, 0xcb, 0x28, 0x20, 0x3f, + 0xcc, 0xbd, 0x8c, 0x83, 0xe1, 0xe2, 0x21, 0x12, 0xf3, 0x9f, 0xfd, 0xe6, 0xf3, 0xff, 0x8d, 0x19, + 0xe6, 0x84, 0x62, 0x02, 0xbd, 0x13, 0xd2, 0x3d, 0xdf, 0x66, 0x33, 0x57, 0x9e, 0x9a, 0x86, 0x5e, + 0x56, 0x55, 0xaf, 0xd3, 0xa1, 0xad, 0xf0, 0x95, 0xd7, 0xc3, 0x4f, 0x67, 0x92, 0x76, 0x50, 0xb6, + 0x43, 0x7b, 0xc7, 0x0e, 0x28, 0x2e, 0x9b, 0x5a, 0xc7, 0xf7, 0xda, 0xed, 0x57, 0x7d, 0xfe, 0xe8, + 0x11, 0x14, 0x03, 0x6e, 0xf4, 0xd4, 0x21, 0xf1, 0xc8, 0x01, 0x69, 0x79, 0xbd, 0x4e, 0x58, 0x3c, + 0x72, 0x5d, 0xba, 0x37, 0x8b, 0x17, 0xe2, 0xfe, 0x18, 0x4a, 0xa0, 0xb2, 0xde, 0xd2, 0xbf, 0x4b, + 0x70, 0x65, 0xa0, 0xb9, 0xad, 0xde, 0x0e, 0xd5, 0xb6, 0x5e, 0x13, 0xad, 0x95, 0x1e, 0x43, 0xb1, + 0xa9, 0xab, 0x76, 0xbb, 0x6d, 0x79, 0x0a, 0xf7, 0x17, 0x89, 0x03, 0x61, 0x05, 0x66, 0x5b, 0xd1, + 0x8c, 0xe7, 0xd7, 0xae, 0x4c, 0x1c, 0x5d, 0xb5, 0x14, 0xcc, 0x08, 0x4b, 0x3f, 0x39, 0x9a, 0xd4, + 0x63, 0x99, 0x76, 0xdb, 0xde, 0xa1, 0x49, 0xfd, 0x03, 0xb7, 0x45, 0x5f, 0x79, 0xeb, 0xdb, 0x83, + 0xd3, 0x0e, 0x9f, 0x30, 0xd9, 0xa7, 0xe1, 0x33, 0xcf, 0xe1, 0x26, 0x37, 0xbf, 0xb6, 0x3e, 0x71, + 0xac, 0x69, 0x8a, 0x5a, 0x11, 0x4d, 0x35, 0x3e, 0x12, 0x9e, 0x73, 0x12, 0xdf, 0x90, 0x0d, 0xa7, + 0x22, 0x41, 0x3c, 0x04, 0x39, 0xca, 0xc5, 0xfc, 0xc2, 0xff, 0x45, 0x0c, 0x8b, 0x5d, 0x30, 0x38, + 0xfd, 0xcf, 0x25, 0x02, 0x73, 0x49, 0x00, 0x68, 0x09, 0x16, 0xcb, 0x5a, 0xa3, 0x6a, 0x6c, 0x93, + 0x9a, 0x66, 0x55, 0x8c, 0x32, 0x69, 0xd6, 0xcd, 0x86, 0xa6, 0xea, 0x1b, 0xba, 0x56, 0x96, 0x0b, + 0x68, 0x01, 0xd0, 0x70, 0xb7, 0xd2, 0xb4, 0x0c, 0x59, 0x42, 0x45, 0x38, 0x3f, 0xdc, 0x5e, 0x53, + 0xea, 0x4d, 0xa5, 0x2a, 0xcf, 0x94, 0x28, 0xc0, 0x40, 0x34, 0xba, 0x0c, 0x17, 0x23, 0x3a, 0x6b, + 0xbb, 0xa1, 0x8d, 0x0c, 0x7e, 0x15, 0x2e, 0x25, 0x3b, 0xf5, 0xba, 0x69, 0x29, 0xd5, 0x2a, 0x31, + 0x55, 0xac, 0x37, 0x2c, 0x59, 0x42, 0x97, 0x60, 0x21, 0xd9, 0xaf, 0xd4, 0x94, 0x4f, 0x8d, 0x3a, + 0xd1, 0x54, 0x53, 0x9e, 0x29, 0x7d, 0x79, 0x04, 0x6e, 0x0d, 0xe6, 0xaf, 0xfa, 0xd4, 0x0e, 0x69, + 0xfc, 0xed, 0x50, 0xf5, 0x3a, 0xbb, 0xee, 0xde, 0x2b, 0x6f, 0x97, 0x1e, 0x9c, 0x6e, 0xf1, 0x99, + 0x0e, 0xdb, 0xe5, 0xe3, 0x1c, 0x06, 0x33, 0x59, 0x61, 0x2b, 0xe2, 0x73, 0x6c, 0x9f, 0xad, 0xc4, + 0xb7, 0xd2, 0x9f, 0x4b, 0x30, 0x97, 0xec, 0x66, 0xd6, 0xa3, 0x1a, 0xf5, 0x0d, 0x7d, 0x33, 0xdd, + 0x7a, 0xc6, 0xba, 0x95, 0xa7, 0x26, 0xd1, 0xd4, 0x35, 0x62, 0x9a, 0x35, 0x59, 0x62, 0xeb, 0x9f, + 0xde, 0xad, 0xe9, 0xaa, 0x26, 0xcf, 0xa4, 0xb3, 0xe3, 0xb2, 0xc9, 0x4d, 0x60, 0x16, 0x2d, 0xc2, + 0x85, 0x14, 0xf6, 0x2d, 0x53, 0x3e, 0x52, 0xfa, 0x2f, 0x09, 0xae, 0xa5, 0x9c, 0x97, 0xd1, 0xbd, + 0xe0, 0x95, 0x77, 0xfc, 0xbf, 0x32, 0x93, 0xdc, 0x1c, 0xf1, 0xf4, 0xc5, 0xca, 0xf5, 0x7c, 0x5a, + 0xb3, 0xaa, 0xe6, 0x2b, 0xaf, 0x83, 0xdf, 0x9e, 0x81, 0x87, 0x49, 0x07, 0x19, 0x3c, 0x0f, 0xbd, + 0x2e, 0x3b, 0x06, 0x0f, 0x68, 0xd9, 0xf5, 0x69, 0x2b, 0xf4, 0xfc, 0x43, 0xcb, 0xf3, 0xda, 0x81, + 0xde, 0x09, 0x42, 0xfb, 0x35, 0x88, 0x06, 0xbe, 0x98, 0x81, 0x95, 0x2c, 0x85, 0xf4, 0x4d, 0xe4, + 0x95, 0xd7, 0xc6, 0x5f, 0xce, 0xc0, 0x9d, 0x81, 0x36, 0x94, 0x5e, 0xe8, 0xc5, 0x9f, 0x13, 0x21, + 0xe4, 0x2b, 0x7f, 0x82, 0xdc, 0x85, 0x33, 0xe9, 0xe1, 0xf4, 0xbc, 0x3f, 0x1c, 0x46, 0xff, 0x70, + 0x06, 0x6e, 0x0e, 0xd4, 0xa5, 0xa9, 0x6b, 0x7c, 0xd7, 0x74, 0x5e, 0xa7, 0xbb, 0xe8, 0xbf, 0x49, + 0xb0, 0x38, 0x1a, 0x71, 0xb1, 0x83, 0xea, 0x35, 0x9b, 0xb8, 0x88, 0x1c, 0xea, 0x9e, 0xf3, 0xea, + 0xfb, 0x88, 0xff, 0x94, 0xe0, 0xea, 0xe8, 0xc4, 0x95, 0x6e, 0x97, 0x85, 0xd9, 0xaf, 0x41, 0x10, + 0xf1, 0xa3, 0x19, 0xb8, 0x3f, 0x25, 0x88, 0xd0, 0x95, 0x5a, 0xc3, 0x6b, 0xbb, 0xad, 0xc3, 0x57, + 0x5e, 0x11, 0xff, 0x23, 0x41, 0x69, 0xa0, 0x88, 0x86, 0xef, 0x76, 0x5a, 0x6e, 0xd7, 0x6e, 0x07, + 0xaf, 0xcf, 0x61, 0xf9, 0x1f, 0x12, 0x2c, 0x0d, 0x34, 0x60, 0xd1, 0x20, 0x8c, 0x1e, 0xde, 0x5e, + 0x07, 0xbf, 0xff, 0xaf, 0x12, 0x14, 0x13, 0x5e, 0x20, 0x4a, 0xbc, 0x38, 0xaf, 0xfc, 0xbc, 0x2f, + 0x33, 0xaf, 0x1f, 0x79, 0x7b, 0xfa, 0x02, 0x7b, 0xed, 0x64, 0x72, 0xe8, 0x1a, 0x33, 0x88, 0xa1, + 0x4e, 0xd3, 0x3e, 0x48, 0x12, 0xdc, 0x60, 0x17, 0xb0, 0x61, 0x6e, 0x16, 0x2e, 0xb4, 0x13, 0x24, + 0x6f, 0xc0, 0xf2, 0x08, 0xc9, 0x13, 0x97, 0xbe, 0x28, 0x7b, 0xad, 0xde, 0x3e, 0xed, 0x84, 0xf6, + 0xf0, 0x83, 0x55, 0xe9, 0xaf, 0x25, 0xb8, 0xa0, 0x04, 0x81, 0xcb, 0x6c, 0x8f, 0x2f, 0x41, 0xdf, + 0xf6, 0xee, 0xc2, 0x99, 0x96, 0xd7, 0x39, 0xa0, 0x7e, 0xc0, 0x79, 0x48, 0x3f, 0x71, 0x31, 0x9f, + 0x6c, 0xd6, 0x1d, 0x74, 0x03, 0xe6, 0x42, 0x2f, 0xb4, 0xdb, 0x24, 0xf4, 0x9e, 0xd3, 0x8e, 0x78, + 0x98, 0x9f, 0xc5, 0xa7, 0x78, 0x9b, 0xc5, 0x9b, 0xd0, 0x4d, 0x38, 0xdd, 0xf5, 0xbd, 0xfd, 0x6e, + 0x18, 0xd3, 0xcc, 0x72, 0x9a, 0x39, 0xd1, 0x18, 0x11, 0x3d, 0x80, 0xb3, 0xad, 0x3e, 0x86, 0x98, + 0x50, 0xc4, 0x4d, 0xf2, 0xa0, 0x43, 0x10, 0x97, 0xfe, 0x41, 0x82, 0xf3, 0x02, 0xb7, 0xf6, 0x39, + 0x6d, 0xf5, 0xbe, 0x01, 0xec, 0x25, 0x80, 0x8e, 0xe7, 0xd0, 0x28, 0x3e, 0x13, 0xa0, 0x4f, 0xb2, + 0x16, 0x1e, 0x9a, 0x8d, 0xcd, 0x6a, 0x36, 0xc7, 0xac, 0x8e, 0xe4, 0x9d, 0xd5, 0xd1, 0x09, 0xb3, + 0x7a, 0x04, 0x97, 0xc4, 0xa4, 0xea, 0xf4, 0x85, 0x9a, 0x80, 0xdb, 0xcf, 0x36, 0xb5, 0xec, 0x90, + 0xee, 0x79, 0xfe, 0x61, 0x9c, 0x6d, 0x8a, 0xbf, 0x97, 0xfe, 0x4a, 0x82, 0x73, 0x82, 0x55, 0x69, + 0xb5, 0x68, 0x10, 0x60, 0xfa, 0x59, 0x8f, 0x06, 0x21, 0xc3, 0x18, 0xdb, 0xaf, 0x78, 0xfd, 0x12, + 0x8c, 0x73, 0x71, 0x23, 0x7f, 0x4e, 0xfa, 0xb9, 0xac, 0xe0, 0x97, 0x12, 0xcc, 0xc5, 0x88, 0x59, + 0x33, 0x5a, 0x80, 0x63, 0x36, 0xff, 0x14, 0x61, 0x8c, 0xbe, 0xfd, 0x7c, 0xd0, 0xdd, 0x02, 0x24, + 0x14, 0x59, 0x75, 0x83, 0x70, 0x62, 0xfe, 0xee, 0x7b, 0x20, 0x0f, 0xa8, 0xc4, 0x9e, 0x43, 0x9b, + 0x63, 0xbe, 0x6b, 0xb2, 0x9f, 0x18, 0x17, 0x31, 0xf0, 0x5e, 0xc3, 0x83, 0x37, 0xbb, 0xce, 0xb7, + 0x37, 0x78, 0x99, 0x32, 0xdf, 0xfb, 0xf2, 0x06, 0xb7, 0x61, 0x21, 0xd9, 0xbf, 0xbf, 0x13, 0x87, + 0x79, 0xdf, 0xaa, 0x88, 0x97, 0xad, 0xa2, 0x14, 0x11, 0x2f, 0x5b, 0x51, 0xbf, 0x98, 0x14, 0xb1, + 0xe9, 0xdb, 0x9d, 0x30, 0xb0, 0xbc, 0x66, 0x40, 0x7d, 0xb4, 0x02, 0xe7, 0xb8, 0x63, 0x22, 0xbe, + 0xd7, 0xa6, 0x01, 0xd9, 0x63, 0x7d, 0x54, 0x98, 0xde, 0x51, 0x7c, 0x96, 0x77, 0x31, 0xd7, 0x1e, + 0x6c, 0x8a, 0x0e, 0xf4, 0x16, 0x9c, 0x17, 0xf4, 0xa1, 0x6f, 0xbb, 0xe1, 0x80, 0x61, 0x86, 0x33, + 0x20, 0xde, 0x67, 0xf1, 0xae, 0x88, 0xa3, 0xf4, 0xfb, 0xb3, 0x49, 0xe1, 0x98, 0x1e, 0xb8, 0xf4, + 0xc5, 0x4b, 0x5e, 0x25, 0xf4, 0x08, 0x16, 0x1d, 0xfb, 0x30, 0x20, 0x5d, 0x3b, 0x08, 0x49, 0x87, + 0x7e, 0x1e, 0x12, 0xbb, 0xe7, 0xb8, 0x21, 0x61, 0x0b, 0x15, 0x41, 0xbb, 0xc0, 0x08, 0x1a, 0x36, + 0x73, 0x79, 0x9f, 0x87, 0x0a, 0xeb, 0x2d, 0x33, 0x08, 0x1b, 0x70, 0x6d, 0x9f, 0xab, 0x3c, 0x78, + 0xe6, 0x76, 0x89, 0x4f, 0x3f, 0xeb, 0xb9, 0x3e, 0x65, 0x07, 0x58, 0x40, 0x5a, 0xcf, 0xec, 0xce, + 0x1e, 0x75, 0xf8, 0x1e, 0x3f, 0x81, 0x97, 0x06, 0x64, 0x38, 0x41, 0xa5, 0x0a, 0x22, 0xf4, 0x08, + 0x8a, 0x3e, 0x9f, 0x1a, 0xd9, 0x65, 0x83, 0xd0, 0x4e, 0xeb, 0xb0, 0x3f, 0xc0, 0x11, 0x3e, 0xc0, + 0x82, 0xe8, 0xdf, 0x88, 0xbb, 0x63, 0xce, 0x8f, 0xe0, 0x72, 0xc4, 0xe9, 0xd8, 0x87, 0xc4, 0xdb, + 0x25, 0xfb, 0x5e, 0x27, 0x7c, 0xd6, 0x67, 0x3e, 0xca, 0x99, 0x2f, 0x0a, 0x92, 0xb2, 0x7d, 0x68, + 0xec, 0xd6, 0x58, 0x7f, 0xcc, 0xfd, 0x01, 0x2c, 0x76, 0x7a, 0x0c, 0x18, 0xe3, 0xf4, 0xe9, 0xbe, + 0x77, 0x40, 0x1d, 0x12, 0x41, 0x2d, 0x1e, 0xe3, 0x33, 0x5f, 0x10, 0x04, 0xc6, 0x2e, 0x16, 0xdd, + 0xc2, 0xc4, 0x82, 0xd2, 0xef, 0x49, 0xe3, 0x0b, 0xf3, 0x92, 0x0d, 0x0f, 0x3d, 0x84, 0x0b, 0x36, + 0xef, 0x27, 0x6d, 0x37, 0x08, 0x49, 0x34, 0x51, 0xd7, 0x89, 0xd2, 0xf9, 0xc8, 0x1e, 0x91, 0xaf, + 0x3b, 0xa5, 0x1f, 0x4b, 0xb0, 0x98, 0x48, 0x15, 0x8b, 0x64, 0xdf, 0x24, 0xcf, 0x88, 0xd6, 0xe1, + 0xc8, 0x73, 0xb7, 0x23, 0xc6, 0x9b, 0x5f, 0x5b, 0x99, 0x88, 0x72, 0x6c, 0xc4, 0x2d, 0xb7, 0xe3, + 0x60, 0xce, 0x8b, 0x2e, 0xc3, 0xc9, 0x5e, 0x40, 0x7d, 0xc2, 0xcb, 0x2b, 0x66, 0x07, 0xe5, 0x15, + 0x75, 0x7b, 0x9f, 0x96, 0x3c, 0x16, 0x2a, 0x8d, 0x71, 0xf3, 0x92, 0x03, 0x71, 0x5a, 0xd6, 0xc7, + 0x74, 0xb5, 0x96, 0x1f, 0x45, 0xca, 0x5e, 0xf5, 0xe1, 0x7a, 0x8a, 0xc0, 0x38, 0x70, 0xfd, 0x76, + 0x64, 0xfe, 0xa3, 0x04, 0xe7, 0xfa, 0x35, 0x44, 0x7c, 0x6f, 0x0a, 0x39, 0xb9, 0x4e, 0xf5, 0xc4, + 0x2b, 0x14, 0xf1, 0x7c, 0x77, 0xcf, 0xed, 0x44, 0xab, 0xdb, 0x7f, 0x85, 0x32, 0x78, 0x2b, 0xba, + 0x0d, 0xf3, 0xad, 0xb6, 0xd7, 0x73, 0x48, 0xd7, 0xf7, 0x0e, 0x5c, 0x87, 0xfa, 0x91, 0xb2, 0x4f, + 0xf3, 0xd6, 0x46, 0xd4, 0x88, 0x0c, 0x38, 0xe1, 0x44, 0xd7, 0x55, 0xbe, 0x75, 0x4e, 0xad, 0xbd, + 0x9d, 0x19, 0x00, 0x53, 0x27, 0xbe, 0xe1, 0x0e, 0x66, 0x17, 0x0f, 0x52, 0x7a, 0x02, 0x97, 0x26, + 0xd3, 0xa1, 0x8b, 0x70, 0xdc, 0xd9, 0x49, 0xce, 0xee, 0x98, 0xb3, 0xc3, 0xe7, 0x75, 0x0d, 0x4e, + 0x39, 0x3b, 0x84, 0x57, 0x80, 0xb5, 0xbc, 0x76, 0x34, 0x27, 0x70, 0x76, 0x1a, 0x51, 0x4b, 0xe9, + 0x5f, 0x24, 0xb8, 0xb4, 0x41, 0xed, 0xb0, 0xe7, 0x53, 0x4c, 0x5b, 0xde, 0xfe, 0x3e, 0xed, 0x38, + 0x89, 0x30, 0x6a, 0xc8, 0xac, 0xa4, 0x61, 0xb3, 0x42, 0xdf, 0x81, 0xe3, 0xbb, 0x82, 0x35, 0x32, + 0xdd, 0xeb, 0x13, 0xe7, 0x18, 0x8b, 0x88, 0x19, 0xd0, 0xe7, 0xb0, 0x14, 0x7d, 0x24, 0xfe, 0x90, + 0x5c, 0x92, 0xb8, 0x36, 0xcc, 0xaf, 0xbd, 0x93, 0x39, 0xe2, 0x10, 0x73, 0x74, 0x7f, 0xb8, 0xbc, + 0x3b, 0xb9, 0xb3, 0xf4, 0x02, 0xce, 0x5b, 0xca, 0xa6, 0x88, 0x84, 0xe9, 0x27, 0x3d, 0xea, 0x47, + 0xcf, 0x07, 0xd7, 0x40, 0x84, 0x49, 0x84, 0xc5, 0xb5, 0xa2, 0xd6, 0x67, 0x16, 0x03, 0x6f, 0xaa, + 0xb3, 0x96, 0x01, 0x01, 0x75, 0xf6, 0x68, 0x1c, 0x5a, 0x09, 0x02, 0x8d, 0xb5, 0xb0, 0x28, 0xd9, + 0x0d, 0x48, 0xd0, 0xe3, 0xfe, 0x20, 0x72, 0xb9, 0x27, 0xdd, 0xc0, 0x14, 0x0d, 0xa5, 0x0d, 0xb8, + 0x62, 0xd2, 0x56, 0xcf, 0x77, 0xc3, 0x43, 0xcc, 0xa7, 0xb4, 0x49, 0x43, 0x4c, 0x83, 0x5e, 0x3b, + 0xda, 0x84, 0x08, 0x8e, 0x24, 0xd4, 0xcc, 0x3f, 0xb3, 0x36, 0xe6, 0xf3, 0x23, 0xff, 0xcf, 0x3f, + 0x97, 0x6c, 0x38, 0xd7, 0xcf, 0x9a, 0x6d, 0xd0, 0xb0, 0xf5, 0x4c, 0xb0, 0x8f, 0x5b, 0xa6, 0x94, + 0x66, 0x99, 0x63, 0xdb, 0x61, 0x66, 0x7c, 0x3b, 0x94, 0xfe, 0xe9, 0x7d, 0x38, 0xd3, 0x64, 0xfa, + 0xe6, 0x43, 0x1b, 0x1d, 0x6a, 0xec, 0xa2, 0x26, 0x9c, 0xe9, 0xb9, 0x64, 0x87, 0x17, 0x0a, 0x92, + 0x16, 0xbb, 0x15, 0x65, 0xba, 0xd5, 0xf1, 0xba, 0xc2, 0x4a, 0x01, 0x9f, 0xee, 0xb9, 0x89, 0x56, + 0xf4, 0xa5, 0x04, 0xf7, 0x7b, 0x2e, 0xf1, 0x44, 0xdd, 0x1c, 0x89, 0x82, 0x4b, 0x4a, 0xf6, 0x3c, + 0x12, 0x7a, 0xc4, 0x89, 0x0b, 0x0b, 0x23, 0x89, 0xe2, 0x32, 0xa9, 0x4c, 0x91, 0x98, 0xaf, 0x3a, + 0xb1, 0x52, 0xc0, 0x37, 0x7b, 0x6e, 0x26, 0x2d, 0xfa, 0x42, 0x82, 0x9b, 0x09, 0x74, 0xb6, 0xe3, + 0x90, 0x5d, 0xd7, 0xe7, 0xa7, 0x40, 0xa4, 0x43, 0x81, 0x4b, 0xec, 0xf1, 0x8f, 0xb2, 0x71, 0x4d, + 0xae, 0x76, 0xac, 0x14, 0xf0, 0xd5, 0x3e, 0xa4, 0x54, 0xb2, 0x51, 0x5d, 0xa5, 0xa0, 0x69, 0xdb, + 0x61, 0x7f, 0x75, 0x8e, 0xe6, 0xd5, 0x55, 0x46, 0x69, 0xe5, 0x90, 0xae, 0x26, 0xd3, 0xa2, 0x5f, + 0x97, 0xe0, 0x7a, 0x02, 0x5d, 0x40, 0x43, 0xd2, 0xea, 0x57, 0x61, 0x92, 0x80, 0x17, 0x40, 0xf2, + 0xe3, 0xfc, 0xd4, 0xda, 0x77, 0xb2, 0x41, 0x4d, 0xaa, 0xe1, 0xac, 0x14, 0xf0, 0x95, 0x3e, 0x9a, + 0x14, 0x22, 0xf4, 0x3b, 0x12, 0xdc, 0x4a, 0xc0, 0xf0, 0xa3, 0x8c, 0x2b, 0x0b, 0x46, 0x44, 0x29, + 0x66, 0x0c, 0xe5, 0x38, 0x87, 0xf2, 0xff, 0xb3, 0xa1, 0x4c, 0x2b, 0xe6, 0xac, 0x14, 0xf0, 0xf5, + 0x3e, 0x9c, 0x09, 0x84, 0xb1, 0x66, 0xfc, 0xa8, 0x3c, 0x92, 0xb4, 0x98, 0x3f, 0x21, 0xad, 0xa8, + 0x3c, 0x33, 0x5a, 0xae, 0x13, 0x99, 0x9a, 0xc9, 0x28, 0xee, 0x14, 0x9a, 0x99, 0x4c, 0x84, 0x3e, + 0x87, 0x2b, 0x69, 0x28, 0xba, 0x87, 0x11, 0x82, 0x93, 0x1c, 0xc1, 0x7b, 0xf9, 0x11, 0x24, 0xab, + 0x43, 0x2b, 0x05, 0x5c, 0x1c, 0x93, 0x1e, 0x11, 0xa0, 0x5f, 0x82, 0xa5, 0x71, 0xc9, 0x5d, 0xdf, + 0xed, 0x84, 0x91, 0x68, 0xe0, 0xa2, 0xdf, 0xcf, 0x2b, 0x7a, 0xa4, 0xb6, 0xb4, 0x52, 0xc0, 0x8b, + 0x23, 0xb2, 0x07, 0x14, 0xa8, 0x0d, 0x8b, 0x3d, 0x97, 0x38, 0x91, 0xcb, 0x64, 0xe7, 0x8b, 0x1f, + 0x52, 0x87, 0xf0, 0xc1, 0x8b, 0xa7, 0xb8, 0xe0, 0xd5, 0x1c, 0xf5, 0x0a, 0xc9, 0x0a, 0xcd, 0x4a, + 0x01, 0x2f, 0xf4, 0xdc, 0xd4, 0xda, 0xcd, 0x2f, 0x84, 0xf9, 0xf5, 0xc5, 0xf5, 0xb7, 0x66, 0x10, + 0xa7, 0xa9, 0x22, 0xc9, 0x73, 0x5c, 0xf2, 0x07, 0x39, 0x24, 0xa7, 0x17, 0x5d, 0x0a, 0xcb, 0xcb, + 0x28, 0xcc, 0xfc, 0x01, 0x37, 0xbc, 0x3e, 0x98, 0xa8, 0xb4, 0x27, 0x10, 0x55, 0x3a, 0x11, 0x90, + 0xd3, 0x1c, 0xc8, 0xbb, 0xdf, 0xa8, 0xc6, 0x47, 0xd8, 0xdc, 0x94, 0x9a, 0xac, 0xdf, 0x14, 0x0e, + 0x74, 0x80, 0x20, 0x0a, 0x5d, 0x06, 0xfb, 0x52, 0x80, 0x98, 0xe7, 0x20, 0x1e, 0xe5, 0x01, 0x91, + 0x56, 0x4a, 0x51, 0x29, 0xe0, 0x6b, 0x09, 0x1c, 0xa9, 0xd5, 0x16, 0x7f, 0x20, 0xbc, 0xe7, 0x38, + 0x94, 0x56, 0xfc, 0x8a, 0x4e, 0xf6, 0xc3, 0x76, 0x10, 0x01, 0x3a, 0xc3, 0x01, 0xfd, 0xbf, 0xaf, + 0x01, 0x68, 0xbc, 0xb8, 0xa1, 0x52, 0xc0, 0xb7, 0xc6, 0x51, 0x0d, 0xe8, 0xc2, 0x76, 0x94, 0xdf, + 0xfd, 0x99, 0x04, 0x8f, 0x86, 0xd7, 0x89, 0xa7, 0xc6, 0x89, 0xcd, 0x73, 0xe3, 0xc4, 0x89, 0x93, + 0xe3, 0x24, 0xf4, 0xbc, 0x76, 0x40, 0x5c, 0x51, 0x2f, 0x10, 0x21, 0x95, 0x39, 0xd2, 0xc7, 0xb9, + 0xd6, 0x2f, 0x57, 0x09, 0x42, 0xa5, 0x80, 0x1f, 0x26, 0x17, 0x35, 0x5f, 0xdd, 0xc2, 0x4f, 0x25, + 0x78, 0x27, 0xd7, 0x1c, 0x06, 0xea, 0x16, 0xf8, 0xcf, 0x72, 0xfc, 0x9b, 0xdf, 0x18, 0xff, 0x70, + 0x12, 0xa4, 0x52, 0xc0, 0x2b, 0x59, 0xe0, 0x47, 0xd2, 0x26, 0x7f, 0x28, 0xc1, 0x83, 0x24, 0x72, + 0xbb, 0xc7, 0x22, 0x8f, 0x7e, 0xb4, 0x9d, 0x28, 0xf7, 0x14, 0x80, 0x11, 0x07, 0xfc, 0x71, 0x0e, + 0xc0, 0xd3, 0x92, 0xfa, 0x95, 0x02, 0xbe, 0x33, 0x00, 0x3a, 0x35, 0xfd, 0xff, 0x17, 0x12, 0xac, + 0x66, 0x58, 0xae, 0x6b, 0xef, 0x93, 0x2e, 0x4f, 0x86, 0x45, 0x20, 0xcf, 0x71, 0x90, 0xeb, 0xdf, + 0xc4, 0x7e, 0x87, 0xf3, 0x6a, 0x95, 0x02, 0xbe, 0x3f, 0xc5, 0x88, 0x75, 0x7b, 0x3f, 0x99, 0x84, + 0xfb, 0x5d, 0x09, 0xee, 0x24, 0xa1, 0x76, 0xfb, 0xb9, 0xaa, 0xb1, 0x75, 0x3f, 0xcf, 0x11, 0x7e, + 0x98, 0x03, 0xe1, 0xa4, 0x84, 0x57, 0xa5, 0x80, 0x4b, 0x03, 0x68, 0x13, 0xd3, 0x62, 0xbf, 0x2a, + 0xc1, 0x8d, 0x24, 0xa6, 0x90, 0x06, 0x21, 0x43, 0xd3, 0x19, 0xf2, 0xc7, 0x17, 0x32, 0x4f, 0xbf, + 0x29, 0xd9, 0xa7, 0x4a, 0x01, 0x2f, 0x0d, 0x90, 0xa4, 0xa5, 0xa7, 0x7c, 0xb8, 0x9c, 0xc4, 0x10, + 0xc7, 0xb9, 0xf1, 0x39, 0xb4, 0x90, 0x91, 0x72, 0x99, 0x94, 0xfe, 0x11, 0xc7, 0xee, 0x84, 0xd4, + 0x50, 0x1b, 0x8a, 0x3d, 0x97, 0x05, 0x61, 0x76, 0x48, 0x49, 0x87, 0xbe, 0xe0, 0x0f, 0x64, 0xd1, + 0x89, 0x7b, 0x31, 0xe3, 0xca, 0x3d, 0x31, 0xf1, 0x52, 0x29, 0xe0, 0xf3, 0x3d, 0x77, 0xbc, 0x13, + 0x1d, 0xf2, 0x43, 0x7e, 0x54, 0x5a, 0x60, 0x1f, 0xc4, 0x22, 0x8b, 0x99, 0x1a, 0x9e, 0x92, 0xce, + 0x11, 0x13, 0x4d, 0x27, 0x40, 0x3f, 0x80, 0x6b, 0x69, 0x13, 0xe5, 0xe9, 0x9e, 0x48, 0xf8, 0x62, + 0xe6, 0x01, 0x33, 0x35, 0x55, 0x54, 0x29, 0xe0, 0x4b, 0xa3, 0xb3, 0x1e, 0x90, 0xa0, 0x3f, 0x16, + 0x2e, 0x64, 0x14, 0x81, 0x78, 0x12, 0x4b, 0xa6, 0x93, 0x22, 0x34, 0x97, 0x38, 0x1a, 0x35, 0x2f, + 0x9a, 0x29, 0x59, 0xa9, 0x4a, 0x01, 0xdf, 0x1e, 0x01, 0x96, 0x4e, 0x8d, 0xfe, 0x4c, 0x82, 0x95, + 0xa4, 0x09, 0xba, 0x83, 0x47, 0x15, 0x62, 0xbf, 0x08, 0x88, 0xe7, 0x3a, 0xad, 0x78, 0x5b, 0x44, + 0x56, 0x79, 0x39, 0xf3, 0x0a, 0x91, 0xef, 0x87, 0x11, 0x95, 0x02, 0xbe, 0x37, 0xb0, 0xd2, 0x24, + 0xed, 0x8b, 0xc0, 0x70, 0x9d, 0xd6, 0xd0, 0x8f, 0x28, 0x7e, 0x2c, 0xc1, 0xed, 0xf4, 0x90, 0xc1, + 0x09, 0x08, 0xe5, 0xcf, 0x3f, 0x11, 0xbc, 0x2b, 0xb9, 0x43, 0xa8, 0xf4, 0xdf, 0x2b, 0x0c, 0x87, + 0x50, 0x7d, 0x1a, 0x27, 0x48, 0x56, 0xe7, 0x87, 0xc2, 0xac, 0xd9, 0x79, 0x1b, 0x7a, 0x44, 0xe4, + 0x59, 0xc4, 0x2a, 0x46, 0x28, 0x96, 0x32, 0xb7, 0x6e, 0x7a, 0x01, 0x7c, 0x64, 0xd1, 0xe9, 0xc5, + 0xf1, 0xdf, 0x87, 0xb3, 0x36, 0x4f, 0xf8, 0x90, 0x41, 0xba, 0xa5, 0x78, 0x95, 0x4b, 0x9a, 0xfc, + 0x40, 0x98, 0x9a, 0x9c, 0xac, 0x14, 0xb0, 0x6c, 0x8f, 0x74, 0xc4, 0x2e, 0x31, 0x69, 0x02, 0x91, + 0x66, 0x79, 0x78, 0x1c, 0xcd, 0xec, 0x5a, 0xe6, 0x86, 0x9d, 0xf2, 0xa8, 0x28, 0x5c, 0xe2, 0xb4, + 0x57, 0xc7, 0x28, 0x54, 0x4e, 0x01, 0xd1, 0x7f, 0x05, 0x10, 0x38, 0xae, 0x67, 0xae, 0xf3, 0xf4, + 0xb7, 0x46, 0xb1, 0xce, 0x19, 0xef, 0x91, 0xbf, 0x26, 0x71, 0x27, 0x12, 0xdf, 0x1b, 0x3f, 0x4b, + 0xfe, 0x04, 0x30, 0xbe, 0x32, 0xde, 0xc8, 0x7b, 0x7b, 0x9d, 0xf4, 0x03, 0xc2, 0xa1, 0xdb, 0x6b, + 0x0a, 0x11, 0xfa, 0x14, 0xa2, 0xc5, 0x22, 0x34, 0xce, 0xd5, 0x16, 0x4b, 0x5c, 0xea, 0x9b, 0x19, + 0xcb, 0x3e, 0x9c, 0xdb, 0xad, 0x14, 0xf0, 0x19, 0x7b, 0xb8, 0x1d, 0xed, 0xc3, 0xc5, 0x68, 0x6c, + 0xe6, 0xa0, 0x92, 0x29, 0xde, 0xe2, 0xcd, 0x8c, 0x37, 0xca, 0xc9, 0x99, 0xd6, 0x4a, 0x01, 0x5f, + 0xb0, 0xd3, 0x7a, 0xd1, 0x0e, 0x5c, 0x18, 0xbc, 0x92, 0x08, 0xc7, 0x28, 0x96, 0xf3, 0x16, 0x17, + 0xf6, 0xc6, 0x44, 0x61, 0x29, 0xaf, 0xb8, 0x95, 0x02, 0x3e, 0xe7, 0xa7, 0x3c, 0xee, 0xbe, 0x80, + 0x2b, 0x13, 0x9e, 0x11, 0x85, 0xa8, 0xdb, 0x19, 0xf3, 0x9a, 0xfc, 0xf4, 0xc9, 0x1c, 0xfe, 0xee, + 0xe4, 0x87, 0xd1, 0x1d, 0x88, 0x66, 0x4d, 0xa2, 0xdc, 0x80, 0x2f, 0x92, 0xc8, 0xc5, 0x3b, 0x19, + 0x93, 0x4b, 0x49, 0x3c, 0xb3, 0xc9, 0xd9, 0x29, 0xf9, 0xe8, 0x2a, 0x9c, 0xee, 0xcb, 0xe0, 0xab, + 0x74, 0x97, 0x8f, 0x7d, 0x3b, 0x73, 0x6c, 0x46, 0x5c, 0x29, 0xe0, 0x39, 0x3b, 0x99, 0x32, 0xde, + 0x06, 0x94, 0x4c, 0x63, 0x88, 0x15, 0x29, 0xde, 0xcb, 0xa8, 0x18, 0x19, 0x4d, 0xd9, 0x72, 0x6f, + 0x32, 0x9a, 0xc6, 0x1d, 0x19, 0xba, 0xc7, 0x93, 0x8b, 0xc5, 0xfb, 0xb9, 0x87, 0x16, 0xd9, 0xc8, + 0xe1, 0xa1, 0xa3, 0x0c, 0xe5, 0xc8, 0xd0, 0x0e, 0xcf, 0xed, 0x14, 0x97, 0x73, 0x0f, 0x2d, 0x92, + 0x41, 0xc3, 0x43, 0x47, 0x09, 0xa2, 0x36, 0x2c, 0x26, 0x87, 0x16, 0x09, 0xa7, 0x58, 0x2f, 0x0f, + 0x32, 0xde, 0x05, 0xd2, 0x73, 0xb6, 0x95, 0x02, 0x5e, 0xb0, 0xd3, 0xb3, 0xb9, 0xe9, 0xd2, 0x22, + 0x55, 0xbd, 0xf1, 0x35, 0xa5, 0xf5, 0x15, 0x36, 0x26, 0x2d, 0x52, 0x5b, 0xba, 0xb4, 0x48, 0x7b, + 0x6f, 0x7e, 0x4d, 0x69, 0x7d, 0x1d, 0x8e, 0x49, 0x8b, 0x34, 0xb9, 0x0f, 0x97, 0x92, 0xd2, 0x78, + 0x3e, 0x35, 0x60, 0xa7, 0x65, 0x2f, 0xa0, 0x7e, 0x71, 0x25, 0xb7, 0xb8, 0x64, 0x56, 0x77, 0x58, + 0xdc, 0x50, 0xbe, 0xf7, 0xb7, 0x24, 0x28, 0x25, 0x03, 0x04, 0xda, 0x5a, 0x13, 0x57, 0xe2, 0x4e, + 0xf2, 0x99, 0xa5, 0xb8, 0x9a, 0xf9, 0x26, 0x9b, 0x59, 0x4c, 0x2c, 0xde, 0x64, 0xfb, 0x64, 0xad, + 0x71, 0x32, 0xf4, 0x1c, 0x2e, 0xa6, 0xbc, 0xb0, 0x50, 0xb7, 0x45, 0x8b, 0x6f, 0x65, 0x86, 0xd8, + 0x13, 0x4a, 0x79, 0x45, 0x88, 0x3d, 0xd2, 0xe9, 0xb6, 0xe8, 0xa8, 0xb0, 0x38, 0xdc, 0xf4, 0x1c, + 0x5a, 0x7c, 0x98, 0x5b, 0xd8, 0x48, 0xf9, 0xec, 0xb0, 0xb0, 0x41, 0x27, 0xfa, 0x1e, 0x9c, 0x0d, + 0xed, 0xbd, 0xe8, 0x1c, 0xa2, 0xec, 0x40, 0xf4, 0x0f, 0x8b, 0x6b, 0x19, 0x67, 0x51, 0x5a, 0x6a, + 0x85, 0x9d, 0x45, 0xa1, 0xbd, 0x97, 0x6c, 0x47, 0x21, 0x5c, 0x0a, 0xa2, 0x64, 0x08, 0xf1, 0xf9, + 0x48, 0x64, 0x8f, 0xf2, 0x87, 0xec, 0x5e, 0x3b, 0x2c, 0xbe, 0x9d, 0xf1, 0x24, 0x35, 0x2d, 0x8f, + 0x52, 0x29, 0xe0, 0x8b, 0x41, 0x7a, 0xff, 0xe8, 0xb6, 0x88, 0x52, 0xb9, 0xd1, 0x96, 0x7f, 0x27, + 0xb7, 0x9d, 0x26, 0x0b, 0x00, 0x86, 0xed, 0x74, 0xa8, 0x34, 0x20, 0x5d, 0x5a, 0xb4, 0x09, 0xdf, + 0xfd, 0x9a, 0xd2, 0xd2, 0x36, 0xe1, 0x50, 0xbe, 0x7b, 0x07, 0x2e, 0xc4, 0x86, 0x71, 0x48, 0x76, + 0x69, 0xd8, 0x7a, 0x16, 0x9d, 0x81, 0xef, 0x65, 0x9c, 0x48, 0x29, 0xc9, 0x24, 0x76, 0x22, 0x39, + 0x29, 0x39, 0xa6, 0x9f, 0x8c, 0xbc, 0xe6, 0x45, 0x06, 0x38, 0x90, 0x2b, 0xee, 0xf8, 0xc5, 0xf7, + 0x73, 0x3f, 0x9e, 0x4d, 0xfe, 0x15, 0xd8, 0xf0, 0x93, 0x5e, 0x2a, 0x1d, 0xfa, 0xe1, 0xc8, 0xcd, + 0xfe, 0x79, 0x6f, 0x87, 0x12, 0xfa, 0x7c, 0xe4, 0x9a, 0xf0, 0x28, 0xf7, 0x03, 0xe7, 0xf8, 0x8f, + 0x73, 0x87, 0x1f, 0x38, 0x79, 0xff, 0xf3, 0xa1, 0xeb, 0xc1, 0x8f, 0xd2, 0x55, 0x62, 0x77, 0xbb, + 0xfc, 0x99, 0xb5, 0xff, 0xc0, 0xf9, 0x41, 0xe6, 0x0b, 0xf7, 0xb4, 0x2a, 0xef, 0x61, 0x47, 0x94, + 0x46, 0xb1, 0x7e, 0x1c, 0x8e, 0xf2, 0xd1, 0x1e, 0x1f, 0x39, 0x31, 0x23, 0xcf, 0x32, 0xd4, 0xfd, + 0x58, 0x96, 0xed, 0xac, 0xf8, 0xd9, 0x9b, 0xdf, 0x5c, 0x96, 0xff, 0xf6, 0xcc, 0xe0, 0x1f, 0x17, + 0xe2, 0x70, 0x0b, 0xdd, 0x80, 0xa5, 0xb2, 0x6e, 0xaa, 0xc6, 0x13, 0x0d, 0x13, 0xac, 0x99, 0x46, + 0x13, 0xab, 0xa3, 0xbf, 0x97, 0xbc, 0x02, 0xc5, 0x71, 0x12, 0x53, 0xc3, 0x4f, 0x34, 0x2c, 0x4b, + 0xe8, 0x3a, 0x5c, 0x19, 0xef, 0xdd, 0x6a, 0xae, 0x6b, 0xb8, 0xae, 0x59, 0x9a, 0x29, 0xcf, 0xa0, + 0xb7, 0x61, 0x75, 0x9c, 0xa2, 0xac, 0x58, 0xca, 0xba, 0x62, 0x6a, 0xa4, 0x61, 0x98, 0xd6, 0x26, + 0xd6, 0x4c, 0x62, 0x6a, 0xd5, 0x0d, 0x52, 0x31, 0x4c, 0x4b, 0x2b, 0xcb, 0xb3, 0xe8, 0x2d, 0x78, + 0x63, 0x0a, 0x53, 0x6d, 0xdb, 0xfc, 0xa4, 0x3a, 0xc4, 0x71, 0x04, 0xad, 0xc1, 0xca, 0x34, 0x0e, + 0xa3, 0xbe, 0x69, 0x94, 0xd7, 0x87, 0x78, 0x8e, 0xa2, 0x07, 0x70, 0x37, 0x0f, 0x34, 0x5c, 0x36, + 0xe5, 0x63, 0xe8, 0x1e, 0xdc, 0xca, 0x84, 0xc4, 0x28, 0x8f, 0xa3, 0x3b, 0x50, 0x1a, 0xa7, 0x54, + 0x1a, 0x8d, 0xaa, 0xae, 0x2a, 0x96, 0x6e, 0xd4, 0x49, 0xc5, 0xb2, 0x1a, 0xf2, 0x09, 0x74, 0x1b, + 0x6e, 0x4c, 0xa7, 0xb3, 0xd4, 0x86, 0x7c, 0x32, 0x9d, 0xec, 0xa9, 0x5e, 0x2f, 0x1b, 0x4f, 0x4d, + 0x52, 0xd6, 0xcc, 0x2d, 0xcb, 0x68, 0xc8, 0x80, 0xde, 0x80, 0x7b, 0x53, 0xf0, 0x99, 0x9f, 0x54, + 0xc5, 0x9a, 0x71, 0x8c, 0xa7, 0x32, 0x14, 0x3c, 0x98, 0xba, 0x56, 0x36, 0x2b, 0xfa, 0x86, 0x25, + 0xcf, 0xa1, 0x77, 0xe0, 0xad, 0x5c, 0xe3, 0x27, 0x55, 0x7c, 0x3a, 0x43, 0x0e, 0xd6, 0xca, 0xfa, + 0xf0, 0xd2, 0xcf, 0xe7, 0x5d, 0x94, 0x4d, 0xb5, 0x21, 0x9f, 0xc9, 0xb5, 0x28, 0x8c, 0x52, 0xce, + 0xad, 0x1e, 0x46, 0x7d, 0x16, 0x7d, 0x08, 0xef, 0x7f, 0x1d, 0xf5, 0x44, 0xfb, 0xa1, 0xaa, 0x99, + 0xa6, 0x8c, 0xd0, 0x9b, 0x70, 0x3f, 0x0f, 0xb3, 0xf2, 0x69, 0x13, 0x6b, 0xf2, 0x39, 0x74, 0x17, + 0x6e, 0x4e, 0x21, 0x2f, 0x6f, 0xd7, 0x95, 0x9a, 0x51, 0x5e, 0x97, 0xcf, 0x67, 0x98, 0xb8, 0xaa, + 0x98, 0xa6, 0x52, 0x2f, 0x63, 0x85, 0x6c, 0x69, 0xdb, 0x66, 0x43, 0x51, 0x35, 0x53, 0xbe, 0x90, + 0xb1, 0x6a, 0x03, 0x9e, 0xe4, 0x1a, 0x2c, 0xa0, 0x47, 0xf0, 0xce, 0x14, 0x2e, 0xad, 0xaa, 0x98, + 0x96, 0xae, 0x9a, 0x9a, 0x82, 0xd5, 0xca, 0x10, 0xe7, 0xc5, 0x5c, 0xeb, 0x1d, 0xf1, 0x2b, 0x6a, + 0x45, 0x93, 0x8b, 0x19, 0xda, 0x12, 0x1c, 0x35, 0xad, 0x66, 0xe0, 0xed, 0xf2, 0xba, 0xbc, 0x98, + 0x4b, 0x00, 0xd7, 0x2c, 0x11, 0x02, 0x2e, 0x65, 0x4c, 0x46, 0x70, 0xa8, 0xd5, 0xa6, 0x69, 0x8d, + 0x18, 0xef, 0x65, 0xb4, 0x0c, 0x77, 0x32, 0xad, 0x4b, 0xac, 0xe2, 0x15, 0xb4, 0x02, 0xcb, 0xb9, + 0xec, 0x4b, 0xd0, 0x2f, 0x65, 0x2c, 0xe6, 0x80, 0xbe, 0xa6, 0xab, 0xd8, 0x30, 0x8d, 0x0d, 0x4b, + 0xbe, 0x8a, 0xde, 0x83, 0xb5, 0x69, 0x8b, 0x69, 0xa8, 0x5b, 0xd8, 0x50, 0xd4, 0xca, 0x88, 0x9f, + 0xbb, 0x96, 0x61, 0xfb, 0xb1, 0x6f, 0x54, 0xac, 0xaa, 0x62, 0xca, 0xd7, 0x33, 0xf6, 0x94, 0x59, + 0x37, 0x9e, 0x6e, 0x54, 0x95, 0x2d, 0x4d, 0xbe, 0x31, 0x61, 0x5c, 0x43, 0x4d, 0x68, 0xb7, 0x6c, + 0x92, 0x06, 0x36, 0xbe, 0xbb, 0x2d, 0x97, 0x26, 0x98, 0x62, 0x92, 0xba, 0xa2, 0x6f, 0x56, 0x88, + 0xf2, 0x44, 0xd1, 0xab, 0xca, 0xba, 0x5e, 0xd5, 0xad, 0x6d, 0xf9, 0x26, 0x7a, 0x1f, 0xde, 0xce, + 0xe0, 0xe2, 0x3b, 0x44, 0x57, 0x09, 0xd6, 0x36, 0x75, 0xd3, 0xc2, 0xdc, 0x75, 0xca, 0xb7, 0xd2, + 0xbd, 0xb0, 0xa9, 0xd4, 0xaa, 0x49, 0x17, 0x2b, 0xdf, 0x46, 0x25, 0xb8, 0x3a, 0x4e, 0xa7, 0xa9, + 0x6b, 0xe2, 0x9f, 0x01, 0xea, 0xaa, 0x26, 0xdf, 0x99, 0x60, 0x74, 0x86, 0x3a, 0xea, 0x86, 0x49, + 0xdd, 0xa8, 0x13, 0xa5, 0x2c, 0xdf, 0x45, 0xb7, 0xe0, 0xfa, 0xb4, 0x73, 0x91, 0xff, 0x62, 0xfc, + 0x5e, 0xba, 0xed, 0x27, 0x4f, 0x00, 0xe5, 0xa9, 0x49, 0x54, 0xa3, 0x6e, 0x1a, 0x55, 0x4d, 0xbe, + 0xbf, 0xfc, 0x27, 0x12, 0xcc, 0x0f, 0xff, 0xe1, 0x10, 0xba, 0x06, 0x97, 0xfb, 0x23, 0x98, 0x96, + 0x62, 0x35, 0xcd, 0x91, 0xe3, 0xfb, 0x32, 0x5c, 0x1c, 0x25, 0x30, 0x9b, 0xaa, 0xca, 0x3c, 0x95, + 0x94, 0xda, 0xb9, 0xa5, 0x37, 0x1a, 0x5a, 0x59, 0x9e, 0x41, 0x8b, 0x70, 0x61, 0xb4, 0x53, 0xc3, + 0xd8, 0xc0, 0xf2, 0x6c, 0x1a, 0x9f, 0xb2, 0x6e, 0x60, 0x7e, 0x12, 0x2f, 0xff, 0x6c, 0x06, 0x66, + 0x55, 0x4b, 0x41, 0xe7, 0xe0, 0x8c, 0x6a, 0x29, 0xe3, 0x7f, 0xed, 0xc0, 0x1a, 0x95, 0xa6, 0x55, + 0x61, 0x13, 0xab, 0x6b, 0xaa, 0x65, 0xb0, 0x38, 0xe2, 0x22, 0x9c, 0xe3, 0xed, 0xaa, 0xa5, 0x3f, + 0x61, 0xe1, 0x85, 0x69, 0xea, 0x46, 0x9d, 0x85, 0x0f, 0xfd, 0x0e, 0x06, 0x99, 0x60, 0xed, 0x93, + 0xa6, 0x66, 0x5a, 0xa6, 0x3c, 0x1b, 0x77, 0x34, 0xb0, 0x56, 0xd3, 0x9b, 0x35, 0x62, 0x36, 0x1b, + 0x0d, 0x03, 0x5b, 0xf2, 0x91, 0xb8, 0xc3, 0xc2, 0x6c, 0x4b, 0x97, 0x49, 0x59, 0x7b, 0xa2, 0x33, + 0x5f, 0x78, 0x34, 0x96, 0xdd, 0x6c, 0x6c, 0x62, 0xa5, 0xac, 0x91, 0x75, 0xa5, 0x5e, 0xd7, 0xb0, + 0x7c, 0x2c, 0x66, 0x58, 0xd7, 0xab, 0x55, 0xbd, 0xbe, 0x49, 0xcc, 0x66, 0xad, 0xa6, 0xe0, 0x6d, + 0xf9, 0x78, 0x3c, 0x83, 0x48, 0x76, 0x55, 0x37, 0x2d, 0xf9, 0x04, 0xff, 0x03, 0x80, 0x41, 0x63, + 0xcd, 0xa8, 0xeb, 0x96, 0x81, 0xf5, 0xfa, 0xa6, 0x7c, 0x92, 0xff, 0xb5, 0x80, 0xa5, 0x10, 0xed, + 0xbb, 0x96, 0x86, 0xeb, 0x4a, 0x95, 0x28, 0xcd, 0xb2, 0x6e, 0x11, 0xd3, 0x32, 0xb0, 0xb2, 0xa9, + 0xc9, 0x10, 0x03, 0x30, 0xb6, 0x18, 0x0a, 0x93, 0xe9, 0x6e, 0xbb, 0xae, 0xca, 0xa7, 0x90, 0x0c, + 0x73, 0x9c, 0xaf, 0x6e, 0x61, 0x85, 0xe8, 0x65, 0x79, 0x6e, 0xf9, 0x6f, 0x8e, 0xc1, 0x85, 0xd4, + 0xda, 0x4f, 0x76, 0x5a, 0xe8, 0x75, 0x4b, 0xdb, 0x14, 0x76, 0x4e, 0xb4, 0x3a, 0x36, 0xaa, 0x55, + 0xb2, 0xa5, 0xd7, 0x47, 0xff, 0x06, 0xe1, 0x06, 0x2c, 0x4d, 0x22, 0x34, 0xab, 0x8a, 0xba, 0x25, + 0x4b, 0xcc, 0x48, 0x27, 0x91, 0x30, 0xc3, 0x33, 0xf4, 0xb2, 0x2a, 0xcf, 0xb0, 0xf8, 0x63, 0x12, + 0x55, 0x43, 0xd9, 0xd4, 0x70, 0xb9, 0x69, 0x6d, 0xcb, 0xb3, 0xd3, 0xe4, 0x69, 0x35, 0x45, 0xaf, + 0xca, 0x47, 0x58, 0xb0, 0x38, 0x89, 0xe4, 0xb1, 0x8e, 0x15, 0xf9, 0x28, 0xba, 0x09, 0xd7, 0x26, + 0x51, 0x70, 0x83, 0xc3, 0x65, 0xf9, 0x18, 0xdb, 0xd9, 0x93, 0x88, 0x6a, 0x8a, 0x65, 0x69, 0xb8, + 0x66, 0x98, 0x96, 0x7c, 0x7c, 0xda, 0xf4, 0x6a, 0x26, 0xb1, 0x34, 0xa5, 0x66, 0xca, 0x27, 0xa6, + 0x51, 0x19, 0x0d, 0x73, 0x53, 0xab, 0xeb, 0x9a, 0x7c, 0x72, 0x1a, 0x74, 0xb6, 0x9c, 0x32, 0x4c, + 0x9d, 0x9c, 0x52, 0xdb, 0x90, 0x4f, 0x4d, 0xc7, 0xad, 0x56, 0xf4, 0xba, 0xc6, 0x17, 0x1f, 0xbd, + 0x0b, 0x0f, 0xb3, 0xe9, 0xc8, 0xa6, 0x6e, 0x55, 0x9a, 0xeb, 0x7c, 0xc7, 0xb0, 0x9d, 0x72, 0x1a, + 0xad, 0xc2, 0x83, 0x1c, 0x6c, 0xaa, 0x8e, 0xd5, 0xaa, 0xa6, 0xea, 0xf2, 0x3c, 0xf3, 0x3e, 0xf9, + 0xe4, 0x54, 0x95, 0x75, 0xf9, 0x0c, 0x3b, 0xe1, 0x72, 0x90, 0x3f, 0xd6, 0xea, 0x5b, 0x7a, 0xdd, + 0x94, 0xe5, 0x9c, 0xf4, 0x4a, 0xdd, 0xd4, 0xd7, 0xab, 0x9a, 0x7c, 0x76, 0x9a, 0x7a, 0xd8, 0x59, + 0xa8, 0xab, 0x5a, 0xdd, 0x78, 0x2a, 0xa3, 0x69, 0x0b, 0xd6, 0xdf, 0x41, 0xe7, 0x96, 0x3f, 0x86, + 0xe3, 0xd1, 0x4b, 0x2f, 0xdb, 0xdf, 0x1b, 0x9a, 0x62, 0xb1, 0x98, 0x60, 0xcc, 0x37, 0xc6, 0x1d, + 0xa3, 0xde, 0x42, 0x5a, 0xfe, 0x23, 0x09, 0x2e, 0x4f, 0xa9, 0x38, 0x65, 0xda, 0x8b, 0x99, 0xb1, + 0xa6, 0x1a, 0xb5, 0x9a, 0x56, 0x2f, 0x0b, 0x44, 0xa9, 0x7e, 0x78, 0x19, 0xee, 0x4c, 0x27, 0xaf, + 0x1b, 0x96, 0xa0, 0x95, 0x98, 0x26, 0xa6, 0xd3, 0x96, 0x8d, 0xba, 0x26, 0xcf, 0xac, 0x7f, 0xff, + 0xef, 0xbe, 0xba, 0x2a, 0xfd, 0xfd, 0x57, 0x57, 0xa5, 0x7f, 0xfe, 0xea, 0xaa, 0xf4, 0xa9, 0xb1, + 0xe7, 0x86, 0xcf, 0x7a, 0x3b, 0x2b, 0x2d, 0x6f, 0x7f, 0x75, 0xcf, 0xb7, 0x0f, 0x5c, 0x91, 0x09, + 0xb4, 0xdb, 0xab, 0xfd, 0xbf, 0x8c, 0xb4, 0xbb, 0xee, 0xea, 0x1e, 0xed, 0xac, 0xf2, 0xea, 0xe0, + 0xd5, 0x3d, 0x6f, 0xe4, 0x3f, 0x24, 0x3f, 0x4c, 0x7c, 0x3d, 0x78, 0xb8, 0x73, 0x8c, 0x93, 0xbd, + 0xfd, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7e, 0x7b, 0xc8, 0xcc, 0x73, 0x52, 0x00, 0x00, } func (m *UIBannerClickEvent) Marshal() (dAtA []byte, err error) { @@ -6749,6 +6829,69 @@ func (m *UIDiscoverCreateNodeEvent) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *UIDiscoverCreateAppServerEvent) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UIDiscoverCreateAppServerEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UIDiscoverCreateAppServerEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Status != nil { + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintUsageevents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Resource != nil { + { + size, err := m.Resource.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintUsageevents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Metadata != nil { + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintUsageevents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *UIDiscoverDatabaseConfigureIAMPolicyEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9443,6 +9586,29 @@ func (m *UsageEventOneOf_UiDiscoverKubeEksEnrollEvent) MarshalToSizedBuffer(dAtA } return len(dAtA) - i, nil } +func (m *UsageEventOneOf_UiDiscoverCreateAppServerEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UsageEventOneOf_UiDiscoverCreateAppServerEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.UiDiscoverCreateAppServerEvent != nil { + { + size, err := m.UiDiscoverCreateAppServerEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintUsageevents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3 + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} func encodeVarintUsageevents(dAtA []byte, offset int, v uint64) int { offset -= sovUsageevents(v) base := offset @@ -10050,6 +10216,30 @@ func (m *UIDiscoverCreateNodeEvent) Size() (n int) { return n } +func (m *UIDiscoverCreateAppServerEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Metadata != nil { + l = m.Metadata.Size() + n += 1 + l + sovUsageevents(uint64(l)) + } + if m.Resource != nil { + l = m.Resource.Size() + n += 1 + l + sovUsageevents(uint64(l)) + } + if m.Status != nil { + l = m.Status.Size() + n += 1 + l + sovUsageevents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *UIDiscoverDatabaseConfigureIAMPolicyEvent) Size() (n int) { if m == nil { return 0 @@ -11354,6 +11544,18 @@ func (m *UsageEventOneOf_UiDiscoverKubeEksEnrollEvent) Size() (n int) { } return n } +func (m *UsageEventOneOf_UiDiscoverCreateAppServerEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.UiDiscoverCreateAppServerEvent != nil { + l = m.UiDiscoverCreateAppServerEvent.Size() + n += 2 + l + sovUsageevents(uint64(l)) + } + return n +} func sovUsageevents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 @@ -14960,6 +15162,165 @@ func (m *UIDiscoverCreateNodeEvent) Unmarshal(dAtA []byte) error { } return nil } +func (m *UIDiscoverCreateAppServerEvent) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowUsageevents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UIDiscoverCreateAppServerEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UIDiscoverCreateAppServerEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowUsageevents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthUsageevents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthUsageevents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = &DiscoverMetadata{} + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowUsageevents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthUsageevents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthUsageevents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resource == nil { + m.Resource = &DiscoverResourceMetadata{} + } + if err := m.Resource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowUsageevents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthUsageevents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthUsageevents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Status == nil { + m.Status = &DiscoverStepStatus{} + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipUsageevents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthUsageevents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *UIDiscoverDatabaseConfigureIAMPolicyEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -20467,6 +20828,41 @@ func (m *UsageEventOneOf) Unmarshal(dAtA []byte) error { } m.Event = &UsageEventOneOf_UiDiscoverKubeEksEnrollEvent{v} iNdEx = postIndex + case 57: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UiDiscoverCreateAppServerEvent", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowUsageevents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthUsageevents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthUsageevents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &UIDiscoverCreateAppServerEvent{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &UsageEventOneOf_UiDiscoverCreateAppServerEvent{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipUsageevents(dAtA[iNdEx:]) diff --git a/api/proto/teleport/usageevents/v1/usageevents.proto b/api/proto/teleport/usageevents/v1/usageevents.proto index bc4f73bc83460..8ac7d984c77aa 100644 --- a/api/proto/teleport/usageevents/v1/usageevents.proto +++ b/api/proto/teleport/usageevents/v1/usageevents.proto @@ -366,6 +366,13 @@ message UIDiscoverCreateNodeEvent { DiscoverStepStatus status = 3; } +// UIDiscoverCreateAppServerEvent is emitted when an app server is created. +message UIDiscoverCreateAppServerEvent { + DiscoverMetadata metadata = 1; + DiscoverResourceMetadata resource = 2; + DiscoverStepStatus status = 3; +} + // UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user is finished with the step that configures IAM policy for an RDS database. message UIDiscoverDatabaseConfigureIAMPolicyEvent { DiscoverMetadata metadata = 1; @@ -739,6 +746,7 @@ message UsageEventOneOf { DiscoveryFetchEvent discovery_fetch_event = 54; UIDiscoverCreateDiscoveryConfigEvent ui_discover_create_discovery_config = 55; UIDiscoverKubeEKSEnrollEvent ui_discover_kube_eks_enroll_event = 56; + UIDiscoverCreateAppServerEvent ui_discover_create_app_server_event = 57; } reserved 2; //UIOnboardGetStartedClickEvent reserved "ui_onboard_get_started_click"; diff --git a/gen/proto/go/prehog/v1alpha/teleport.pb.go b/gen/proto/go/prehog/v1alpha/teleport.pb.go index 5ff20475ccb53..2b54e3cb8d555 100644 --- a/gen/proto/go/prehog/v1alpha/teleport.pb.go +++ b/gen/proto/go/prehog/v1alpha/teleport.pb.go @@ -3607,6 +3607,70 @@ func (x *UIDiscoverCreateNodeEvent) GetStatus() *DiscoverStepStatus { return nil } +// UIDiscoverCreateAppServerEvent is emitted when an app server is created. +type UIDiscoverCreateAppServerEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *DiscoverMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Resource *DiscoverResourceMetadata `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` + Status *DiscoverStepStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *UIDiscoverCreateAppServerEvent) Reset() { + *x = UIDiscoverCreateAppServerEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UIDiscoverCreateAppServerEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UIDiscoverCreateAppServerEvent) ProtoMessage() {} + +func (x *UIDiscoverCreateAppServerEvent) ProtoReflect() protoreflect.Message { + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UIDiscoverCreateAppServerEvent.ProtoReflect.Descriptor instead. +func (*UIDiscoverCreateAppServerEvent) Descriptor() ([]byte, []int) { + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{39} +} + +func (x *UIDiscoverCreateAppServerEvent) GetMetadata() *DiscoverMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *UIDiscoverCreateAppServerEvent) GetResource() *DiscoverResourceMetadata { + if x != nil { + return x.Resource + } + return nil +} + +func (x *UIDiscoverCreateAppServerEvent) GetStatus() *DiscoverStepStatus { + if x != nil { + return x.Status + } + return nil +} + // UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user is finished with the step that configures IAM policy for an RDS database. type UIDiscoverDatabaseConfigureIAMPolicyEvent struct { state protoimpl.MessageState @@ -3621,7 +3685,7 @@ type UIDiscoverDatabaseConfigureIAMPolicyEvent struct { func (x *UIDiscoverDatabaseConfigureIAMPolicyEvent) Reset() { *x = UIDiscoverDatabaseConfigureIAMPolicyEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[39] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3634,7 +3698,7 @@ func (x *UIDiscoverDatabaseConfigureIAMPolicyEvent) String() string { func (*UIDiscoverDatabaseConfigureIAMPolicyEvent) ProtoMessage() {} func (x *UIDiscoverDatabaseConfigureIAMPolicyEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[39] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3647,7 +3711,7 @@ func (x *UIDiscoverDatabaseConfigureIAMPolicyEvent) ProtoReflect() protoreflect. // Deprecated: Use UIDiscoverDatabaseConfigureIAMPolicyEvent.ProtoReflect.Descriptor instead. func (*UIDiscoverDatabaseConfigureIAMPolicyEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{39} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{40} } func (x *UIDiscoverDatabaseConfigureIAMPolicyEvent) GetMetadata() *DiscoverMetadata { @@ -3685,7 +3749,7 @@ type UIDiscoverPrincipalsConfigureEvent struct { func (x *UIDiscoverPrincipalsConfigureEvent) Reset() { *x = UIDiscoverPrincipalsConfigureEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[40] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3698,7 +3762,7 @@ func (x *UIDiscoverPrincipalsConfigureEvent) String() string { func (*UIDiscoverPrincipalsConfigureEvent) ProtoMessage() {} func (x *UIDiscoverPrincipalsConfigureEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[40] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3711,7 +3775,7 @@ func (x *UIDiscoverPrincipalsConfigureEvent) ProtoReflect() protoreflect.Message // Deprecated: Use UIDiscoverPrincipalsConfigureEvent.ProtoReflect.Descriptor instead. func (*UIDiscoverPrincipalsConfigureEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{40} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{41} } func (x *UIDiscoverPrincipalsConfigureEvent) GetMetadata() *DiscoverMetadata { @@ -3750,7 +3814,7 @@ type UIDiscoverTestConnectionEvent struct { func (x *UIDiscoverTestConnectionEvent) Reset() { *x = UIDiscoverTestConnectionEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[41] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3763,7 +3827,7 @@ func (x *UIDiscoverTestConnectionEvent) String() string { func (*UIDiscoverTestConnectionEvent) ProtoMessage() {} func (x *UIDiscoverTestConnectionEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[41] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3776,7 +3840,7 @@ func (x *UIDiscoverTestConnectionEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UIDiscoverTestConnectionEvent.ProtoReflect.Descriptor instead. func (*UIDiscoverTestConnectionEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{41} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{42} } func (x *UIDiscoverTestConnectionEvent) GetMetadata() *DiscoverMetadata { @@ -3814,7 +3878,7 @@ type UIDiscoverCompletedEvent struct { func (x *UIDiscoverCompletedEvent) Reset() { *x = UIDiscoverCompletedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[42] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +3891,7 @@ func (x *UIDiscoverCompletedEvent) String() string { func (*UIDiscoverCompletedEvent) ProtoMessage() {} func (x *UIDiscoverCompletedEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[42] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3904,7 @@ func (x *UIDiscoverCompletedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UIDiscoverCompletedEvent.ProtoReflect.Descriptor instead. func (*UIDiscoverCompletedEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{42} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{43} } func (x *UIDiscoverCompletedEvent) GetMetadata() *DiscoverMetadata { @@ -3879,7 +3943,7 @@ type RoleCreateEvent struct { func (x *RoleCreateEvent) Reset() { *x = RoleCreateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[43] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3892,7 +3956,7 @@ func (x *RoleCreateEvent) String() string { func (*RoleCreateEvent) ProtoMessage() {} func (x *RoleCreateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[43] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3905,7 +3969,7 @@ func (x *RoleCreateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleCreateEvent.ProtoReflect.Descriptor instead. func (*RoleCreateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{43} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{44} } func (x *RoleCreateEvent) GetUserName() string { @@ -3947,7 +4011,7 @@ type BotCreateEvent struct { func (x *BotCreateEvent) Reset() { *x = BotCreateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[44] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3960,7 +4024,7 @@ func (x *BotCreateEvent) String() string { func (*BotCreateEvent) ProtoMessage() {} func (x *BotCreateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[44] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3973,7 +4037,7 @@ func (x *BotCreateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use BotCreateEvent.ProtoReflect.Descriptor instead. func (*BotCreateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{44} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{45} } func (x *BotCreateEvent) GetUserName() string { @@ -4039,7 +4103,7 @@ type BotJoinEvent struct { func (x *BotJoinEvent) Reset() { *x = BotJoinEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[45] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4052,7 +4116,7 @@ func (x *BotJoinEvent) String() string { func (*BotJoinEvent) ProtoMessage() {} func (x *BotJoinEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[45] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4065,7 +4129,7 @@ func (x *BotJoinEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use BotJoinEvent.ProtoReflect.Descriptor instead. func (*BotJoinEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{45} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{46} } func (x *BotJoinEvent) GetBotName() string { @@ -4109,7 +4173,7 @@ type UICreateNewRoleClickEvent struct { func (x *UICreateNewRoleClickEvent) Reset() { *x = UICreateNewRoleClickEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[46] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4122,7 +4186,7 @@ func (x *UICreateNewRoleClickEvent) String() string { func (*UICreateNewRoleClickEvent) ProtoMessage() {} func (x *UICreateNewRoleClickEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[46] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4135,7 +4199,7 @@ func (x *UICreateNewRoleClickEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UICreateNewRoleClickEvent.ProtoReflect.Descriptor instead. func (*UICreateNewRoleClickEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{46} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{47} } func (x *UICreateNewRoleClickEvent) GetUserName() string { @@ -4158,7 +4222,7 @@ type UICreateNewRoleSaveClickEvent struct { func (x *UICreateNewRoleSaveClickEvent) Reset() { *x = UICreateNewRoleSaveClickEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[47] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4171,7 +4235,7 @@ func (x *UICreateNewRoleSaveClickEvent) String() string { func (*UICreateNewRoleSaveClickEvent) ProtoMessage() {} func (x *UICreateNewRoleSaveClickEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[47] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4184,7 +4248,7 @@ func (x *UICreateNewRoleSaveClickEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UICreateNewRoleSaveClickEvent.ProtoReflect.Descriptor instead. func (*UICreateNewRoleSaveClickEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{47} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{48} } func (x *UICreateNewRoleSaveClickEvent) GetUserName() string { @@ -4207,7 +4271,7 @@ type UICreateNewRoleCancelClickEvent struct { func (x *UICreateNewRoleCancelClickEvent) Reset() { *x = UICreateNewRoleCancelClickEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[48] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4220,7 +4284,7 @@ func (x *UICreateNewRoleCancelClickEvent) String() string { func (*UICreateNewRoleCancelClickEvent) ProtoMessage() {} func (x *UICreateNewRoleCancelClickEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[48] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4233,7 +4297,7 @@ func (x *UICreateNewRoleCancelClickEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UICreateNewRoleCancelClickEvent.ProtoReflect.Descriptor instead. func (*UICreateNewRoleCancelClickEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{48} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{49} } func (x *UICreateNewRoleCancelClickEvent) GetUserName() string { @@ -4256,7 +4320,7 @@ type UICreateNewRoleViewDocumentationClickEvent struct { func (x *UICreateNewRoleViewDocumentationClickEvent) Reset() { *x = UICreateNewRoleViewDocumentationClickEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[49] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4269,7 +4333,7 @@ func (x *UICreateNewRoleViewDocumentationClickEvent) String() string { func (*UICreateNewRoleViewDocumentationClickEvent) ProtoMessage() {} func (x *UICreateNewRoleViewDocumentationClickEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[49] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4282,7 +4346,7 @@ func (x *UICreateNewRoleViewDocumentationClickEvent) ProtoReflect() protoreflect // Deprecated: Use UICreateNewRoleViewDocumentationClickEvent.ProtoReflect.Descriptor instead. func (*UICreateNewRoleViewDocumentationClickEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{49} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{50} } func (x *UICreateNewRoleViewDocumentationClickEvent) GetUserName() string { @@ -4306,7 +4370,7 @@ type UICallToActionClickEvent struct { func (x *UICallToActionClickEvent) Reset() { *x = UICallToActionClickEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[50] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4319,7 +4383,7 @@ func (x *UICallToActionClickEvent) String() string { func (*UICallToActionClickEvent) ProtoMessage() {} func (x *UICallToActionClickEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[50] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4332,7 +4396,7 @@ func (x *UICallToActionClickEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UICallToActionClickEvent.ProtoReflect.Descriptor instead. func (*UICallToActionClickEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{50} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{51} } func (x *UICallToActionClickEvent) GetUserName() string { @@ -4369,7 +4433,7 @@ type KubeRequestEvent struct { func (x *KubeRequestEvent) Reset() { *x = KubeRequestEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[51] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4382,7 +4446,7 @@ func (x *KubeRequestEvent) String() string { func (*KubeRequestEvent) ProtoMessage() {} func (x *KubeRequestEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[51] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4395,7 +4459,7 @@ func (x *KubeRequestEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeRequestEvent.ProtoReflect.Descriptor instead. func (*KubeRequestEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{51} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{52} } func (x *KubeRequestEvent) GetUserName() string { @@ -4433,7 +4497,7 @@ type SFTPEvent struct { func (x *SFTPEvent) Reset() { *x = SFTPEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[52] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4446,7 +4510,7 @@ func (x *SFTPEvent) String() string { func (*SFTPEvent) ProtoMessage() {} func (x *SFTPEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[52] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4459,7 +4523,7 @@ func (x *SFTPEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SFTPEvent.ProtoReflect.Descriptor instead. func (*SFTPEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{52} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{53} } func (x *SFTPEvent) GetUserName() string { @@ -4507,7 +4571,7 @@ type AgentMetadataEvent struct { func (x *AgentMetadataEvent) Reset() { *x = AgentMetadataEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[53] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4520,7 +4584,7 @@ func (x *AgentMetadataEvent) String() string { func (*AgentMetadataEvent) ProtoMessage() {} func (x *AgentMetadataEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[53] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4533,7 +4597,7 @@ func (x *AgentMetadataEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentMetadataEvent.ProtoReflect.Descriptor instead. func (*AgentMetadataEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{53} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{54} } func (x *AgentMetadataEvent) GetVersion() string { @@ -4643,7 +4707,7 @@ type AssistCompletionEvent struct { func (x *AssistCompletionEvent) Reset() { *x = AssistCompletionEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[54] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4656,7 +4720,7 @@ func (x *AssistCompletionEvent) String() string { func (*AssistCompletionEvent) ProtoMessage() {} func (x *AssistCompletionEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[54] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4669,7 +4733,7 @@ func (x *AssistCompletionEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AssistCompletionEvent.ProtoReflect.Descriptor instead. func (*AssistCompletionEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{54} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{55} } func (x *AssistCompletionEvent) GetUserName() string { @@ -4731,7 +4795,7 @@ type AssistExecutionEvent struct { func (x *AssistExecutionEvent) Reset() { *x = AssistExecutionEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[55] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4744,7 +4808,7 @@ func (x *AssistExecutionEvent) String() string { func (*AssistExecutionEvent) ProtoMessage() {} func (x *AssistExecutionEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[55] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4757,7 +4821,7 @@ func (x *AssistExecutionEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AssistExecutionEvent.ProtoReflect.Descriptor instead. func (*AssistExecutionEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{55} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{56} } func (x *AssistExecutionEvent) GetUserName() string { @@ -4819,7 +4883,7 @@ type AssistNewConversationEvent struct { func (x *AssistNewConversationEvent) Reset() { *x = AssistNewConversationEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[56] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4832,7 +4896,7 @@ func (x *AssistNewConversationEvent) String() string { func (*AssistNewConversationEvent) ProtoMessage() {} func (x *AssistNewConversationEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[56] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4845,7 +4909,7 @@ func (x *AssistNewConversationEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AssistNewConversationEvent.ProtoReflect.Descriptor instead. func (*AssistNewConversationEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{56} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{57} } func (x *AssistNewConversationEvent) GetUserName() string { @@ -4884,7 +4948,7 @@ type AssistAccessRequestEvent struct { func (x *AssistAccessRequestEvent) Reset() { *x = AssistAccessRequestEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[57] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4897,7 +4961,7 @@ func (x *AssistAccessRequestEvent) String() string { func (*AssistAccessRequestEvent) ProtoMessage() {} func (x *AssistAccessRequestEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[57] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4910,7 +4974,7 @@ func (x *AssistAccessRequestEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AssistAccessRequestEvent.ProtoReflect.Descriptor instead. func (*AssistAccessRequestEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{57} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{58} } func (x *AssistAccessRequestEvent) GetUserName() string { @@ -4970,7 +5034,7 @@ type AssistActionEvent struct { func (x *AssistActionEvent) Reset() { *x = AssistActionEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[58] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4983,7 +5047,7 @@ func (x *AssistActionEvent) String() string { func (*AssistActionEvent) ProtoMessage() {} func (x *AssistActionEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[58] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4996,7 +5060,7 @@ func (x *AssistActionEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AssistActionEvent.ProtoReflect.Descriptor instead. func (*AssistActionEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{58} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{59} } func (x *AssistActionEvent) GetUserName() string { @@ -5047,7 +5111,7 @@ type AccessListMetadata struct { func (x *AccessListMetadata) Reset() { *x = AccessListMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[59] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5060,7 +5124,7 @@ func (x *AccessListMetadata) String() string { func (*AccessListMetadata) ProtoMessage() {} func (x *AccessListMetadata) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[59] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5073,7 +5137,7 @@ func (x *AccessListMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListMetadata.ProtoReflect.Descriptor instead. func (*AccessListMetadata) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{59} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{60} } func (x *AccessListMetadata) GetId() string { @@ -5097,7 +5161,7 @@ type AccessListCreateEvent struct { func (x *AccessListCreateEvent) Reset() { *x = AccessListCreateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[60] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5110,7 +5174,7 @@ func (x *AccessListCreateEvent) String() string { func (*AccessListCreateEvent) ProtoMessage() {} func (x *AccessListCreateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[60] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5123,7 +5187,7 @@ func (x *AccessListCreateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListCreateEvent.ProtoReflect.Descriptor instead. func (*AccessListCreateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{60} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{61} } func (x *AccessListCreateEvent) GetUserName() string { @@ -5154,7 +5218,7 @@ type AccessListUpdateEvent struct { func (x *AccessListUpdateEvent) Reset() { *x = AccessListUpdateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[61] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5167,7 +5231,7 @@ func (x *AccessListUpdateEvent) String() string { func (*AccessListUpdateEvent) ProtoMessage() {} func (x *AccessListUpdateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[61] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5180,7 +5244,7 @@ func (x *AccessListUpdateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListUpdateEvent.ProtoReflect.Descriptor instead. func (*AccessListUpdateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{61} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{62} } func (x *AccessListUpdateEvent) GetUserName() string { @@ -5211,7 +5275,7 @@ type AccessListDeleteEvent struct { func (x *AccessListDeleteEvent) Reset() { *x = AccessListDeleteEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[62] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5224,7 +5288,7 @@ func (x *AccessListDeleteEvent) String() string { func (*AccessListDeleteEvent) ProtoMessage() {} func (x *AccessListDeleteEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[62] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5237,7 +5301,7 @@ func (x *AccessListDeleteEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListDeleteEvent.ProtoReflect.Descriptor instead. func (*AccessListDeleteEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{62} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{63} } func (x *AccessListDeleteEvent) GetUserName() string { @@ -5268,7 +5332,7 @@ type AccessListMemberCreateEvent struct { func (x *AccessListMemberCreateEvent) Reset() { *x = AccessListMemberCreateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[63] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5281,7 +5345,7 @@ func (x *AccessListMemberCreateEvent) String() string { func (*AccessListMemberCreateEvent) ProtoMessage() {} func (x *AccessListMemberCreateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[63] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5294,7 +5358,7 @@ func (x *AccessListMemberCreateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListMemberCreateEvent.ProtoReflect.Descriptor instead. func (*AccessListMemberCreateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{63} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{64} } func (x *AccessListMemberCreateEvent) GetUserName() string { @@ -5325,7 +5389,7 @@ type AccessListMemberUpdateEvent struct { func (x *AccessListMemberUpdateEvent) Reset() { *x = AccessListMemberUpdateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[64] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5338,7 +5402,7 @@ func (x *AccessListMemberUpdateEvent) String() string { func (*AccessListMemberUpdateEvent) ProtoMessage() {} func (x *AccessListMemberUpdateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[64] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5351,7 +5415,7 @@ func (x *AccessListMemberUpdateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListMemberUpdateEvent.ProtoReflect.Descriptor instead. func (*AccessListMemberUpdateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{64} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{65} } func (x *AccessListMemberUpdateEvent) GetUserName() string { @@ -5382,7 +5446,7 @@ type AccessListMemberDeleteEvent struct { func (x *AccessListMemberDeleteEvent) Reset() { *x = AccessListMemberDeleteEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[65] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5395,7 +5459,7 @@ func (x *AccessListMemberDeleteEvent) String() string { func (*AccessListMemberDeleteEvent) ProtoMessage() {} func (x *AccessListMemberDeleteEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[65] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5408,7 +5472,7 @@ func (x *AccessListMemberDeleteEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListMemberDeleteEvent.ProtoReflect.Descriptor instead. func (*AccessListMemberDeleteEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{65} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{66} } func (x *AccessListMemberDeleteEvent) GetUserName() string { @@ -5443,7 +5507,7 @@ type AccessListGrantsToUserEvent struct { func (x *AccessListGrantsToUserEvent) Reset() { *x = AccessListGrantsToUserEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[66] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5456,7 +5520,7 @@ func (x *AccessListGrantsToUserEvent) String() string { func (*AccessListGrantsToUserEvent) ProtoMessage() {} func (x *AccessListGrantsToUserEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[66] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5469,7 +5533,7 @@ func (x *AccessListGrantsToUserEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListGrantsToUserEvent.ProtoReflect.Descriptor instead. func (*AccessListGrantsToUserEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{66} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{67} } func (x *AccessListGrantsToUserEvent) GetUserName() string { @@ -5517,7 +5581,7 @@ type AccessListReviewCreateEvent struct { func (x *AccessListReviewCreateEvent) Reset() { *x = AccessListReviewCreateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[67] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5530,7 +5594,7 @@ func (x *AccessListReviewCreateEvent) String() string { func (*AccessListReviewCreateEvent) ProtoMessage() {} func (x *AccessListReviewCreateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[67] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5543,7 +5607,7 @@ func (x *AccessListReviewCreateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListReviewCreateEvent.ProtoReflect.Descriptor instead. func (*AccessListReviewCreateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{67} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{68} } func (x *AccessListReviewCreateEvent) GetUserName() string { @@ -5611,7 +5675,7 @@ type AccessListReviewDeleteEvent struct { func (x *AccessListReviewDeleteEvent) Reset() { *x = AccessListReviewDeleteEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[68] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5624,7 +5688,7 @@ func (x *AccessListReviewDeleteEvent) String() string { func (*AccessListReviewDeleteEvent) ProtoMessage() {} func (x *AccessListReviewDeleteEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[68] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5637,7 +5701,7 @@ func (x *AccessListReviewDeleteEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListReviewDeleteEvent.ProtoReflect.Descriptor instead. func (*AccessListReviewDeleteEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{68} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{69} } func (x *AccessListReviewDeleteEvent) GetUserName() string { @@ -5677,7 +5741,7 @@ type AccessListReviewComplianceEvent struct { func (x *AccessListReviewComplianceEvent) Reset() { *x = AccessListReviewComplianceEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[69] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5690,7 +5754,7 @@ func (x *AccessListReviewComplianceEvent) String() string { func (*AccessListReviewComplianceEvent) ProtoMessage() {} func (x *AccessListReviewComplianceEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[69] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5703,7 +5767,7 @@ func (x *AccessListReviewComplianceEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessListReviewComplianceEvent.ProtoReflect.Descriptor instead. func (*AccessListReviewComplianceEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{69} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{70} } func (x *AccessListReviewComplianceEvent) GetTotalAccessLists() int32 { @@ -5739,7 +5803,7 @@ type IntegrationEnrollMetadata struct { func (x *IntegrationEnrollMetadata) Reset() { *x = IntegrationEnrollMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[70] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5752,7 +5816,7 @@ func (x *IntegrationEnrollMetadata) String() string { func (*IntegrationEnrollMetadata) ProtoMessage() {} func (x *IntegrationEnrollMetadata) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[70] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5765,7 +5829,7 @@ func (x *IntegrationEnrollMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegrationEnrollMetadata.ProtoReflect.Descriptor instead. func (*IntegrationEnrollMetadata) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{70} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{71} } func (x *IntegrationEnrollMetadata) GetId() string { @@ -5802,7 +5866,7 @@ type UIIntegrationEnrollStartEvent struct { func (x *UIIntegrationEnrollStartEvent) Reset() { *x = UIIntegrationEnrollStartEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[71] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5815,7 +5879,7 @@ func (x *UIIntegrationEnrollStartEvent) String() string { func (*UIIntegrationEnrollStartEvent) ProtoMessage() {} func (x *UIIntegrationEnrollStartEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[71] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5828,7 +5892,7 @@ func (x *UIIntegrationEnrollStartEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UIIntegrationEnrollStartEvent.ProtoReflect.Descriptor instead. func (*UIIntegrationEnrollStartEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{71} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{72} } func (x *UIIntegrationEnrollStartEvent) GetMetadata() *IntegrationEnrollMetadata { @@ -5851,7 +5915,7 @@ type UIIntegrationEnrollCompleteEvent struct { func (x *UIIntegrationEnrollCompleteEvent) Reset() { *x = UIIntegrationEnrollCompleteEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[72] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5864,7 +5928,7 @@ func (x *UIIntegrationEnrollCompleteEvent) String() string { func (*UIIntegrationEnrollCompleteEvent) ProtoMessage() {} func (x *UIIntegrationEnrollCompleteEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[72] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5877,7 +5941,7 @@ func (x *UIIntegrationEnrollCompleteEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UIIntegrationEnrollCompleteEvent.ProtoReflect.Descriptor instead. func (*UIIntegrationEnrollCompleteEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{72} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{73} } func (x *UIIntegrationEnrollCompleteEvent) GetMetadata() *IntegrationEnrollMetadata { @@ -5902,7 +5966,7 @@ type EditorChangeEvent struct { func (x *EditorChangeEvent) Reset() { *x = EditorChangeEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[73] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5915,7 +5979,7 @@ func (x *EditorChangeEvent) String() string { func (*EditorChangeEvent) ProtoMessage() {} func (x *EditorChangeEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[73] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5928,7 +5992,7 @@ func (x *EditorChangeEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use EditorChangeEvent.ProtoReflect.Descriptor instead. func (*EditorChangeEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{73} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{74} } func (x *EditorChangeEvent) GetUserName() string { @@ -5968,7 +6032,7 @@ type DeviceAuthenticateEvent struct { func (x *DeviceAuthenticateEvent) Reset() { *x = DeviceAuthenticateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[74] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5981,7 +6045,7 @@ func (x *DeviceAuthenticateEvent) String() string { func (*DeviceAuthenticateEvent) ProtoMessage() {} func (x *DeviceAuthenticateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[74] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5994,7 +6058,7 @@ func (x *DeviceAuthenticateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DeviceAuthenticateEvent.ProtoReflect.Descriptor instead. func (*DeviceAuthenticateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{74} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{75} } func (x *DeviceAuthenticateEvent) GetDeviceId() string { @@ -6047,7 +6111,7 @@ type DeviceEnrollEvent struct { func (x *DeviceEnrollEvent) Reset() { *x = DeviceEnrollEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[75] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6060,7 +6124,7 @@ func (x *DeviceEnrollEvent) String() string { func (*DeviceEnrollEvent) ProtoMessage() {} func (x *DeviceEnrollEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[75] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6073,7 +6137,7 @@ func (x *DeviceEnrollEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DeviceEnrollEvent.ProtoReflect.Descriptor instead. func (*DeviceEnrollEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{75} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{76} } func (x *DeviceEnrollEvent) GetDeviceId() string { @@ -6131,7 +6195,7 @@ type FeatureRecommendationEvent struct { func (x *FeatureRecommendationEvent) Reset() { *x = FeatureRecommendationEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[76] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6144,7 +6208,7 @@ func (x *FeatureRecommendationEvent) String() string { func (*FeatureRecommendationEvent) ProtoMessage() {} func (x *FeatureRecommendationEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[76] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6157,7 +6221,7 @@ func (x *FeatureRecommendationEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use FeatureRecommendationEvent.ProtoReflect.Descriptor instead. func (*FeatureRecommendationEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{76} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{77} } func (x *FeatureRecommendationEvent) GetUserName() string { @@ -6197,7 +6261,7 @@ type LicenseLimitEvent struct { func (x *LicenseLimitEvent) Reset() { *x = LicenseLimitEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[77] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6210,7 +6274,7 @@ func (x *LicenseLimitEvent) String() string { func (*LicenseLimitEvent) ProtoMessage() {} func (x *LicenseLimitEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[77] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6223,7 +6287,7 @@ func (x *LicenseLimitEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LicenseLimitEvent.ProtoReflect.Descriptor instead. func (*LicenseLimitEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{77} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{78} } func (x *LicenseLimitEvent) GetLicenseLimit() LicenseLimit { @@ -6257,7 +6321,7 @@ type DesktopDirectoryShareEvent struct { func (x *DesktopDirectoryShareEvent) Reset() { *x = DesktopDirectoryShareEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[78] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6270,7 +6334,7 @@ func (x *DesktopDirectoryShareEvent) String() string { func (*DesktopDirectoryShareEvent) ProtoMessage() {} func (x *DesktopDirectoryShareEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[78] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6283,7 +6347,7 @@ func (x *DesktopDirectoryShareEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DesktopDirectoryShareEvent.ProtoReflect.Descriptor instead. func (*DesktopDirectoryShareEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{78} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{79} } func (x *DesktopDirectoryShareEvent) GetDesktop() string { @@ -6327,7 +6391,7 @@ type DesktopClipboardEvent struct { func (x *DesktopClipboardEvent) Reset() { *x = DesktopClipboardEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[79] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6340,7 +6404,7 @@ func (x *DesktopClipboardEvent) String() string { func (*DesktopClipboardEvent) ProtoMessage() {} func (x *DesktopClipboardEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[79] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6353,7 +6417,7 @@ func (x *DesktopClipboardEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DesktopClipboardEvent.ProtoReflect.Descriptor instead. func (*DesktopClipboardEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{79} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{80} } func (x *DesktopClipboardEvent) GetDesktop() string { @@ -6392,7 +6456,7 @@ type TAGExecuteQueryEvent struct { func (x *TAGExecuteQueryEvent) Reset() { *x = TAGExecuteQueryEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[80] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6405,7 +6469,7 @@ func (x *TAGExecuteQueryEvent) String() string { func (*TAGExecuteQueryEvent) ProtoMessage() {} func (x *TAGExecuteQueryEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[80] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6418,7 +6482,7 @@ func (x *TAGExecuteQueryEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use TAGExecuteQueryEvent.ProtoReflect.Descriptor instead. func (*TAGExecuteQueryEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{80} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{81} } func (x *TAGExecuteQueryEvent) GetUserName() string { @@ -6462,7 +6526,7 @@ type ExternalAuditStorageAuthenticateEvent struct { func (x *ExternalAuditStorageAuthenticateEvent) Reset() { *x = ExternalAuditStorageAuthenticateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[81] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6475,7 +6539,7 @@ func (x *ExternalAuditStorageAuthenticateEvent) String() string { func (*ExternalAuditStorageAuthenticateEvent) ProtoMessage() {} func (x *ExternalAuditStorageAuthenticateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[81] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6488,7 +6552,7 @@ func (x *ExternalAuditStorageAuthenticateEvent) ProtoReflect() protoreflect.Mess // Deprecated: Use ExternalAuditStorageAuthenticateEvent.ProtoReflect.Descriptor instead. func (*ExternalAuditStorageAuthenticateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{81} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{82} } // SecurityReportGetResultEvent is emitted when the user requests a security report. @@ -6508,7 +6572,7 @@ type SecurityReportGetResultEvent struct { func (x *SecurityReportGetResultEvent) Reset() { *x = SecurityReportGetResultEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[82] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6521,7 +6585,7 @@ func (x *SecurityReportGetResultEvent) String() string { func (*SecurityReportGetResultEvent) ProtoMessage() {} func (x *SecurityReportGetResultEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[82] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6534,7 +6598,7 @@ func (x *SecurityReportGetResultEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SecurityReportGetResultEvent.ProtoReflect.Descriptor instead. func (*SecurityReportGetResultEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{82} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{83} } func (x *SecurityReportGetResultEvent) GetUserName() string { @@ -6575,7 +6639,7 @@ type AuditQueryRunEvent struct { func (x *AuditQueryRunEvent) Reset() { *x = AuditQueryRunEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[83] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6588,7 +6652,7 @@ func (x *AuditQueryRunEvent) String() string { func (*AuditQueryRunEvent) ProtoMessage() {} func (x *AuditQueryRunEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[83] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6601,7 +6665,7 @@ func (x *AuditQueryRunEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditQueryRunEvent.ProtoReflect.Descriptor instead. func (*AuditQueryRunEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{83} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{84} } func (x *AuditQueryRunEvent) GetUserName() string { @@ -6647,7 +6711,7 @@ type DiscoveryFetchEvent struct { func (x *DiscoveryFetchEvent) Reset() { *x = DiscoveryFetchEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[84] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6660,7 +6724,7 @@ func (x *DiscoveryFetchEvent) String() string { func (*DiscoveryFetchEvent) ProtoMessage() {} func (x *DiscoveryFetchEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[84] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6673,7 +6737,7 @@ func (x *DiscoveryFetchEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoveryFetchEvent.ProtoReflect.Descriptor instead. func (*DiscoveryFetchEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{84} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{85} } func (x *DiscoveryFetchEvent) GetCloudProvider() string { @@ -6716,7 +6780,7 @@ type OktaAccessListSyncEvent struct { func (x *OktaAccessListSyncEvent) Reset() { *x = OktaAccessListSyncEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[85] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6729,7 +6793,7 @@ func (x *OktaAccessListSyncEvent) String() string { func (*OktaAccessListSyncEvent) ProtoMessage() {} func (x *OktaAccessListSyncEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[85] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6742,7 +6806,7 @@ func (x *OktaAccessListSyncEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use OktaAccessListSyncEvent.ProtoReflect.Descriptor instead. func (*OktaAccessListSyncEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{85} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{86} } func (x *OktaAccessListSyncEvent) GetNumAppFilters() int32 { @@ -6811,7 +6875,7 @@ type DatabaseUserCreatedEvent struct { func (x *DatabaseUserCreatedEvent) Reset() { *x = DatabaseUserCreatedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[86] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6824,7 +6888,7 @@ func (x *DatabaseUserCreatedEvent) String() string { func (*DatabaseUserCreatedEvent) ProtoMessage() {} func (x *DatabaseUserCreatedEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[86] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6837,7 +6901,7 @@ func (x *DatabaseUserCreatedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseUserCreatedEvent.ProtoReflect.Descriptor instead. func (*DatabaseUserCreatedEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{86} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{87} } func (x *DatabaseUserCreatedEvent) GetDatabase() *SessionStartDatabaseMetadata { @@ -6881,7 +6945,7 @@ type DatabaseUserPermissionsUpdateEvent struct { func (x *DatabaseUserPermissionsUpdateEvent) Reset() { *x = DatabaseUserPermissionsUpdateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[87] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6894,7 +6958,7 @@ func (x *DatabaseUserPermissionsUpdateEvent) String() string { func (*DatabaseUserPermissionsUpdateEvent) ProtoMessage() {} func (x *DatabaseUserPermissionsUpdateEvent) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[87] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6907,7 +6971,7 @@ func (x *DatabaseUserPermissionsUpdateEvent) ProtoReflect() protoreflect.Message // Deprecated: Use DatabaseUserPermissionsUpdateEvent.ProtoReflect.Descriptor instead. func (*DatabaseUserPermissionsUpdateEvent) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{87} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{88} } func (x *DatabaseUserPermissionsUpdateEvent) GetDatabase() *SessionStartDatabaseMetadata { @@ -7036,13 +7100,14 @@ type SubmitEventRequest struct { // *SubmitEventRequest_DatabaseUserPermissionsUpdated // *SubmitEventRequest_UiDiscoverCreateDiscoveryConfig // *SubmitEventRequest_UiDiscoverKubeEksEnrollEvent + // *SubmitEventRequest_UiDiscoverCreateAppServerEvent Event isSubmitEventRequest_Event `protobuf_oneof:"event"` } func (x *SubmitEventRequest) Reset() { *x = SubmitEventRequest{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[88] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7055,7 +7120,7 @@ func (x *SubmitEventRequest) String() string { func (*SubmitEventRequest) ProtoMessage() {} func (x *SubmitEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[88] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7068,7 +7133,7 @@ func (x *SubmitEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitEventRequest.ProtoReflect.Descriptor instead. func (*SubmitEventRequest) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{88} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{89} } func (x *SubmitEventRequest) GetClusterName() string { @@ -7659,6 +7724,13 @@ func (x *SubmitEventRequest) GetUiDiscoverKubeEksEnrollEvent() *UIDiscoverKubeEK return nil } +func (x *SubmitEventRequest) GetUiDiscoverCreateAppServerEvent() *UIDiscoverCreateAppServerEvent { + if x, ok := x.GetEvent().(*SubmitEventRequest_UiDiscoverCreateAppServerEvent); ok { + return x.UiDiscoverCreateAppServerEvent + } + return nil +} + type isSubmitEventRequest_Event interface { isSubmitEventRequest_Event() } @@ -7992,6 +8064,10 @@ type SubmitEventRequest_UiDiscoverKubeEksEnrollEvent struct { UiDiscoverKubeEksEnrollEvent *UIDiscoverKubeEKSEnrollEvent `protobuf:"bytes,84,opt,name=ui_discover_kube_eks_enroll_event,json=uiDiscoverKubeEksEnrollEvent,proto3,oneof"` } +type SubmitEventRequest_UiDiscoverCreateAppServerEvent struct { + UiDiscoverCreateAppServerEvent *UIDiscoverCreateAppServerEvent `protobuf:"bytes,85,opt,name=ui_discover_create_app_server_event,json=uiDiscoverCreateAppServerEvent,proto3,oneof"` +} + func (*SubmitEventRequest_UserLogin) isSubmitEventRequest_Event() {} func (*SubmitEventRequest_SsoCreate) isSubmitEventRequest_Event() {} @@ -8156,6 +8232,8 @@ func (*SubmitEventRequest_UiDiscoverCreateDiscoveryConfig) isSubmitEventRequest_ func (*SubmitEventRequest_UiDiscoverKubeEksEnrollEvent) isSubmitEventRequest_Event() {} +func (*SubmitEventRequest_UiDiscoverCreateAppServerEvent) isSubmitEventRequest_Event() {} + type SubmitEventResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8165,7 +8243,7 @@ type SubmitEventResponse struct { func (x *SubmitEventResponse) Reset() { *x = SubmitEventResponse{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[89] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8178,7 +8256,7 @@ func (x *SubmitEventResponse) String() string { func (*SubmitEventResponse) ProtoMessage() {} func (x *SubmitEventResponse) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[89] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8191,7 +8269,7 @@ func (x *SubmitEventResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitEventResponse.ProtoReflect.Descriptor instead. func (*SubmitEventResponse) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{89} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{90} } type SubmitEventsRequest struct { @@ -8206,7 +8284,7 @@ type SubmitEventsRequest struct { func (x *SubmitEventsRequest) Reset() { *x = SubmitEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[90] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8219,7 +8297,7 @@ func (x *SubmitEventsRequest) String() string { func (*SubmitEventsRequest) ProtoMessage() {} func (x *SubmitEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[90] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8232,7 +8310,7 @@ func (x *SubmitEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitEventsRequest.ProtoReflect.Descriptor instead. func (*SubmitEventsRequest) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{90} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{91} } func (x *SubmitEventsRequest) GetEvents() []*SubmitEventRequest { @@ -8251,7 +8329,7 @@ type SubmitEventsResponse struct { func (x *SubmitEventsResponse) Reset() { *x = SubmitEventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[91] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8264,7 +8342,7 @@ func (x *SubmitEventsResponse) String() string { func (*SubmitEventsResponse) ProtoMessage() {} func (x *SubmitEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[91] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8277,7 +8355,7 @@ func (x *SubmitEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitEventsResponse.ProtoReflect.Descriptor instead. func (*SubmitEventsResponse) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{91} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{92} } type HelloTeleportRequest struct { @@ -8289,7 +8367,7 @@ type HelloTeleportRequest struct { func (x *HelloTeleportRequest) Reset() { *x = HelloTeleportRequest{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[92] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8302,7 +8380,7 @@ func (x *HelloTeleportRequest) String() string { func (*HelloTeleportRequest) ProtoMessage() {} func (x *HelloTeleportRequest) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[92] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8315,7 +8393,7 @@ func (x *HelloTeleportRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HelloTeleportRequest.ProtoReflect.Descriptor instead. func (*HelloTeleportRequest) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{92} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{93} } type HelloTeleportResponse struct { @@ -8327,7 +8405,7 @@ type HelloTeleportResponse struct { func (x *HelloTeleportResponse) Reset() { *x = HelloTeleportResponse{} if protoimpl.UnsafeEnabled { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[93] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8340,7 +8418,7 @@ func (x *HelloTeleportResponse) String() string { func (*HelloTeleportResponse) ProtoMessage() {} func (x *HelloTeleportResponse) ProtoReflect() protoreflect.Message { - mi := &file_prehog_v1alpha_teleport_proto_msgTypes[93] + mi := &file_prehog_v1alpha_teleport_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8353,7 +8431,7 @@ func (x *HelloTeleportResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HelloTeleportResponse.ProtoReflect.Descriptor instead. func (*HelloTeleportResponse) Descriptor() ([]byte, []int) { - return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{93} + return file_prehog_v1alpha_teleport_proto_rawDescGZIP(), []int{94} } var File_prehog_v1alpha_teleport_proto protoreflect.FileDescriptor @@ -8813,38 +8891,66 @@ var file_prehog_v1alpha_teleport_proto_rawDesc = []byte{ 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x29, 0x55, - 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x1e, 0x55, + 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, + 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xeb, 0x01, + 0x0a, 0x29, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x41, 0x4d, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe4, 0x01, 0x0a, 0x22, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x44, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe4, 0x01, 0x0a, 0x22, 0x55, 0x49, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x3c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0xdf, 0x01, 0x0a, 0x1d, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xda, 0x01, 0x0a, 0x18, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, @@ -8857,1301 +8963,1295 @@ var file_prehog_v1alpha_teleport_proto_rawDesc = []byte{ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0xda, 0x01, 0x0a, 0x18, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x65, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4b, - 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x0e, - 0x42, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x62, - 0x6f, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6f, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6a, - 0x6f, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x62, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x62, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x0c, 0x42, 0x6f, 0x74, 0x4a, - 0x6f, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6a, - 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x19, 0x55, 0x49, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, - 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, + 0x73, 0x22, 0x4b, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x0a, 0x1f, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, - 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc9, + 0x01, 0x0a, 0x0e, 0x42, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, + 0x0a, 0x0d, 0x62, 0x6f, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6f, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x0c, 0x42, + 0x6f, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, + 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, + 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6a, 0x6f, 0x69, + 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x19, + 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, + 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x1d, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x1f, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x2a, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x5e, 0x0a, 0x18, 0x55, 0x49, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x03, 0x63, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x43, 0x54, 0x41, 0x52, 0x03, 0x63, 0x74, 0x61, 0x22, + 0x66, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x77, 0x0a, 0x09, 0x53, 0x46, 0x54, 0x50, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x49, 0x0a, 0x2a, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, - 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5e, 0x0a, 0x18, - 0x55, 0x49, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, - 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, + 0x22, 0xcb, 0x03, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x68, 0x6f, 0x73, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x6c, 0x69, 0x62, 0x63, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x63, 0x68, 0x65, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x72, 0x22, 0xd2, + 0x01, 0x0a, 0x15, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x03, 0x63, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x43, 0x54, 0x41, 0x52, 0x03, 0x63, 0x74, 0x61, 0x22, 0x66, 0x0a, 0x10, - 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, - 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x77, 0x0a, 0x09, 0x53, 0x46, 0x54, 0x50, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4b, - 0x69, 0x6e, 0x64, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xcb, 0x03, - 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, - 0x0a, 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x6f, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, - 0x6f, 0x73, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x67, 0x6c, 0x69, 0x62, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x6c, 0x69, 0x62, 0x63, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, - 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x72, 0x22, 0xd2, 0x01, 0x0a, 0x15, - 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x22, 0xf0, 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x22, 0x55, 0x0a, 0x1a, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0xd1, 0x01, 0x0a, 0x18, 0x41, - 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x65, 0x6e, 0x73, 0x22, 0xf0, 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x55, 0x0a, 0x1a, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, + 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0xd1, 0x01, + 0x0a, 0x18, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xbd, - 0x01, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0x24, 0x0a, 0x12, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x74, 0x0a, + 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x74, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7a, 0x0a, 0x1b, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7a, 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x24, - 0x0a, 0x12, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x7a, 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9c, 0x01, + 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x74, 0x0a, 0x15, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, + 0x72, 0x61, 0x69, 0x74, 0x73, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x22, 0xaf, 0x03, 0x0a, + 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x19, 0x64, 0x61, 0x79, + 0x73, 0x5f, 0x70, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x64, 0x61, + 0x79, 0x73, 0x50, 0x61, 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x1f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x64, 0x61, 0x79, 0x5f, 0x6f, 0x66, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x44, 0x61, 0x79, 0x4f, 0x66, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xad, + 0x01, 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x15, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x22, 0x88, + 0x01, 0x0a, 0x1f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, + 0x12, 0x37, 0x0a, 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, + 0x5f, 0x6e, 0x65, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x15, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4e, + 0x65, 0x65, 0x64, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x83, 0x01, 0x0a, 0x19, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x66, 0x0a, 0x1d, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x45, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x69, 0x0a, 0x20, 0x55, 0x49, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x6c, 0x0a, 0x11, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x79, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x6f, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x11, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x22, 0xdd, 0x01, 0x0a, 0x1a, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x6f, 0x0a, 0x1d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x1b, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x11, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x0c, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7a, + 0x0a, 0x1a, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, + 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x15, 0x44, 0x65, + 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x0a, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x14, 0x54, + 0x41, 0x47, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x74, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7a, 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x45, 0x64, 0x67, + 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x27, 0x0a, 0x25, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x1c, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x22, + 0x64, 0x0a, 0x12, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x7a, 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7a, - 0x0a, 0x1b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9c, 0x01, 0x0a, 0x1b, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, - 0x6f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x69, - 0x74, 0x73, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x22, 0xaf, 0x03, 0x0a, 0x1b, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x19, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x70, - 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x64, 0x61, 0x79, 0x73, 0x50, - 0x61, 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x46, 0x0a, 0x1f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x61, 0x79, - 0x5f, 0x6f, 0x66, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, - 0x61, 0x79, 0x4f, 0x66, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x1b, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x15, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x1f, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x37, 0x0a, - 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x5f, 0x6e, 0x65, - 0x65, 0x64, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x15, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4e, 0x65, 0x65, 0x64, - 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x83, 0x01, 0x0a, 0x19, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x1d, - 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x69, 0x0a, 0x20, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x6c, 0x0a, 0x11, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x79, 0x0a, - 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x73, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6f, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x22, 0xdd, 0x01, 0x0a, 0x1a, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x31, 0x0a, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x6f, 0x0a, 0x1d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x1b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x11, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0c, 0x6c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7a, 0x0a, 0x1a, 0x44, - 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x73, 0x6b, - 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x15, 0x44, 0x65, 0x73, 0x6b, 0x74, - 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x14, 0x54, 0x41, 0x47, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x45, 0x64, 0x67, 0x65, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x27, - 0x0a, 0x25, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x1c, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x22, 0x64, 0x0a, 0x12, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, - 0x61, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x22, 0x61, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x17, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x41, - 0x70, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x70, 0x70, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x41, 0x70, 0x70, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x9e, 0x01, - 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xe0, - 0x01, 0x0a, 0x22, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x6e, - 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6e, 0x75, 0x6d, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xda, 0x45, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x0a, 0x73, 0x73, 0x6f, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x53, 0x4f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x73, 0x73, - 0x6f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x69, 0x5f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x63, - 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x42, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x0d, 0x75, 0x69, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, - 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x67, 0x6f, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x61, - 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, - 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x82, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x4f, 0x6e, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, - 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x74, 0x65, - 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x61, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x17, 0x4f, 0x6b, 0x74, + 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x70, 0x70, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, + 0x75, 0x6d, 0x41, 0x70, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x6e, 0x75, 0x6d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, + 0x61, 0x70, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x41, + 0x70, 0x70, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x75, 0x6d, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x22, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x34, + 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x6e, 0x75, 0x6d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd9, 0x46, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x0a, 0x73, 0x73, 0x6f, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, + 0x53, 0x4f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x73, 0x6f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x69, 0x5f, 0x62, 0x61, 0x6e, 0x6e, 0x65, + 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, - 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x7b, - 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, - 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x87, 0x01, 0x0a, 0x24, - 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, - 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, - 0x6e, 0x75, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, - 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x12, 0x6f, 0x0a, 0x1c, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x63, 0x6c, 0x69, - 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x43, 0x6c, - 0x69, 0x63, 0x6b, 0x12, 0x72, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x63, - 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x50, 0x72, 0x69, 0x6e, 0x74, - 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x19, 0x75, 0x69, - 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x50, 0x72, 0x69, - 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x19, 0x75, 0x69, 0x5f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, - 0x24, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x6f, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x56, - 0x32, 0x12, 0x76, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7f, 0x0a, 0x23, 0x75, 0x69, 0x5f, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x8f, 0x01, 0x0a, 0x29, 0x75, - 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x74, - 0x6c, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x49, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x69, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x67, 0x6f, 0x5f, 0x74, 0x6f, + 0x5f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x82, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x6f, + 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, + 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, + 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, + 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, + 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, + 0x6b, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, + 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x87, + 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, + 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, + 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, + 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x6f, 0x0a, 0x1c, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, + 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x79, + 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, + 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, + 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x72, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x19, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, + 0x50, 0x72, 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x19, 0x75, 0x69, + 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xb8, 0x01, 0x0a, - 0x38, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x41, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, - 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x31, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xae, 0x01, 0x0a, 0x34, 0x75, 0x69, 0x5f, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x2e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x2b, 0x75, 0x69, 0x5f, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6f, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, 0x73, 0x65, 0x72, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x26, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x9f, 0x01, 0x0a, 0x2f, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x29, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x26, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x22, 0x75, 0x69, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, - 0x21, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x75, 0x69, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x1b, 0x75, 0x69, 0x5f, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, + 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7f, 0x0a, 0x23, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x8f, 0x01, + 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, 0x54, + 0x4c, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x75, 0x69, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0xb8, 0x01, 0x0a, 0x38, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, + 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, + 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x31, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xae, 0x01, 0x0a, 0x34, 0x75, + 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x2e, 0x75, 0x69, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x2b, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x26, 0x75, 0x69, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x2f, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, - 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x6f, 0x6c, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x75, 0x69, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x6c, - 0x69, 0x63, 0x6b, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x70, 0x0a, 0x1d, - 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x5f, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x21, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, - 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, - 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x76, - 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x69, 0x63, - 0x6b, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, - 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, 0x69, 0x43, 0x72, + 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x29, 0x75, 0x69, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x26, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x22, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x1b, 0x75, + 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, + 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x75, 0x69, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, + 0x70, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, + 0x6b, 0x12, 0x76, 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, + 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x98, 0x01, 0x0a, 0x2b, 0x75, 0x69, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, + 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, + 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x98, 0x01, 0x0a, 0x2b, 0x75, 0x69, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, + 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x25, 0x75, + 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, + 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4b, 0x75, 0x62, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, + 0x6b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x73, + 0x66, 0x74, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x46, 0x54, 0x50, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x66, 0x74, 0x70, 0x12, 0x56, 0x0a, 0x14, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x9c, 0x01, + 0x0a, 0x2e, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x77, 0x73, 0x5f, 0x6f, 0x69, + 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x57, 0x53, + 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x28, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x77, 0x73, 0x4f, 0x69, 0x64, 0x63, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x83, 0x01, 0x0a, + 0x25, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, - 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, - 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x25, 0x75, 0x69, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, - 0x6b, 0x12, 0x45, 0x0a, 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6b, 0x75, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x73, 0x66, 0x74, 0x70, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x46, 0x54, 0x50, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x66, 0x74, 0x70, 0x12, 0x56, 0x0a, 0x14, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x57, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x68, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x2e, 0x75, - 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x77, 0x73, 0x5f, 0x6f, 0x69, 0x64, 0x63, 0x5f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, - 0x43, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x28, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x77, 0x73, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x83, 0x01, 0x0a, 0x25, 0x75, 0x69, - 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x44, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x64, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x61, 0x6c, + 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x54, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x1d, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x62, 0x6f, + 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x42, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x1f, 0x75, + 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x51, + 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, + 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x6a, + 0x6f, 0x69, 0x6e, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x42, 0x6f, 0x74, 0x4a, 0x6f, + 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x4a, 0x6f, + 0x69, 0x6e, 0x12, 0x51, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, + 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x17, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, + 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, + 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x19, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x6e, 0x0a, 0x1c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, + 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x5e, 0x0a, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x61, + 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, + 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x13, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x53, 0x0a, 0x13, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, + 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, + 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x5f, + 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, + 0x6f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, 0x6f, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x45, 0x63, 0x32, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x75, 0x69, 0x5f, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x65, + 0x69, 0x63, 0x65, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x44, 0x53, - 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, - 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x64, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x6b, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x11, - 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x49, 0x43, 0x45, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x17, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, - 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, - 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, - 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, - 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x20, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x62, 0x6f, 0x74, 0x5f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x42, 0x6f, 0x74, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x62, - 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x6f, - 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, - 0x61, 0x69, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x30, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, - 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x42, 0x6f, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x12, - 0x51, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, - 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x17, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x77, - 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x19, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x6e, 0x0a, 0x1c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x1a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x5e, 0x0a, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x64, 0x0a, 0x17, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x44, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x15, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x65, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, + 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x18, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x52, 0x0a, + 0x11, 0x74, 0x61, 0x67, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5f, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, + 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x54, 0x41, 0x47, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x0f, 0x74, 0x61, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x86, 0x01, 0x0a, 0x23, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x6b, 0x0a, 0x1a, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x67, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x48, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x73, 0x73, - 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, - 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, - 0x0a, 0x13, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x59, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x4b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x69, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, - 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, 0x6f, 0x55, 0x73, - 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, 0x6f, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x18, 0x6d, 0x66, + 0x61, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4d, 0x46, + 0x41, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x66, 0x61, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, + 0x0a, 0x12, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x73, 0x76, 0x69, 0x64, 0x5f, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x64, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x50, 0x49, 0x46, + 0x46, 0x45, 0x53, 0x56, 0x49, 0x44, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x53, 0x76, 0x69, 0x64, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x64, 0x12, 0x5c, 0x0a, 0x15, 0x6f, 0x6b, 0x74, 0x61, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x50, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x12, 0x6f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x79, 0x6e, 0x63, 0x12, 0x5e, 0x0a, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x7f, 0x0a, 0x21, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x45, 0x63, 0x32, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x65, 0x69, 0x63, 0x65, - 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x53, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x77, 0x0a, 0x21, 0x75, + 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x5f, + 0x65, 0x6b, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x49, 0x43, 0x45, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x17, 0x75, 0x69, 0x5f, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x64, 0x0a, - 0x17, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x44, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x4b, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x6b, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7d, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x55, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x08, + 0x10, 0x09, 0x52, 0x1c, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x67, + 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x64, 0x65, - 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x65, 0x12, 0x65, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x63, - 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x18, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x11, 0x74, 0x61, - 0x67, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x54, 0x41, 0x47, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x74, - 0x61, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x86, - 0x01, 0x0a, 0x23, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x6b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x73, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x75, 0x6e, 0x12, 0x59, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, - 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x68, 0x0a, - 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, - 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x18, 0x6d, 0x66, 0x61, 0x5f, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4d, 0x46, 0x41, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x66, 0x61, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, 0x73, - 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x73, 0x76, 0x69, 0x64, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x64, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x53, - 0x56, 0x49, 0x44, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x53, 0x76, 0x69, 0x64, 0x49, 0x73, 0x73, 0x75, - 0x65, 0x64, 0x12, 0x5c, 0x0a, 0x15, 0x6f, 0x6b, 0x74, 0x61, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x50, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x6b, - 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, - 0x12, 0x5e, 0x0a, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x7f, 0x0a, 0x21, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x1e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x84, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x77, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x65, 0x6b, 0x73, - 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x54, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4b, - 0x75, 0x62, 0x65, 0x45, 0x4b, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4b, - 0x75, 0x62, 0x65, 0x45, 0x6b, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, - 0x52, 0x1c, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x65, 0x74, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x15, - 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x16, 0x0a, 0x14, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2a, 0x87, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, - 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, - 0x4e, 0x53, 0x53, 0x48, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, - 0x4e, 0x53, 0x53, 0x48, 0x5f, 0x45, 0x49, 0x43, 0x45, 0x10, 0x07, 0x2a, 0x4d, 0x0a, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10, 0x02, 0x2a, 0xc0, 0x0f, 0x0a, 0x10, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x21, 0x0a, 0x1d, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, - 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, - 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, - 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x46, - 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x48, 0x65, + 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2a, 0x87, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x50, + 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, + 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, + 0x50, 0x45, 0x4e, 0x53, 0x53, 0x48, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, + 0x50, 0x45, 0x4e, 0x53, 0x53, 0x48, 0x5f, 0x45, 0x49, 0x43, 0x45, 0x10, 0x07, 0x2a, 0x4d, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, + 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, 0x45, + 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10, 0x02, 0x2a, 0xc0, 0x0f, 0x0a, + 0x10, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, + 0x45, 0x53, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, + 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, + 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, - 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x2b, 0x0a, - 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, - 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x06, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, - 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x52, - 0x44, 0x53, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, - 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, + 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, + 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x32, 0x0a, 0x2e, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, + 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, + 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, + 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x06, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x43, - 0x50, 0x10, 0x09, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, - 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x0a, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, - 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, - 0x52, 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x10, 0x0c, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, + 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, + 0x5f, 0x52, 0x44, 0x53, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x08, 0x12, 0x25, + 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x43, 0x50, 0x10, 0x09, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, + 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x0a, 0x12, 0x2c, 0x0a, 0x28, + 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, + 0x52, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, - 0x45, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0d, - 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, - 0x45, 0x44, 0x49, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, - 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x0f, 0x12, - 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, - 0x53, 0x51, 0x4c, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x10, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, - 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x11, 0x12, 0x3b, 0x0a, 0x37, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, - 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, - 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x4c, 0x45, - 0x53, 0x53, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, - 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, - 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, - 0x45, 0x10, 0x13, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x4f, 0x44, 0x42, 0x10, 0x14, 0x12, 0x32, 0x0a, 0x2e, + 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, + 0x53, 0x5f, 0x52, 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x10, 0x0c, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x53, 0x41, - 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, 0x10, 0x15, - 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, - 0x41, 0x53, 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, - 0x53, 0x54, 0x45, 0x44, 0x10, 0x16, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x53, 0x45, 0x41, 0x52, - 0x43, 0x48, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x17, - 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, - 0x45, 0x44, 0x49, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, - 0x10, 0x18, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, + 0x52, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, + 0x10, 0x0d, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x44, 0x42, 0x10, - 0x19, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, + 0x45, 0x44, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, + 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x50, 0x10, + 0x0f, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, - 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, - 0x45, 0x10, 0x1a, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, - 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1b, 0x12, 0x2a, 0x0a, - 0x26, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, - 0x4c, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x44, 0x49, 0x53, - 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1d, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, + 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x10, 0x12, 0x2c, 0x0a, 0x28, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x11, 0x12, 0x3b, 0x0a, 0x37, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x5f, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x53, 0x4f, 0x46, 0x54, 0x10, 0x1e, 0x12, 0x36, 0x0a, - 0x32, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x43, 0x4b, - 0x52, 0x4f, 0x41, 0x43, 0x48, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, - 0x54, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, + 0x5f, 0x52, 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, + 0x4c, 0x45, 0x53, 0x53, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, + 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x41, 0x5a, + 0x55, 0x52, 0x45, 0x10, 0x13, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x41, 0x54, 0x4c, 0x41, - 0x53, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, + 0x41, 0x53, 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x4f, 0x44, 0x42, 0x10, 0x14, 0x12, 0x32, + 0x0a, 0x2e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x53, + 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, + 0x10, 0x15, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, + 0x5f, 0x43, 0x41, 0x53, 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, + 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x16, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x53, 0x45, + 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, + 0x10, 0x17, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, + 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, 0x43, + 0x48, 0x45, 0x10, 0x18, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, + 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x44, + 0x42, 0x10, 0x19, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x57, 0x46, 0x4c, 0x41, 0x4b, 0x45, 0x10, 0x21, 0x12, 0x2c, 0x0a, - 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, - 0x52, 0x44, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, 0x22, 0x12, 0x34, 0x0a, 0x30, 0x44, + 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x41, + 0x43, 0x48, 0x45, 0x10, 0x1a, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, + 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, + 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1b, 0x12, + 0x2a, 0x0a, 0x26, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, + 0x53, 0x51, 0x4c, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x48, 0x49, - 0x47, 0x48, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, - 0x23, 0x12, 0x37, 0x0a, 0x33, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x47, 0x49, - 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1d, 0x12, 0x32, 0x0a, 0x2e, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x5f, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x53, 0x4f, 0x46, 0x54, 0x10, 0x1e, 0x12, + 0x36, 0x0a, 0x32, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x4f, + 0x43, 0x4b, 0x52, 0x4f, 0x41, 0x43, 0x48, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, + 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x41, 0x54, + 0x4c, 0x41, 0x53, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, + 0x41, 0x53, 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x57, 0x46, 0x4c, 0x41, 0x4b, 0x45, 0x10, 0x21, 0x12, + 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, + 0x45, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, 0x22, 0x12, 0x34, 0x0a, + 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, + 0x48, 0x49, 0x47, 0x48, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, + 0x59, 0x10, 0x23, 0x12, 0x37, 0x0a, 0x33, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x52, 0x45, + 0x47, 0x49, 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, 0x12, 0x26, 0x0a, 0x22, + 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x43, 0x32, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x26, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, + 0x43, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, + 0x50, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x41, 0x44, 0x10, 0x27, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x53, 0x41, 0x4d, 0x4c, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x43, 0x32, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x41, 0x4e, 0x43, 0x45, 0x10, 0x26, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, - 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x5f, - 0x4e, 0x4f, 0x4e, 0x5f, 0x41, 0x44, 0x10, 0x27, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, - 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x45, 0x4b, 0x53, 0x10, 0x28, 0x12, 0x2d, - 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x41, 0x57, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x45, 0x10, 0x29, 0x2a, 0xa3, 0x01, - 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1b, - 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x44, - 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, - 0x44, 0x10, 0x04, 0x2a, 0xc1, 0x02, 0x0a, 0x03, 0x43, 0x54, 0x41, 0x12, 0x13, 0x0a, 0x0f, 0x43, - 0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, - 0x02, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, - 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, - 0x41, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55, 0x4d, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, - 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, - 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, - 0x43, 0x54, 0x41, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x4e, 0x4e, - 0x45, 0x52, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x42, 0x49, 0x4c, 0x4c, - 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x07, 0x12, 0x13, 0x0a, - 0x0f, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, - 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, - 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x1e, 0x0a, - 0x1a, 0x43, 0x54, 0x41, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x41, 0x55, - 0x44, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x0a, 0x12, 0x16, 0x0a, - 0x12, 0x43, 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, - 0x59, 0x4e, 0x43, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x54, 0x41, 0x5f, 0x45, 0x4e, 0x54, - 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x2a, 0x82, 0x08, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, 0x69, 0x6e, - 0x64, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x24, 0x0a, - 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, - 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x4f, 0x49, 0x44, - 0x43, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, - 0x41, 0x47, 0x45, 0x52, 0x44, 0x55, 0x54, 0x59, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x04, 0x12, 0x20, 0x0a, - 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, - 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x49, 0x52, 0x41, 0x10, 0x05, 0x12, - 0x23, 0x0a, 0x1f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, - 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x52, 0x44, 0x10, 0x06, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x4d, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4d, 0x4f, 0x53, 0x54, 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, + 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x45, 0x4b, 0x53, 0x10, 0x28, + 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x45, 0x10, 0x29, 0x2a, + 0xa3, 0x01, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, + 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, + 0x15, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x42, 0x4f, 0x52, + 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0xc1, 0x02, 0x0a, 0x03, 0x43, 0x54, 0x41, 0x12, 0x13, 0x0a, + 0x0f, 0x43, 0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x43, + 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, + 0x41, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, + 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, + 0x43, 0x54, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55, 0x4d, 0x5f, 0x53, 0x55, 0x50, 0x50, + 0x4f, 0x52, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x54, 0x52, 0x55, + 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x05, 0x12, 0x16, + 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x42, 0x41, + 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x42, 0x49, + 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x07, 0x12, + 0x13, 0x0a, 0x0f, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, + 0x53, 0x54, 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, + 0x1e, 0x0a, 0x1a, 0x43, 0x54, 0x41, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, + 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x0a, 0x12, + 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, 0x52, + 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x54, 0x41, 0x5f, 0x45, + 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x2a, 0x82, 0x08, 0x0a, 0x15, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, - 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x53, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, - 0x10, 0x08, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x50, - 0x53, 0x47, 0x45, 0x4e, 0x49, 0x45, 0x10, 0x09, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x10, 0x0a, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, + 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, + 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x4f, + 0x49, 0x44, 0x43, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x50, 0x41, 0x47, 0x45, 0x52, 0x44, 0x55, 0x54, 0x59, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, - 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, - 0x49, 0x44, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x04, 0x12, + 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, + 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x49, 0x52, 0x41, 0x10, + 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x53, + 0x43, 0x4f, 0x52, 0x44, 0x10, 0x06, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4d, 0x4f, 0x53, 0x54, 0x10, 0x07, 0x12, 0x24, + 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x53, 0x5f, 0x54, 0x45, 0x41, + 0x4d, 0x53, 0x10, 0x08, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, - 0x42, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0d, 0x12, 0x2f, 0x0a, 0x2b, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, - 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, - 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x43, 0x49, 0x10, 0x0e, 0x12, 0x2d, 0x0a, 0x29, + 0x4f, 0x50, 0x53, 0x47, 0x45, 0x4e, 0x49, 0x45, 0x10, 0x09, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x10, 0x0a, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, - 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, - 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, 0x0f, 0x12, 0x2e, 0x0a, 0x2a, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, - 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, - 0x44, 0x5f, 0x4a, 0x45, 0x4e, 0x4b, 0x49, 0x4e, 0x53, 0x10, 0x10, 0x12, 0x2e, 0x0a, 0x2a, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, - 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, - 0x44, 0x5f, 0x41, 0x4e, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x2a, 0x0a, 0x26, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, - 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, - 0x44, 0x5f, 0x41, 0x57, 0x53, 0x10, 0x12, 0x12, 0x2a, 0x0a, 0x26, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x43, - 0x50, 0x10, 0x13, 0x12, 0x2c, 0x0a, 0x28, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, - 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, - 0x14, 0x12, 0x30, 0x0a, 0x2c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, - 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, 0x4c, 0x49, 0x46, - 0x54, 0x10, 0x15, 0x12, 0x31, 0x0a, 0x2d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, - 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, - 0x45, 0x54, 0x45, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x0b, 0x12, 0x26, + 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, + 0x45, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x17, 0x2a, 0x88, 0x01, 0x0a, - 0x12, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, - 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, - 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, - 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, 0xa0, 0x01, 0x0a, 0x1b, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x45, 0x41, 0x54, - 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x46, 0x45, 0x41, 0x54, 0x55, - 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, - 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x82, 0x01, 0x0a, 0x0c, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x19, - 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, - 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x4a, - 0x41, 0x4d, 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, - 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, - 0x32, 0xb4, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, - 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5b, 0x0a, 0x0c, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, - 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, + 0x48, 0x55, 0x42, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0d, 0x12, 0x2f, 0x0a, + 0x2b, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x43, 0x49, 0x10, 0x0e, 0x12, 0x2d, + 0x0a, 0x29, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, + 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, 0x0f, 0x12, 0x2e, 0x0a, + 0x2a, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x4a, 0x45, 0x4e, 0x4b, 0x49, 0x4e, 0x53, 0x10, 0x10, 0x12, 0x2e, 0x0a, + 0x2a, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x4e, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x2a, 0x0a, + 0x26, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x10, 0x12, 0x12, 0x2a, 0x0a, 0x26, 0x49, 0x4e, 0x54, + 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, + 0x47, 0x43, 0x50, 0x10, 0x13, 0x12, 0x2c, 0x0a, 0x28, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x5a, 0x55, 0x52, + 0x45, 0x10, 0x14, 0x12, 0x30, 0x0a, 0x2c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, + 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, 0x4c, + 0x49, 0x46, 0x54, 0x10, 0x15, 0x12, 0x31, 0x0a, 0x2d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, + 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, + 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x17, 0x2a, 0x88, + 0x01, 0x0a, 0x12, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x45, + 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, + 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, 0x0a, 0x07, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, + 0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, + 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, 0xa0, 0x01, 0x0a, 0x1b, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x45, + 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x46, 0x45, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, + 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x82, 0x01, + 0x0a, 0x0c, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, + 0x0a, 0x19, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, + 0x24, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, + 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4c, 0x49, 0x43, 0x45, 0x4e, + 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x53, 0x41, 0x47, 0x45, + 0x10, 0x02, 0x32, 0xb4, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x5b, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, - 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x42, 0x0d, - 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, - 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xa2, 0x02, 0x03, 0x50, - 0x58, 0x58, 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5b, 0x0a, 0x0c, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, 0x01, 0x0a, 0x12, 0x63, 0x6f, + 0x6d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x42, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, + 0x6f, 0x2f, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3b, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xa2, 0x02, + 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x3a, 0x3a, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10167,7 +10267,7 @@ func file_prehog_v1alpha_teleport_proto_rawDescGZIP() []byte { } var file_prehog_v1alpha_teleport_proto_enumTypes = make([]protoimpl.EnumInfo, 13) -var file_prehog_v1alpha_teleport_proto_msgTypes = make([]protoimpl.MessageInfo, 94) +var file_prehog_v1alpha_teleport_proto_msgTypes = make([]protoimpl.MessageInfo, 95) var file_prehog_v1alpha_teleport_proto_goTypes = []any{ (ResourceKind)(0), // 0: prehog.v1alpha.ResourceKind (UserKind)(0), // 1: prehog.v1alpha.UserKind @@ -10221,63 +10321,64 @@ var file_prehog_v1alpha_teleport_proto_goTypes = []any{ (*UIDiscoverEC2InstanceSelectionEvent)(nil), // 49: prehog.v1alpha.UIDiscoverEC2InstanceSelectionEvent (*UIDiscoverDeployEICEEvent)(nil), // 50: prehog.v1alpha.UIDiscoverDeployEICEEvent (*UIDiscoverCreateNodeEvent)(nil), // 51: prehog.v1alpha.UIDiscoverCreateNodeEvent - (*UIDiscoverDatabaseConfigureIAMPolicyEvent)(nil), // 52: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent - (*UIDiscoverPrincipalsConfigureEvent)(nil), // 53: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent - (*UIDiscoverTestConnectionEvent)(nil), // 54: prehog.v1alpha.UIDiscoverTestConnectionEvent - (*UIDiscoverCompletedEvent)(nil), // 55: prehog.v1alpha.UIDiscoverCompletedEvent - (*RoleCreateEvent)(nil), // 56: prehog.v1alpha.RoleCreateEvent - (*BotCreateEvent)(nil), // 57: prehog.v1alpha.BotCreateEvent - (*BotJoinEvent)(nil), // 58: prehog.v1alpha.BotJoinEvent - (*UICreateNewRoleClickEvent)(nil), // 59: prehog.v1alpha.UICreateNewRoleClickEvent - (*UICreateNewRoleSaveClickEvent)(nil), // 60: prehog.v1alpha.UICreateNewRoleSaveClickEvent - (*UICreateNewRoleCancelClickEvent)(nil), // 61: prehog.v1alpha.UICreateNewRoleCancelClickEvent - (*UICreateNewRoleViewDocumentationClickEvent)(nil), // 62: prehog.v1alpha.UICreateNewRoleViewDocumentationClickEvent - (*UICallToActionClickEvent)(nil), // 63: prehog.v1alpha.UICallToActionClickEvent - (*KubeRequestEvent)(nil), // 64: prehog.v1alpha.KubeRequestEvent - (*SFTPEvent)(nil), // 65: prehog.v1alpha.SFTPEvent - (*AgentMetadataEvent)(nil), // 66: prehog.v1alpha.AgentMetadataEvent - (*AssistCompletionEvent)(nil), // 67: prehog.v1alpha.AssistCompletionEvent - (*AssistExecutionEvent)(nil), // 68: prehog.v1alpha.AssistExecutionEvent - (*AssistNewConversationEvent)(nil), // 69: prehog.v1alpha.AssistNewConversationEvent - (*AssistAccessRequestEvent)(nil), // 70: prehog.v1alpha.AssistAccessRequestEvent - (*AssistActionEvent)(nil), // 71: prehog.v1alpha.AssistActionEvent - (*AccessListMetadata)(nil), // 72: prehog.v1alpha.AccessListMetadata - (*AccessListCreateEvent)(nil), // 73: prehog.v1alpha.AccessListCreateEvent - (*AccessListUpdateEvent)(nil), // 74: prehog.v1alpha.AccessListUpdateEvent - (*AccessListDeleteEvent)(nil), // 75: prehog.v1alpha.AccessListDeleteEvent - (*AccessListMemberCreateEvent)(nil), // 76: prehog.v1alpha.AccessListMemberCreateEvent - (*AccessListMemberUpdateEvent)(nil), // 77: prehog.v1alpha.AccessListMemberUpdateEvent - (*AccessListMemberDeleteEvent)(nil), // 78: prehog.v1alpha.AccessListMemberDeleteEvent - (*AccessListGrantsToUserEvent)(nil), // 79: prehog.v1alpha.AccessListGrantsToUserEvent - (*AccessListReviewCreateEvent)(nil), // 80: prehog.v1alpha.AccessListReviewCreateEvent - (*AccessListReviewDeleteEvent)(nil), // 81: prehog.v1alpha.AccessListReviewDeleteEvent - (*AccessListReviewComplianceEvent)(nil), // 82: prehog.v1alpha.AccessListReviewComplianceEvent - (*IntegrationEnrollMetadata)(nil), // 83: prehog.v1alpha.IntegrationEnrollMetadata - (*UIIntegrationEnrollStartEvent)(nil), // 84: prehog.v1alpha.UIIntegrationEnrollStartEvent - (*UIIntegrationEnrollCompleteEvent)(nil), // 85: prehog.v1alpha.UIIntegrationEnrollCompleteEvent - (*EditorChangeEvent)(nil), // 86: prehog.v1alpha.EditorChangeEvent - (*DeviceAuthenticateEvent)(nil), // 87: prehog.v1alpha.DeviceAuthenticateEvent - (*DeviceEnrollEvent)(nil), // 88: prehog.v1alpha.DeviceEnrollEvent - (*FeatureRecommendationEvent)(nil), // 89: prehog.v1alpha.FeatureRecommendationEvent - (*LicenseLimitEvent)(nil), // 90: prehog.v1alpha.LicenseLimitEvent - (*DesktopDirectoryShareEvent)(nil), // 91: prehog.v1alpha.DesktopDirectoryShareEvent - (*DesktopClipboardEvent)(nil), // 92: prehog.v1alpha.DesktopClipboardEvent - (*TAGExecuteQueryEvent)(nil), // 93: prehog.v1alpha.TAGExecuteQueryEvent - (*ExternalAuditStorageAuthenticateEvent)(nil), // 94: prehog.v1alpha.ExternalAuditStorageAuthenticateEvent - (*SecurityReportGetResultEvent)(nil), // 95: prehog.v1alpha.SecurityReportGetResultEvent - (*AuditQueryRunEvent)(nil), // 96: prehog.v1alpha.AuditQueryRunEvent - (*DiscoveryFetchEvent)(nil), // 97: prehog.v1alpha.DiscoveryFetchEvent - (*OktaAccessListSyncEvent)(nil), // 98: prehog.v1alpha.OktaAccessListSyncEvent - (*DatabaseUserCreatedEvent)(nil), // 99: prehog.v1alpha.DatabaseUserCreatedEvent - (*DatabaseUserPermissionsUpdateEvent)(nil), // 100: prehog.v1alpha.DatabaseUserPermissionsUpdateEvent - (*SubmitEventRequest)(nil), // 101: prehog.v1alpha.SubmitEventRequest - (*SubmitEventResponse)(nil), // 102: prehog.v1alpha.SubmitEventResponse - (*SubmitEventsRequest)(nil), // 103: prehog.v1alpha.SubmitEventsRequest - (*SubmitEventsResponse)(nil), // 104: prehog.v1alpha.SubmitEventsResponse - (*HelloTeleportRequest)(nil), // 105: prehog.v1alpha.HelloTeleportRequest - (*HelloTeleportResponse)(nil), // 106: prehog.v1alpha.HelloTeleportResponse - (*durationpb.Duration)(nil), // 107: google.protobuf.Duration - (*timestamppb.Timestamp)(nil), // 108: google.protobuf.Timestamp + (*UIDiscoverCreateAppServerEvent)(nil), // 52: prehog.v1alpha.UIDiscoverCreateAppServerEvent + (*UIDiscoverDatabaseConfigureIAMPolicyEvent)(nil), // 53: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent + (*UIDiscoverPrincipalsConfigureEvent)(nil), // 54: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent + (*UIDiscoverTestConnectionEvent)(nil), // 55: prehog.v1alpha.UIDiscoverTestConnectionEvent + (*UIDiscoverCompletedEvent)(nil), // 56: prehog.v1alpha.UIDiscoverCompletedEvent + (*RoleCreateEvent)(nil), // 57: prehog.v1alpha.RoleCreateEvent + (*BotCreateEvent)(nil), // 58: prehog.v1alpha.BotCreateEvent + (*BotJoinEvent)(nil), // 59: prehog.v1alpha.BotJoinEvent + (*UICreateNewRoleClickEvent)(nil), // 60: prehog.v1alpha.UICreateNewRoleClickEvent + (*UICreateNewRoleSaveClickEvent)(nil), // 61: prehog.v1alpha.UICreateNewRoleSaveClickEvent + (*UICreateNewRoleCancelClickEvent)(nil), // 62: prehog.v1alpha.UICreateNewRoleCancelClickEvent + (*UICreateNewRoleViewDocumentationClickEvent)(nil), // 63: prehog.v1alpha.UICreateNewRoleViewDocumentationClickEvent + (*UICallToActionClickEvent)(nil), // 64: prehog.v1alpha.UICallToActionClickEvent + (*KubeRequestEvent)(nil), // 65: prehog.v1alpha.KubeRequestEvent + (*SFTPEvent)(nil), // 66: prehog.v1alpha.SFTPEvent + (*AgentMetadataEvent)(nil), // 67: prehog.v1alpha.AgentMetadataEvent + (*AssistCompletionEvent)(nil), // 68: prehog.v1alpha.AssistCompletionEvent + (*AssistExecutionEvent)(nil), // 69: prehog.v1alpha.AssistExecutionEvent + (*AssistNewConversationEvent)(nil), // 70: prehog.v1alpha.AssistNewConversationEvent + (*AssistAccessRequestEvent)(nil), // 71: prehog.v1alpha.AssistAccessRequestEvent + (*AssistActionEvent)(nil), // 72: prehog.v1alpha.AssistActionEvent + (*AccessListMetadata)(nil), // 73: prehog.v1alpha.AccessListMetadata + (*AccessListCreateEvent)(nil), // 74: prehog.v1alpha.AccessListCreateEvent + (*AccessListUpdateEvent)(nil), // 75: prehog.v1alpha.AccessListUpdateEvent + (*AccessListDeleteEvent)(nil), // 76: prehog.v1alpha.AccessListDeleteEvent + (*AccessListMemberCreateEvent)(nil), // 77: prehog.v1alpha.AccessListMemberCreateEvent + (*AccessListMemberUpdateEvent)(nil), // 78: prehog.v1alpha.AccessListMemberUpdateEvent + (*AccessListMemberDeleteEvent)(nil), // 79: prehog.v1alpha.AccessListMemberDeleteEvent + (*AccessListGrantsToUserEvent)(nil), // 80: prehog.v1alpha.AccessListGrantsToUserEvent + (*AccessListReviewCreateEvent)(nil), // 81: prehog.v1alpha.AccessListReviewCreateEvent + (*AccessListReviewDeleteEvent)(nil), // 82: prehog.v1alpha.AccessListReviewDeleteEvent + (*AccessListReviewComplianceEvent)(nil), // 83: prehog.v1alpha.AccessListReviewComplianceEvent + (*IntegrationEnrollMetadata)(nil), // 84: prehog.v1alpha.IntegrationEnrollMetadata + (*UIIntegrationEnrollStartEvent)(nil), // 85: prehog.v1alpha.UIIntegrationEnrollStartEvent + (*UIIntegrationEnrollCompleteEvent)(nil), // 86: prehog.v1alpha.UIIntegrationEnrollCompleteEvent + (*EditorChangeEvent)(nil), // 87: prehog.v1alpha.EditorChangeEvent + (*DeviceAuthenticateEvent)(nil), // 88: prehog.v1alpha.DeviceAuthenticateEvent + (*DeviceEnrollEvent)(nil), // 89: prehog.v1alpha.DeviceEnrollEvent + (*FeatureRecommendationEvent)(nil), // 90: prehog.v1alpha.FeatureRecommendationEvent + (*LicenseLimitEvent)(nil), // 91: prehog.v1alpha.LicenseLimitEvent + (*DesktopDirectoryShareEvent)(nil), // 92: prehog.v1alpha.DesktopDirectoryShareEvent + (*DesktopClipboardEvent)(nil), // 93: prehog.v1alpha.DesktopClipboardEvent + (*TAGExecuteQueryEvent)(nil), // 94: prehog.v1alpha.TAGExecuteQueryEvent + (*ExternalAuditStorageAuthenticateEvent)(nil), // 95: prehog.v1alpha.ExternalAuditStorageAuthenticateEvent + (*SecurityReportGetResultEvent)(nil), // 96: prehog.v1alpha.SecurityReportGetResultEvent + (*AuditQueryRunEvent)(nil), // 97: prehog.v1alpha.AuditQueryRunEvent + (*DiscoveryFetchEvent)(nil), // 98: prehog.v1alpha.DiscoveryFetchEvent + (*OktaAccessListSyncEvent)(nil), // 99: prehog.v1alpha.OktaAccessListSyncEvent + (*DatabaseUserCreatedEvent)(nil), // 100: prehog.v1alpha.DatabaseUserCreatedEvent + (*DatabaseUserPermissionsUpdateEvent)(nil), // 101: prehog.v1alpha.DatabaseUserPermissionsUpdateEvent + (*SubmitEventRequest)(nil), // 102: prehog.v1alpha.SubmitEventRequest + (*SubmitEventResponse)(nil), // 103: prehog.v1alpha.SubmitEventResponse + (*SubmitEventsRequest)(nil), // 104: prehog.v1alpha.SubmitEventsRequest + (*SubmitEventsResponse)(nil), // 105: prehog.v1alpha.SubmitEventsResponse + (*HelloTeleportRequest)(nil), // 106: prehog.v1alpha.HelloTeleportRequest + (*HelloTeleportResponse)(nil), // 107: prehog.v1alpha.HelloTeleportResponse + (*durationpb.Duration)(nil), // 108: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 109: google.protobuf.Timestamp } var file_prehog_v1alpha_teleport_proto_depIdxs = []int32{ 17, // 0: prehog.v1alpha.ResourceCreateEvent.database:type_name -> prehog.v1alpha.DiscoveredDatabaseMetadata @@ -10285,7 +10386,7 @@ var file_prehog_v1alpha_teleport_proto_depIdxs = []int32{ 20, // 2: prehog.v1alpha.SessionStartEvent.database:type_name -> prehog.v1alpha.SessionStartDatabaseMetadata 21, // 3: prehog.v1alpha.SessionStartEvent.desktop:type_name -> prehog.v1alpha.SessionStartDesktopMetadata 1, // 4: prehog.v1alpha.SessionStartEvent.user_kind:type_name -> prehog.v1alpha.UserKind - 107, // 5: prehog.v1alpha.UserCertificateIssuedEvent.ttl:type_name -> google.protobuf.Duration + 108, // 5: prehog.v1alpha.UserCertificateIssuedEvent.ttl:type_name -> google.protobuf.Duration 1, // 6: prehog.v1alpha.SPIFFESVIDIssuedEvent.user_kind:type_name -> prehog.v1alpha.UserKind 2, // 7: prehog.v1alpha.DiscoverResourceMetadata.resource:type_name -> prehog.v1alpha.DiscoverResource 3, // 8: prehog.v1alpha.DiscoverStepStatus.status:type_name -> prehog.v1alpha.DiscoverStatus @@ -10336,132 +10437,136 @@ var file_prehog_v1alpha_teleport_proto_depIdxs = []int32{ 34, // 53: prehog.v1alpha.UIDiscoverCreateNodeEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata 35, // 54: prehog.v1alpha.UIDiscoverCreateNodeEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata 36, // 55: prehog.v1alpha.UIDiscoverCreateNodeEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus - 34, // 56: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata - 35, // 57: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata - 36, // 58: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus - 34, // 59: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata - 35, // 60: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata - 36, // 61: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus - 34, // 62: prehog.v1alpha.UIDiscoverTestConnectionEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata - 35, // 63: prehog.v1alpha.UIDiscoverTestConnectionEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata - 36, // 64: prehog.v1alpha.UIDiscoverTestConnectionEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus - 34, // 65: prehog.v1alpha.UIDiscoverCompletedEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata - 35, // 66: prehog.v1alpha.UIDiscoverCompletedEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata - 36, // 67: prehog.v1alpha.UIDiscoverCompletedEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus - 4, // 68: prehog.v1alpha.UICallToActionClickEvent.cta:type_name -> prehog.v1alpha.CTA - 1, // 69: prehog.v1alpha.KubeRequestEvent.user_kind:type_name -> prehog.v1alpha.UserKind - 1, // 70: prehog.v1alpha.SFTPEvent.user_kind:type_name -> prehog.v1alpha.UserKind - 72, // 71: prehog.v1alpha.AccessListCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 72: prehog.v1alpha.AccessListUpdateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 73: prehog.v1alpha.AccessListDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 74: prehog.v1alpha.AccessListMemberCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 75: prehog.v1alpha.AccessListMemberUpdateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 76: prehog.v1alpha.AccessListMemberDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 77: prehog.v1alpha.AccessListReviewCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 72, // 78: prehog.v1alpha.AccessListReviewDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata - 5, // 79: prehog.v1alpha.IntegrationEnrollMetadata.kind:type_name -> prehog.v1alpha.IntegrationEnrollKind - 83, // 80: prehog.v1alpha.UIIntegrationEnrollStartEvent.metadata:type_name -> prehog.v1alpha.IntegrationEnrollMetadata - 83, // 81: prehog.v1alpha.UIIntegrationEnrollCompleteEvent.metadata:type_name -> prehog.v1alpha.IntegrationEnrollMetadata - 6, // 82: prehog.v1alpha.EditorChangeEvent.status:type_name -> prehog.v1alpha.EditorChangeStatus - 7, // 83: prehog.v1alpha.FeatureRecommendationEvent.feature:type_name -> prehog.v1alpha.Feature - 8, // 84: prehog.v1alpha.FeatureRecommendationEvent.feature_recommendation_status:type_name -> prehog.v1alpha.FeatureRecommendationStatus - 9, // 85: prehog.v1alpha.LicenseLimitEvent.license_limit:type_name -> prehog.v1alpha.LicenseLimit - 20, // 86: prehog.v1alpha.DatabaseUserCreatedEvent.database:type_name -> prehog.v1alpha.SessionStartDatabaseMetadata - 20, // 87: prehog.v1alpha.DatabaseUserPermissionsUpdateEvent.database:type_name -> prehog.v1alpha.SessionStartDatabaseMetadata - 108, // 88: prehog.v1alpha.SubmitEventRequest.timestamp:type_name -> google.protobuf.Timestamp - 13, // 89: prehog.v1alpha.SubmitEventRequest.user_login:type_name -> prehog.v1alpha.UserLoginEvent - 15, // 90: prehog.v1alpha.SubmitEventRequest.sso_create:type_name -> prehog.v1alpha.SSOCreateEvent - 16, // 91: prehog.v1alpha.SubmitEventRequest.resource_create:type_name -> prehog.v1alpha.ResourceCreateEvent - 19, // 92: prehog.v1alpha.SubmitEventRequest.session_start:type_name -> prehog.v1alpha.SessionStartEvent - 24, // 93: prehog.v1alpha.SubmitEventRequest.ui_banner_click:type_name -> prehog.v1alpha.UIBannerClickEvent - 25, // 94: prehog.v1alpha.SubmitEventRequest.ui_onboard_complete_go_to_dashboard_click:type_name -> prehog.v1alpha.UIOnboardCompleteGoToDashboardClickEvent - 26, // 95: prehog.v1alpha.SubmitEventRequest.ui_onboard_add_first_resource_click:type_name -> prehog.v1alpha.UIOnboardAddFirstResourceClickEvent - 27, // 96: prehog.v1alpha.SubmitEventRequest.ui_onboard_add_first_resource_later_click:type_name -> prehog.v1alpha.UIOnboardAddFirstResourceLaterClickEvent - 28, // 97: prehog.v1alpha.SubmitEventRequest.ui_onboard_set_credential_submit:type_name -> prehog.v1alpha.UIOnboardSetCredentialSubmitEvent - 29, // 98: prehog.v1alpha.SubmitEventRequest.ui_onboard_register_challenge_submit:type_name -> prehog.v1alpha.UIOnboardRegisterChallengeSubmitEvent - 31, // 99: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_continue_click:type_name -> prehog.v1alpha.UIRecoveryCodesContinueClickEvent - 32, // 100: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_copy_click:type_name -> prehog.v1alpha.UIRecoveryCodesCopyClickEvent - 33, // 101: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_print_click:type_name -> prehog.v1alpha.UIRecoveryCodesPrintClickEvent - 37, // 102: prehog.v1alpha.SubmitEventRequest.ui_discover_started_event:type_name -> prehog.v1alpha.UIDiscoverStartedEvent - 38, // 103: prehog.v1alpha.SubmitEventRequest.ui_discover_resource_selection_event:type_name -> prehog.v1alpha.UIDiscoverResourceSelectionEvent - 22, // 104: prehog.v1alpha.SubmitEventRequest.user_certificate_issued_event:type_name -> prehog.v1alpha.UserCertificateIssuedEvent - 19, // 105: prehog.v1alpha.SubmitEventRequest.session_start_v2:type_name -> prehog.v1alpha.SessionStartEvent - 42, // 106: prehog.v1alpha.SubmitEventRequest.ui_discover_deploy_service_event:type_name -> prehog.v1alpha.UIDiscoverDeployServiceEvent - 44, // 107: prehog.v1alpha.SubmitEventRequest.ui_discover_database_register_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseRegisterEvent - 45, // 108: prehog.v1alpha.SubmitEventRequest.ui_discover_database_configure_mtls_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseConfigureMTLSEvent - 46, // 109: prehog.v1alpha.SubmitEventRequest.ui_discover_desktop_active_directory_tools_install_event:type_name -> prehog.v1alpha.UIDiscoverDesktopActiveDirectoryToolsInstallEvent - 47, // 110: prehog.v1alpha.SubmitEventRequest.ui_discover_desktop_active_directory_configure_event:type_name -> prehog.v1alpha.UIDiscoverDesktopActiveDirectoryConfigureEvent - 48, // 111: prehog.v1alpha.SubmitEventRequest.ui_discover_auto_discovered_resources_event:type_name -> prehog.v1alpha.UIDiscoverAutoDiscoveredResourcesEvent - 52, // 112: prehog.v1alpha.SubmitEventRequest.ui_discover_database_configure_iam_policy_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent - 53, // 113: prehog.v1alpha.SubmitEventRequest.ui_discover_principals_configure_event:type_name -> prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent - 54, // 114: prehog.v1alpha.SubmitEventRequest.ui_discover_test_connection_event:type_name -> prehog.v1alpha.UIDiscoverTestConnectionEvent - 55, // 115: prehog.v1alpha.SubmitEventRequest.ui_discover_completed_event:type_name -> prehog.v1alpha.UIDiscoverCompletedEvent - 56, // 116: prehog.v1alpha.SubmitEventRequest.role_create:type_name -> prehog.v1alpha.RoleCreateEvent - 59, // 117: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_click:type_name -> prehog.v1alpha.UICreateNewRoleClickEvent - 60, // 118: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_save_click:type_name -> prehog.v1alpha.UICreateNewRoleSaveClickEvent - 61, // 119: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_cancel_click:type_name -> prehog.v1alpha.UICreateNewRoleCancelClickEvent - 62, // 120: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_view_documentation_click:type_name -> prehog.v1alpha.UICreateNewRoleViewDocumentationClickEvent - 64, // 121: prehog.v1alpha.SubmitEventRequest.kube_request:type_name -> prehog.v1alpha.KubeRequestEvent - 65, // 122: prehog.v1alpha.SubmitEventRequest.sftp:type_name -> prehog.v1alpha.SFTPEvent - 66, // 123: prehog.v1alpha.SubmitEventRequest.agent_metadata_event:type_name -> prehog.v1alpha.AgentMetadataEvent - 18, // 124: prehog.v1alpha.SubmitEventRequest.resource_heartbeat:type_name -> prehog.v1alpha.ResourceHeartbeatEvent - 39, // 125: prehog.v1alpha.SubmitEventRequest.ui_discover_integration_aws_oidc_connect_event:type_name -> prehog.v1alpha.UIDiscoverIntegrationAWSOIDCConnectEvent - 40, // 126: prehog.v1alpha.SubmitEventRequest.ui_discover_database_rds_enroll_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseRDSEnrollEvent - 63, // 127: prehog.v1alpha.SubmitEventRequest.ui_call_to_action_click_event:type_name -> prehog.v1alpha.UICallToActionClickEvent - 67, // 128: prehog.v1alpha.SubmitEventRequest.assist_completion:type_name -> prehog.v1alpha.AssistCompletionEvent - 84, // 129: prehog.v1alpha.SubmitEventRequest.ui_integration_enroll_start_event:type_name -> prehog.v1alpha.UIIntegrationEnrollStartEvent - 85, // 130: prehog.v1alpha.SubmitEventRequest.ui_integration_enroll_complete_event:type_name -> prehog.v1alpha.UIIntegrationEnrollCompleteEvent - 86, // 131: prehog.v1alpha.SubmitEventRequest.editor_change_event:type_name -> prehog.v1alpha.EditorChangeEvent - 57, // 132: prehog.v1alpha.SubmitEventRequest.bot_create:type_name -> prehog.v1alpha.BotCreateEvent - 30, // 133: prehog.v1alpha.SubmitEventRequest.ui_onboard_questionnaire_submit:type_name -> prehog.v1alpha.UIOnboardQuestionnaireSubmitEvent - 58, // 134: prehog.v1alpha.SubmitEventRequest.bot_join:type_name -> prehog.v1alpha.BotJoinEvent - 68, // 135: prehog.v1alpha.SubmitEventRequest.assist_execution:type_name -> prehog.v1alpha.AssistExecutionEvent - 69, // 136: prehog.v1alpha.SubmitEventRequest.assist_new_conversation:type_name -> prehog.v1alpha.AssistNewConversationEvent - 87, // 137: prehog.v1alpha.SubmitEventRequest.device_authenticate_event:type_name -> prehog.v1alpha.DeviceAuthenticateEvent - 89, // 138: prehog.v1alpha.SubmitEventRequest.feature_recommendation_event:type_name -> prehog.v1alpha.FeatureRecommendationEvent - 70, // 139: prehog.v1alpha.SubmitEventRequest.assist_access_request:type_name -> prehog.v1alpha.AssistAccessRequestEvent - 71, // 140: prehog.v1alpha.SubmitEventRequest.assist_action:type_name -> prehog.v1alpha.AssistActionEvent - 88, // 141: prehog.v1alpha.SubmitEventRequest.device_enroll_event:type_name -> prehog.v1alpha.DeviceEnrollEvent - 90, // 142: prehog.v1alpha.SubmitEventRequest.license_limit_event:type_name -> prehog.v1alpha.LicenseLimitEvent - 73, // 143: prehog.v1alpha.SubmitEventRequest.access_list_create:type_name -> prehog.v1alpha.AccessListCreateEvent - 74, // 144: prehog.v1alpha.SubmitEventRequest.access_list_update:type_name -> prehog.v1alpha.AccessListUpdateEvent - 75, // 145: prehog.v1alpha.SubmitEventRequest.access_list_delete:type_name -> prehog.v1alpha.AccessListDeleteEvent - 76, // 146: prehog.v1alpha.SubmitEventRequest.access_list_member_create:type_name -> prehog.v1alpha.AccessListMemberCreateEvent - 77, // 147: prehog.v1alpha.SubmitEventRequest.access_list_member_update:type_name -> prehog.v1alpha.AccessListMemberUpdateEvent - 78, // 148: prehog.v1alpha.SubmitEventRequest.access_list_member_delete:type_name -> prehog.v1alpha.AccessListMemberDeleteEvent - 79, // 149: prehog.v1alpha.SubmitEventRequest.access_list_grants_to_user:type_name -> prehog.v1alpha.AccessListGrantsToUserEvent - 49, // 150: prehog.v1alpha.SubmitEventRequest.ui_discover_ec2_instance_selection:type_name -> prehog.v1alpha.UIDiscoverEC2InstanceSelectionEvent - 50, // 151: prehog.v1alpha.SubmitEventRequest.ui_discover_deploy_eice:type_name -> prehog.v1alpha.UIDiscoverDeployEICEEvent - 51, // 152: prehog.v1alpha.SubmitEventRequest.ui_discover_create_node:type_name -> prehog.v1alpha.UIDiscoverCreateNodeEvent - 91, // 153: prehog.v1alpha.SubmitEventRequest.desktop_directory_share:type_name -> prehog.v1alpha.DesktopDirectoryShareEvent - 92, // 154: prehog.v1alpha.SubmitEventRequest.desktop_clipboard_transfer:type_name -> prehog.v1alpha.DesktopClipboardEvent - 93, // 155: prehog.v1alpha.SubmitEventRequest.tag_execute_query:type_name -> prehog.v1alpha.TAGExecuteQueryEvent - 94, // 156: prehog.v1alpha.SubmitEventRequest.external_audit_storage_authenticate:type_name -> prehog.v1alpha.ExternalAuditStorageAuthenticateEvent - 95, // 157: prehog.v1alpha.SubmitEventRequest.security_report_get_result:type_name -> prehog.v1alpha.SecurityReportGetResultEvent - 96, // 158: prehog.v1alpha.SubmitEventRequest.audit_query_run:type_name -> prehog.v1alpha.AuditQueryRunEvent - 97, // 159: prehog.v1alpha.SubmitEventRequest.discovery_fetch_event:type_name -> prehog.v1alpha.DiscoveryFetchEvent - 80, // 160: prehog.v1alpha.SubmitEventRequest.access_list_review_create:type_name -> prehog.v1alpha.AccessListReviewCreateEvent - 81, // 161: prehog.v1alpha.SubmitEventRequest.access_list_review_delete:type_name -> prehog.v1alpha.AccessListReviewDeleteEvent - 82, // 162: prehog.v1alpha.SubmitEventRequest.access_list_review_compliance:type_name -> prehog.v1alpha.AccessListReviewComplianceEvent - 14, // 163: prehog.v1alpha.SubmitEventRequest.mfa_authentication_event:type_name -> prehog.v1alpha.MFAAuthenticationEvent - 23, // 164: prehog.v1alpha.SubmitEventRequest.spiffe_svid_issued:type_name -> prehog.v1alpha.SPIFFESVIDIssuedEvent - 98, // 165: prehog.v1alpha.SubmitEventRequest.okta_access_list_sync:type_name -> prehog.v1alpha.OktaAccessListSyncEvent - 99, // 166: prehog.v1alpha.SubmitEventRequest.database_user_created:type_name -> prehog.v1alpha.DatabaseUserCreatedEvent - 100, // 167: prehog.v1alpha.SubmitEventRequest.database_user_permissions_updated:type_name -> prehog.v1alpha.DatabaseUserPermissionsUpdateEvent - 43, // 168: prehog.v1alpha.SubmitEventRequest.ui_discover_create_discovery_config:type_name -> prehog.v1alpha.UIDiscoverCreateDiscoveryConfigEvent - 41, // 169: prehog.v1alpha.SubmitEventRequest.ui_discover_kube_eks_enroll_event:type_name -> prehog.v1alpha.UIDiscoverKubeEKSEnrollEvent - 101, // 170: prehog.v1alpha.SubmitEventsRequest.events:type_name -> prehog.v1alpha.SubmitEventRequest - 101, // 171: prehog.v1alpha.TeleportReportingService.SubmitEvent:input_type -> prehog.v1alpha.SubmitEventRequest - 103, // 172: prehog.v1alpha.TeleportReportingService.SubmitEvents:input_type -> prehog.v1alpha.SubmitEventsRequest - 105, // 173: prehog.v1alpha.TeleportReportingService.HelloTeleport:input_type -> prehog.v1alpha.HelloTeleportRequest - 102, // 174: prehog.v1alpha.TeleportReportingService.SubmitEvent:output_type -> prehog.v1alpha.SubmitEventResponse - 104, // 175: prehog.v1alpha.TeleportReportingService.SubmitEvents:output_type -> prehog.v1alpha.SubmitEventsResponse - 106, // 176: prehog.v1alpha.TeleportReportingService.HelloTeleport:output_type -> prehog.v1alpha.HelloTeleportResponse - 174, // [174:177] is the sub-list for method output_type - 171, // [171:174] is the sub-list for method input_type - 171, // [171:171] is the sub-list for extension type_name - 171, // [171:171] is the sub-list for extension extendee - 0, // [0:171] is the sub-list for field type_name + 34, // 56: prehog.v1alpha.UIDiscoverCreateAppServerEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata + 35, // 57: prehog.v1alpha.UIDiscoverCreateAppServerEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata + 36, // 58: prehog.v1alpha.UIDiscoverCreateAppServerEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus + 34, // 59: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata + 35, // 60: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata + 36, // 61: prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus + 34, // 62: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata + 35, // 63: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata + 36, // 64: prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus + 34, // 65: prehog.v1alpha.UIDiscoverTestConnectionEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata + 35, // 66: prehog.v1alpha.UIDiscoverTestConnectionEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata + 36, // 67: prehog.v1alpha.UIDiscoverTestConnectionEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus + 34, // 68: prehog.v1alpha.UIDiscoverCompletedEvent.metadata:type_name -> prehog.v1alpha.DiscoverMetadata + 35, // 69: prehog.v1alpha.UIDiscoverCompletedEvent.resource:type_name -> prehog.v1alpha.DiscoverResourceMetadata + 36, // 70: prehog.v1alpha.UIDiscoverCompletedEvent.status:type_name -> prehog.v1alpha.DiscoverStepStatus + 4, // 71: prehog.v1alpha.UICallToActionClickEvent.cta:type_name -> prehog.v1alpha.CTA + 1, // 72: prehog.v1alpha.KubeRequestEvent.user_kind:type_name -> prehog.v1alpha.UserKind + 1, // 73: prehog.v1alpha.SFTPEvent.user_kind:type_name -> prehog.v1alpha.UserKind + 73, // 74: prehog.v1alpha.AccessListCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 75: prehog.v1alpha.AccessListUpdateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 76: prehog.v1alpha.AccessListDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 77: prehog.v1alpha.AccessListMemberCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 78: prehog.v1alpha.AccessListMemberUpdateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 79: prehog.v1alpha.AccessListMemberDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 80: prehog.v1alpha.AccessListReviewCreateEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 73, // 81: prehog.v1alpha.AccessListReviewDeleteEvent.metadata:type_name -> prehog.v1alpha.AccessListMetadata + 5, // 82: prehog.v1alpha.IntegrationEnrollMetadata.kind:type_name -> prehog.v1alpha.IntegrationEnrollKind + 84, // 83: prehog.v1alpha.UIIntegrationEnrollStartEvent.metadata:type_name -> prehog.v1alpha.IntegrationEnrollMetadata + 84, // 84: prehog.v1alpha.UIIntegrationEnrollCompleteEvent.metadata:type_name -> prehog.v1alpha.IntegrationEnrollMetadata + 6, // 85: prehog.v1alpha.EditorChangeEvent.status:type_name -> prehog.v1alpha.EditorChangeStatus + 7, // 86: prehog.v1alpha.FeatureRecommendationEvent.feature:type_name -> prehog.v1alpha.Feature + 8, // 87: prehog.v1alpha.FeatureRecommendationEvent.feature_recommendation_status:type_name -> prehog.v1alpha.FeatureRecommendationStatus + 9, // 88: prehog.v1alpha.LicenseLimitEvent.license_limit:type_name -> prehog.v1alpha.LicenseLimit + 20, // 89: prehog.v1alpha.DatabaseUserCreatedEvent.database:type_name -> prehog.v1alpha.SessionStartDatabaseMetadata + 20, // 90: prehog.v1alpha.DatabaseUserPermissionsUpdateEvent.database:type_name -> prehog.v1alpha.SessionStartDatabaseMetadata + 109, // 91: prehog.v1alpha.SubmitEventRequest.timestamp:type_name -> google.protobuf.Timestamp + 13, // 92: prehog.v1alpha.SubmitEventRequest.user_login:type_name -> prehog.v1alpha.UserLoginEvent + 15, // 93: prehog.v1alpha.SubmitEventRequest.sso_create:type_name -> prehog.v1alpha.SSOCreateEvent + 16, // 94: prehog.v1alpha.SubmitEventRequest.resource_create:type_name -> prehog.v1alpha.ResourceCreateEvent + 19, // 95: prehog.v1alpha.SubmitEventRequest.session_start:type_name -> prehog.v1alpha.SessionStartEvent + 24, // 96: prehog.v1alpha.SubmitEventRequest.ui_banner_click:type_name -> prehog.v1alpha.UIBannerClickEvent + 25, // 97: prehog.v1alpha.SubmitEventRequest.ui_onboard_complete_go_to_dashboard_click:type_name -> prehog.v1alpha.UIOnboardCompleteGoToDashboardClickEvent + 26, // 98: prehog.v1alpha.SubmitEventRequest.ui_onboard_add_first_resource_click:type_name -> prehog.v1alpha.UIOnboardAddFirstResourceClickEvent + 27, // 99: prehog.v1alpha.SubmitEventRequest.ui_onboard_add_first_resource_later_click:type_name -> prehog.v1alpha.UIOnboardAddFirstResourceLaterClickEvent + 28, // 100: prehog.v1alpha.SubmitEventRequest.ui_onboard_set_credential_submit:type_name -> prehog.v1alpha.UIOnboardSetCredentialSubmitEvent + 29, // 101: prehog.v1alpha.SubmitEventRequest.ui_onboard_register_challenge_submit:type_name -> prehog.v1alpha.UIOnboardRegisterChallengeSubmitEvent + 31, // 102: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_continue_click:type_name -> prehog.v1alpha.UIRecoveryCodesContinueClickEvent + 32, // 103: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_copy_click:type_name -> prehog.v1alpha.UIRecoveryCodesCopyClickEvent + 33, // 104: prehog.v1alpha.SubmitEventRequest.ui_recovery_codes_print_click:type_name -> prehog.v1alpha.UIRecoveryCodesPrintClickEvent + 37, // 105: prehog.v1alpha.SubmitEventRequest.ui_discover_started_event:type_name -> prehog.v1alpha.UIDiscoverStartedEvent + 38, // 106: prehog.v1alpha.SubmitEventRequest.ui_discover_resource_selection_event:type_name -> prehog.v1alpha.UIDiscoverResourceSelectionEvent + 22, // 107: prehog.v1alpha.SubmitEventRequest.user_certificate_issued_event:type_name -> prehog.v1alpha.UserCertificateIssuedEvent + 19, // 108: prehog.v1alpha.SubmitEventRequest.session_start_v2:type_name -> prehog.v1alpha.SessionStartEvent + 42, // 109: prehog.v1alpha.SubmitEventRequest.ui_discover_deploy_service_event:type_name -> prehog.v1alpha.UIDiscoverDeployServiceEvent + 44, // 110: prehog.v1alpha.SubmitEventRequest.ui_discover_database_register_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseRegisterEvent + 45, // 111: prehog.v1alpha.SubmitEventRequest.ui_discover_database_configure_mtls_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseConfigureMTLSEvent + 46, // 112: prehog.v1alpha.SubmitEventRequest.ui_discover_desktop_active_directory_tools_install_event:type_name -> prehog.v1alpha.UIDiscoverDesktopActiveDirectoryToolsInstallEvent + 47, // 113: prehog.v1alpha.SubmitEventRequest.ui_discover_desktop_active_directory_configure_event:type_name -> prehog.v1alpha.UIDiscoverDesktopActiveDirectoryConfigureEvent + 48, // 114: prehog.v1alpha.SubmitEventRequest.ui_discover_auto_discovered_resources_event:type_name -> prehog.v1alpha.UIDiscoverAutoDiscoveredResourcesEvent + 53, // 115: prehog.v1alpha.SubmitEventRequest.ui_discover_database_configure_iam_policy_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent + 54, // 116: prehog.v1alpha.SubmitEventRequest.ui_discover_principals_configure_event:type_name -> prehog.v1alpha.UIDiscoverPrincipalsConfigureEvent + 55, // 117: prehog.v1alpha.SubmitEventRequest.ui_discover_test_connection_event:type_name -> prehog.v1alpha.UIDiscoverTestConnectionEvent + 56, // 118: prehog.v1alpha.SubmitEventRequest.ui_discover_completed_event:type_name -> prehog.v1alpha.UIDiscoverCompletedEvent + 57, // 119: prehog.v1alpha.SubmitEventRequest.role_create:type_name -> prehog.v1alpha.RoleCreateEvent + 60, // 120: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_click:type_name -> prehog.v1alpha.UICreateNewRoleClickEvent + 61, // 121: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_save_click:type_name -> prehog.v1alpha.UICreateNewRoleSaveClickEvent + 62, // 122: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_cancel_click:type_name -> prehog.v1alpha.UICreateNewRoleCancelClickEvent + 63, // 123: prehog.v1alpha.SubmitEventRequest.ui_create_new_role_view_documentation_click:type_name -> prehog.v1alpha.UICreateNewRoleViewDocumentationClickEvent + 65, // 124: prehog.v1alpha.SubmitEventRequest.kube_request:type_name -> prehog.v1alpha.KubeRequestEvent + 66, // 125: prehog.v1alpha.SubmitEventRequest.sftp:type_name -> prehog.v1alpha.SFTPEvent + 67, // 126: prehog.v1alpha.SubmitEventRequest.agent_metadata_event:type_name -> prehog.v1alpha.AgentMetadataEvent + 18, // 127: prehog.v1alpha.SubmitEventRequest.resource_heartbeat:type_name -> prehog.v1alpha.ResourceHeartbeatEvent + 39, // 128: prehog.v1alpha.SubmitEventRequest.ui_discover_integration_aws_oidc_connect_event:type_name -> prehog.v1alpha.UIDiscoverIntegrationAWSOIDCConnectEvent + 40, // 129: prehog.v1alpha.SubmitEventRequest.ui_discover_database_rds_enroll_event:type_name -> prehog.v1alpha.UIDiscoverDatabaseRDSEnrollEvent + 64, // 130: prehog.v1alpha.SubmitEventRequest.ui_call_to_action_click_event:type_name -> prehog.v1alpha.UICallToActionClickEvent + 68, // 131: prehog.v1alpha.SubmitEventRequest.assist_completion:type_name -> prehog.v1alpha.AssistCompletionEvent + 85, // 132: prehog.v1alpha.SubmitEventRequest.ui_integration_enroll_start_event:type_name -> prehog.v1alpha.UIIntegrationEnrollStartEvent + 86, // 133: prehog.v1alpha.SubmitEventRequest.ui_integration_enroll_complete_event:type_name -> prehog.v1alpha.UIIntegrationEnrollCompleteEvent + 87, // 134: prehog.v1alpha.SubmitEventRequest.editor_change_event:type_name -> prehog.v1alpha.EditorChangeEvent + 58, // 135: prehog.v1alpha.SubmitEventRequest.bot_create:type_name -> prehog.v1alpha.BotCreateEvent + 30, // 136: prehog.v1alpha.SubmitEventRequest.ui_onboard_questionnaire_submit:type_name -> prehog.v1alpha.UIOnboardQuestionnaireSubmitEvent + 59, // 137: prehog.v1alpha.SubmitEventRequest.bot_join:type_name -> prehog.v1alpha.BotJoinEvent + 69, // 138: prehog.v1alpha.SubmitEventRequest.assist_execution:type_name -> prehog.v1alpha.AssistExecutionEvent + 70, // 139: prehog.v1alpha.SubmitEventRequest.assist_new_conversation:type_name -> prehog.v1alpha.AssistNewConversationEvent + 88, // 140: prehog.v1alpha.SubmitEventRequest.device_authenticate_event:type_name -> prehog.v1alpha.DeviceAuthenticateEvent + 90, // 141: prehog.v1alpha.SubmitEventRequest.feature_recommendation_event:type_name -> prehog.v1alpha.FeatureRecommendationEvent + 71, // 142: prehog.v1alpha.SubmitEventRequest.assist_access_request:type_name -> prehog.v1alpha.AssistAccessRequestEvent + 72, // 143: prehog.v1alpha.SubmitEventRequest.assist_action:type_name -> prehog.v1alpha.AssistActionEvent + 89, // 144: prehog.v1alpha.SubmitEventRequest.device_enroll_event:type_name -> prehog.v1alpha.DeviceEnrollEvent + 91, // 145: prehog.v1alpha.SubmitEventRequest.license_limit_event:type_name -> prehog.v1alpha.LicenseLimitEvent + 74, // 146: prehog.v1alpha.SubmitEventRequest.access_list_create:type_name -> prehog.v1alpha.AccessListCreateEvent + 75, // 147: prehog.v1alpha.SubmitEventRequest.access_list_update:type_name -> prehog.v1alpha.AccessListUpdateEvent + 76, // 148: prehog.v1alpha.SubmitEventRequest.access_list_delete:type_name -> prehog.v1alpha.AccessListDeleteEvent + 77, // 149: prehog.v1alpha.SubmitEventRequest.access_list_member_create:type_name -> prehog.v1alpha.AccessListMemberCreateEvent + 78, // 150: prehog.v1alpha.SubmitEventRequest.access_list_member_update:type_name -> prehog.v1alpha.AccessListMemberUpdateEvent + 79, // 151: prehog.v1alpha.SubmitEventRequest.access_list_member_delete:type_name -> prehog.v1alpha.AccessListMemberDeleteEvent + 80, // 152: prehog.v1alpha.SubmitEventRequest.access_list_grants_to_user:type_name -> prehog.v1alpha.AccessListGrantsToUserEvent + 49, // 153: prehog.v1alpha.SubmitEventRequest.ui_discover_ec2_instance_selection:type_name -> prehog.v1alpha.UIDiscoverEC2InstanceSelectionEvent + 50, // 154: prehog.v1alpha.SubmitEventRequest.ui_discover_deploy_eice:type_name -> prehog.v1alpha.UIDiscoverDeployEICEEvent + 51, // 155: prehog.v1alpha.SubmitEventRequest.ui_discover_create_node:type_name -> prehog.v1alpha.UIDiscoverCreateNodeEvent + 92, // 156: prehog.v1alpha.SubmitEventRequest.desktop_directory_share:type_name -> prehog.v1alpha.DesktopDirectoryShareEvent + 93, // 157: prehog.v1alpha.SubmitEventRequest.desktop_clipboard_transfer:type_name -> prehog.v1alpha.DesktopClipboardEvent + 94, // 158: prehog.v1alpha.SubmitEventRequest.tag_execute_query:type_name -> prehog.v1alpha.TAGExecuteQueryEvent + 95, // 159: prehog.v1alpha.SubmitEventRequest.external_audit_storage_authenticate:type_name -> prehog.v1alpha.ExternalAuditStorageAuthenticateEvent + 96, // 160: prehog.v1alpha.SubmitEventRequest.security_report_get_result:type_name -> prehog.v1alpha.SecurityReportGetResultEvent + 97, // 161: prehog.v1alpha.SubmitEventRequest.audit_query_run:type_name -> prehog.v1alpha.AuditQueryRunEvent + 98, // 162: prehog.v1alpha.SubmitEventRequest.discovery_fetch_event:type_name -> prehog.v1alpha.DiscoveryFetchEvent + 81, // 163: prehog.v1alpha.SubmitEventRequest.access_list_review_create:type_name -> prehog.v1alpha.AccessListReviewCreateEvent + 82, // 164: prehog.v1alpha.SubmitEventRequest.access_list_review_delete:type_name -> prehog.v1alpha.AccessListReviewDeleteEvent + 83, // 165: prehog.v1alpha.SubmitEventRequest.access_list_review_compliance:type_name -> prehog.v1alpha.AccessListReviewComplianceEvent + 14, // 166: prehog.v1alpha.SubmitEventRequest.mfa_authentication_event:type_name -> prehog.v1alpha.MFAAuthenticationEvent + 23, // 167: prehog.v1alpha.SubmitEventRequest.spiffe_svid_issued:type_name -> prehog.v1alpha.SPIFFESVIDIssuedEvent + 99, // 168: prehog.v1alpha.SubmitEventRequest.okta_access_list_sync:type_name -> prehog.v1alpha.OktaAccessListSyncEvent + 100, // 169: prehog.v1alpha.SubmitEventRequest.database_user_created:type_name -> prehog.v1alpha.DatabaseUserCreatedEvent + 101, // 170: prehog.v1alpha.SubmitEventRequest.database_user_permissions_updated:type_name -> prehog.v1alpha.DatabaseUserPermissionsUpdateEvent + 43, // 171: prehog.v1alpha.SubmitEventRequest.ui_discover_create_discovery_config:type_name -> prehog.v1alpha.UIDiscoverCreateDiscoveryConfigEvent + 41, // 172: prehog.v1alpha.SubmitEventRequest.ui_discover_kube_eks_enroll_event:type_name -> prehog.v1alpha.UIDiscoverKubeEKSEnrollEvent + 52, // 173: prehog.v1alpha.SubmitEventRequest.ui_discover_create_app_server_event:type_name -> prehog.v1alpha.UIDiscoverCreateAppServerEvent + 102, // 174: prehog.v1alpha.SubmitEventsRequest.events:type_name -> prehog.v1alpha.SubmitEventRequest + 102, // 175: prehog.v1alpha.TeleportReportingService.SubmitEvent:input_type -> prehog.v1alpha.SubmitEventRequest + 104, // 176: prehog.v1alpha.TeleportReportingService.SubmitEvents:input_type -> prehog.v1alpha.SubmitEventsRequest + 106, // 177: prehog.v1alpha.TeleportReportingService.HelloTeleport:input_type -> prehog.v1alpha.HelloTeleportRequest + 103, // 178: prehog.v1alpha.TeleportReportingService.SubmitEvent:output_type -> prehog.v1alpha.SubmitEventResponse + 105, // 179: prehog.v1alpha.TeleportReportingService.SubmitEvents:output_type -> prehog.v1alpha.SubmitEventsResponse + 107, // 180: prehog.v1alpha.TeleportReportingService.HelloTeleport:output_type -> prehog.v1alpha.HelloTeleportResponse + 178, // [178:181] is the sub-list for method output_type + 175, // [175:178] is the sub-list for method input_type + 175, // [175:175] is the sub-list for extension type_name + 175, // [175:175] is the sub-list for extension extendee + 0, // [0:175] is the sub-list for field type_name } func init() { file_prehog_v1alpha_teleport_proto_init() } @@ -10939,7 +11044,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*UIDiscoverDatabaseConfigureIAMPolicyEvent); i { + switch v := v.(*UIDiscoverCreateAppServerEvent); i { case 0: return &v.state case 1: @@ -10951,7 +11056,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*UIDiscoverPrincipalsConfigureEvent); i { + switch v := v.(*UIDiscoverDatabaseConfigureIAMPolicyEvent); i { case 0: return &v.state case 1: @@ -10963,7 +11068,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*UIDiscoverTestConnectionEvent); i { + switch v := v.(*UIDiscoverPrincipalsConfigureEvent); i { case 0: return &v.state case 1: @@ -10975,7 +11080,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*UIDiscoverCompletedEvent); i { + switch v := v.(*UIDiscoverTestConnectionEvent); i { case 0: return &v.state case 1: @@ -10987,7 +11092,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*RoleCreateEvent); i { + switch v := v.(*UIDiscoverCompletedEvent); i { case 0: return &v.state case 1: @@ -10999,7 +11104,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*BotCreateEvent); i { + switch v := v.(*RoleCreateEvent); i { case 0: return &v.state case 1: @@ -11011,7 +11116,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*BotJoinEvent); i { + switch v := v.(*BotCreateEvent); i { case 0: return &v.state case 1: @@ -11023,7 +11128,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*UICreateNewRoleClickEvent); i { + switch v := v.(*BotJoinEvent); i { case 0: return &v.state case 1: @@ -11035,7 +11140,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*UICreateNewRoleSaveClickEvent); i { + switch v := v.(*UICreateNewRoleClickEvent); i { case 0: return &v.state case 1: @@ -11047,7 +11152,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*UICreateNewRoleCancelClickEvent); i { + switch v := v.(*UICreateNewRoleSaveClickEvent); i { case 0: return &v.state case 1: @@ -11059,7 +11164,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*UICreateNewRoleViewDocumentationClickEvent); i { + switch v := v.(*UICreateNewRoleCancelClickEvent); i { case 0: return &v.state case 1: @@ -11071,7 +11176,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*UICallToActionClickEvent); i { + switch v := v.(*UICreateNewRoleViewDocumentationClickEvent); i { case 0: return &v.state case 1: @@ -11083,7 +11188,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*KubeRequestEvent); i { + switch v := v.(*UICallToActionClickEvent); i { case 0: return &v.state case 1: @@ -11095,7 +11200,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*SFTPEvent); i { + switch v := v.(*KubeRequestEvent); i { case 0: return &v.state case 1: @@ -11107,7 +11212,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*AgentMetadataEvent); i { + switch v := v.(*SFTPEvent); i { case 0: return &v.state case 1: @@ -11119,7 +11224,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*AssistCompletionEvent); i { + switch v := v.(*AgentMetadataEvent); i { case 0: return &v.state case 1: @@ -11131,7 +11236,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*AssistExecutionEvent); i { + switch v := v.(*AssistCompletionEvent); i { case 0: return &v.state case 1: @@ -11143,7 +11248,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*AssistNewConversationEvent); i { + switch v := v.(*AssistExecutionEvent); i { case 0: return &v.state case 1: @@ -11155,7 +11260,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*AssistAccessRequestEvent); i { + switch v := v.(*AssistNewConversationEvent); i { case 0: return &v.state case 1: @@ -11167,7 +11272,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*AssistActionEvent); i { + switch v := v.(*AssistAccessRequestEvent); i { case 0: return &v.state case 1: @@ -11179,7 +11284,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[59].Exporter = func(v any, i int) any { - switch v := v.(*AccessListMetadata); i { + switch v := v.(*AssistActionEvent); i { case 0: return &v.state case 1: @@ -11191,7 +11296,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[60].Exporter = func(v any, i int) any { - switch v := v.(*AccessListCreateEvent); i { + switch v := v.(*AccessListMetadata); i { case 0: return &v.state case 1: @@ -11203,7 +11308,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[61].Exporter = func(v any, i int) any { - switch v := v.(*AccessListUpdateEvent); i { + switch v := v.(*AccessListCreateEvent); i { case 0: return &v.state case 1: @@ -11215,7 +11320,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[62].Exporter = func(v any, i int) any { - switch v := v.(*AccessListDeleteEvent); i { + switch v := v.(*AccessListUpdateEvent); i { case 0: return &v.state case 1: @@ -11227,7 +11332,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[63].Exporter = func(v any, i int) any { - switch v := v.(*AccessListMemberCreateEvent); i { + switch v := v.(*AccessListDeleteEvent); i { case 0: return &v.state case 1: @@ -11239,7 +11344,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[64].Exporter = func(v any, i int) any { - switch v := v.(*AccessListMemberUpdateEvent); i { + switch v := v.(*AccessListMemberCreateEvent); i { case 0: return &v.state case 1: @@ -11251,7 +11356,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[65].Exporter = func(v any, i int) any { - switch v := v.(*AccessListMemberDeleteEvent); i { + switch v := v.(*AccessListMemberUpdateEvent); i { case 0: return &v.state case 1: @@ -11263,7 +11368,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[66].Exporter = func(v any, i int) any { - switch v := v.(*AccessListGrantsToUserEvent); i { + switch v := v.(*AccessListMemberDeleteEvent); i { case 0: return &v.state case 1: @@ -11275,7 +11380,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[67].Exporter = func(v any, i int) any { - switch v := v.(*AccessListReviewCreateEvent); i { + switch v := v.(*AccessListGrantsToUserEvent); i { case 0: return &v.state case 1: @@ -11287,7 +11392,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[68].Exporter = func(v any, i int) any { - switch v := v.(*AccessListReviewDeleteEvent); i { + switch v := v.(*AccessListReviewCreateEvent); i { case 0: return &v.state case 1: @@ -11299,7 +11404,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[69].Exporter = func(v any, i int) any { - switch v := v.(*AccessListReviewComplianceEvent); i { + switch v := v.(*AccessListReviewDeleteEvent); i { case 0: return &v.state case 1: @@ -11311,7 +11416,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[70].Exporter = func(v any, i int) any { - switch v := v.(*IntegrationEnrollMetadata); i { + switch v := v.(*AccessListReviewComplianceEvent); i { case 0: return &v.state case 1: @@ -11323,7 +11428,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[71].Exporter = func(v any, i int) any { - switch v := v.(*UIIntegrationEnrollStartEvent); i { + switch v := v.(*IntegrationEnrollMetadata); i { case 0: return &v.state case 1: @@ -11335,7 +11440,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[72].Exporter = func(v any, i int) any { - switch v := v.(*UIIntegrationEnrollCompleteEvent); i { + switch v := v.(*UIIntegrationEnrollStartEvent); i { case 0: return &v.state case 1: @@ -11347,7 +11452,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[73].Exporter = func(v any, i int) any { - switch v := v.(*EditorChangeEvent); i { + switch v := v.(*UIIntegrationEnrollCompleteEvent); i { case 0: return &v.state case 1: @@ -11359,7 +11464,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[74].Exporter = func(v any, i int) any { - switch v := v.(*DeviceAuthenticateEvent); i { + switch v := v.(*EditorChangeEvent); i { case 0: return &v.state case 1: @@ -11371,7 +11476,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[75].Exporter = func(v any, i int) any { - switch v := v.(*DeviceEnrollEvent); i { + switch v := v.(*DeviceAuthenticateEvent); i { case 0: return &v.state case 1: @@ -11383,7 +11488,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[76].Exporter = func(v any, i int) any { - switch v := v.(*FeatureRecommendationEvent); i { + switch v := v.(*DeviceEnrollEvent); i { case 0: return &v.state case 1: @@ -11395,7 +11500,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[77].Exporter = func(v any, i int) any { - switch v := v.(*LicenseLimitEvent); i { + switch v := v.(*FeatureRecommendationEvent); i { case 0: return &v.state case 1: @@ -11407,7 +11512,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[78].Exporter = func(v any, i int) any { - switch v := v.(*DesktopDirectoryShareEvent); i { + switch v := v.(*LicenseLimitEvent); i { case 0: return &v.state case 1: @@ -11419,7 +11524,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[79].Exporter = func(v any, i int) any { - switch v := v.(*DesktopClipboardEvent); i { + switch v := v.(*DesktopDirectoryShareEvent); i { case 0: return &v.state case 1: @@ -11431,7 +11536,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[80].Exporter = func(v any, i int) any { - switch v := v.(*TAGExecuteQueryEvent); i { + switch v := v.(*DesktopClipboardEvent); i { case 0: return &v.state case 1: @@ -11443,7 +11548,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[81].Exporter = func(v any, i int) any { - switch v := v.(*ExternalAuditStorageAuthenticateEvent); i { + switch v := v.(*TAGExecuteQueryEvent); i { case 0: return &v.state case 1: @@ -11455,7 +11560,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[82].Exporter = func(v any, i int) any { - switch v := v.(*SecurityReportGetResultEvent); i { + switch v := v.(*ExternalAuditStorageAuthenticateEvent); i { case 0: return &v.state case 1: @@ -11467,7 +11572,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[83].Exporter = func(v any, i int) any { - switch v := v.(*AuditQueryRunEvent); i { + switch v := v.(*SecurityReportGetResultEvent); i { case 0: return &v.state case 1: @@ -11479,7 +11584,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[84].Exporter = func(v any, i int) any { - switch v := v.(*DiscoveryFetchEvent); i { + switch v := v.(*AuditQueryRunEvent); i { case 0: return &v.state case 1: @@ -11491,7 +11596,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[85].Exporter = func(v any, i int) any { - switch v := v.(*OktaAccessListSyncEvent); i { + switch v := v.(*DiscoveryFetchEvent); i { case 0: return &v.state case 1: @@ -11503,7 +11608,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[86].Exporter = func(v any, i int) any { - switch v := v.(*DatabaseUserCreatedEvent); i { + switch v := v.(*OktaAccessListSyncEvent); i { case 0: return &v.state case 1: @@ -11515,7 +11620,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[87].Exporter = func(v any, i int) any { - switch v := v.(*DatabaseUserPermissionsUpdateEvent); i { + switch v := v.(*DatabaseUserCreatedEvent); i { case 0: return &v.state case 1: @@ -11527,7 +11632,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[88].Exporter = func(v any, i int) any { - switch v := v.(*SubmitEventRequest); i { + switch v := v.(*DatabaseUserPermissionsUpdateEvent); i { case 0: return &v.state case 1: @@ -11539,7 +11644,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[89].Exporter = func(v any, i int) any { - switch v := v.(*SubmitEventResponse); i { + switch v := v.(*SubmitEventRequest); i { case 0: return &v.state case 1: @@ -11551,7 +11656,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[90].Exporter = func(v any, i int) any { - switch v := v.(*SubmitEventsRequest); i { + switch v := v.(*SubmitEventResponse); i { case 0: return &v.state case 1: @@ -11563,7 +11668,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[91].Exporter = func(v any, i int) any { - switch v := v.(*SubmitEventsResponse); i { + switch v := v.(*SubmitEventsRequest); i { case 0: return &v.state case 1: @@ -11575,7 +11680,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[92].Exporter = func(v any, i int) any { - switch v := v.(*HelloTeleportRequest); i { + switch v := v.(*SubmitEventsResponse); i { case 0: return &v.state case 1: @@ -11587,6 +11692,18 @@ func file_prehog_v1alpha_teleport_proto_init() { } } file_prehog_v1alpha_teleport_proto_msgTypes[93].Exporter = func(v any, i int) any { + switch v := v.(*HelloTeleportRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_prehog_v1alpha_teleport_proto_msgTypes[94].Exporter = func(v any, i int) any { switch v := v.(*HelloTeleportResponse); i { case 0: return &v.state @@ -11599,7 +11716,7 @@ func file_prehog_v1alpha_teleport_proto_init() { } } } - file_prehog_v1alpha_teleport_proto_msgTypes[88].OneofWrappers = []any{ + file_prehog_v1alpha_teleport_proto_msgTypes[89].OneofWrappers = []any{ (*SubmitEventRequest_UserLogin)(nil), (*SubmitEventRequest_SsoCreate)(nil), (*SubmitEventRequest_ResourceCreate)(nil), @@ -11681,6 +11798,7 @@ func file_prehog_v1alpha_teleport_proto_init() { (*SubmitEventRequest_DatabaseUserPermissionsUpdated)(nil), (*SubmitEventRequest_UiDiscoverCreateDiscoveryConfig)(nil), (*SubmitEventRequest_UiDiscoverKubeEksEnrollEvent)(nil), + (*SubmitEventRequest_UiDiscoverCreateAppServerEvent)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -11688,7 +11806,7 @@ func file_prehog_v1alpha_teleport_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_prehog_v1alpha_teleport_proto_rawDesc, NumEnums: 13, - NumMessages: 94, + NumMessages: 95, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts index ae0ce02e01801..33e53086f5971 100644 --- a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts +++ b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts @@ -1072,6 +1072,25 @@ export interface UIDiscoverCreateNodeEvent { */ status?: DiscoverStepStatus; } +/** + * UIDiscoverCreateAppServerEvent is emitted when an app server is created. + * + * @generated from protobuf message prehog.v1alpha.UIDiscoverCreateAppServerEvent + */ +export interface UIDiscoverCreateAppServerEvent { + /** + * @generated from protobuf field: prehog.v1alpha.DiscoverMetadata metadata = 1; + */ + metadata?: DiscoverMetadata; + /** + * @generated from protobuf field: prehog.v1alpha.DiscoverResourceMetadata resource = 2; + */ + resource?: DiscoverResourceMetadata; + /** + * @generated from protobuf field: prehog.v1alpha.DiscoverStepStatus status = 3; + */ + status?: DiscoverStepStatus; +} /** * UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user is finished with the step that configures IAM policy for an RDS database. * @@ -2826,6 +2845,12 @@ export interface SubmitEventRequest { * @generated from protobuf field: prehog.v1alpha.UIDiscoverKubeEKSEnrollEvent ui_discover_kube_eks_enroll_event = 84; */ uiDiscoverKubeEksEnrollEvent: UIDiscoverKubeEKSEnrollEvent; + } | { + oneofKind: "uiDiscoverCreateAppServerEvent"; + /** + * @generated from protobuf field: prehog.v1alpha.UIDiscoverCreateAppServerEvent ui_discover_create_app_server_event = 85; + */ + uiDiscoverCreateAppServerEvent: UIDiscoverCreateAppServerEvent; } | { oneofKind: undefined; }; @@ -5795,6 +5820,66 @@ class UIDiscoverCreateNodeEvent$Type extends MessageType { + constructor() { + super("prehog.v1alpha.UIDiscoverCreateAppServerEvent", [ + { no: 1, name: "metadata", kind: "message", T: () => DiscoverMetadata }, + { no: 2, name: "resource", kind: "message", T: () => DiscoverResourceMetadata }, + { no: 3, name: "status", kind: "message", T: () => DiscoverStepStatus } + ]); + } + create(value?: PartialMessage): UIDiscoverCreateAppServerEvent { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: UIDiscoverCreateAppServerEvent): UIDiscoverCreateAppServerEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* prehog.v1alpha.DiscoverMetadata metadata */ 1: + message.metadata = DiscoverMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata); + break; + case /* prehog.v1alpha.DiscoverResourceMetadata resource */ 2: + message.resource = DiscoverResourceMetadata.internalBinaryRead(reader, reader.uint32(), options, message.resource); + break; + case /* prehog.v1alpha.DiscoverStepStatus status */ 3: + message.status = DiscoverStepStatus.internalBinaryRead(reader, reader.uint32(), options, message.status); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: UIDiscoverCreateAppServerEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* prehog.v1alpha.DiscoverMetadata metadata = 1; */ + if (message.metadata) + DiscoverMetadata.internalBinaryWrite(message.metadata, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* prehog.v1alpha.DiscoverResourceMetadata resource = 2; */ + if (message.resource) + DiscoverResourceMetadata.internalBinaryWrite(message.resource, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* prehog.v1alpha.DiscoverStepStatus status = 3; */ + if (message.status) + DiscoverStepStatus.internalBinaryWrite(message.status, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message prehog.v1alpha.UIDiscoverCreateAppServerEvent + */ +export const UIDiscoverCreateAppServerEvent = new UIDiscoverCreateAppServerEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods class UIDiscoverDatabaseConfigureIAMPolicyEvent$Type extends MessageType { constructor() { super("prehog.v1alpha.UIDiscoverDatabaseConfigureIAMPolicyEvent", [ @@ -8929,7 +9014,8 @@ class SubmitEventRequest$Type extends MessageType { { no: 81, name: "database_user_created", kind: "message", oneof: "event", T: () => DatabaseUserCreatedEvent }, { no: 82, name: "database_user_permissions_updated", kind: "message", oneof: "event", T: () => DatabaseUserPermissionsUpdateEvent }, { no: 83, name: "ui_discover_create_discovery_config", kind: "message", oneof: "event", T: () => UIDiscoverCreateDiscoveryConfigEvent }, - { no: 84, name: "ui_discover_kube_eks_enroll_event", kind: "message", oneof: "event", T: () => UIDiscoverKubeEKSEnrollEvent } + { no: 84, name: "ui_discover_kube_eks_enroll_event", kind: "message", oneof: "event", T: () => UIDiscoverKubeEKSEnrollEvent }, + { no: 85, name: "ui_discover_create_app_server_event", kind: "message", oneof: "event", T: () => UIDiscoverCreateAppServerEvent } ]); } create(value?: PartialMessage): SubmitEventRequest { @@ -9437,6 +9523,12 @@ class SubmitEventRequest$Type extends MessageType { uiDiscoverKubeEksEnrollEvent: UIDiscoverKubeEKSEnrollEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).uiDiscoverKubeEksEnrollEvent) }; break; + case /* prehog.v1alpha.UIDiscoverCreateAppServerEvent ui_discover_create_app_server_event */ 85: + message.event = { + oneofKind: "uiDiscoverCreateAppServerEvent", + uiDiscoverCreateAppServerEvent: UIDiscoverCreateAppServerEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).uiDiscoverCreateAppServerEvent) + }; + break; default: let u = options.readUnknownField; if (u === "throw") @@ -9698,6 +9790,9 @@ class SubmitEventRequest$Type extends MessageType { /* prehog.v1alpha.UIDiscoverKubeEKSEnrollEvent ui_discover_kube_eks_enroll_event = 84; */ if (message.event.oneofKind === "uiDiscoverKubeEksEnrollEvent") UIDiscoverKubeEKSEnrollEvent.internalBinaryWrite(message.event.uiDiscoverKubeEksEnrollEvent, writer.tag(84, WireType.LengthDelimited).fork(), options).join(); + /* prehog.v1alpha.UIDiscoverCreateAppServerEvent ui_discover_create_app_server_event = 85; */ + if (message.event.oneofKind === "uiDiscoverCreateAppServerEvent") + UIDiscoverCreateAppServerEvent.internalBinaryWrite(message.event.uiDiscoverCreateAppServerEvent, writer.tag(85, WireType.LengthDelimited).fork(), options).join(); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); diff --git a/lib/usagereporter/teleport/types.go b/lib/usagereporter/teleport/types.go index f94c635beb62b..e00950734ea59 100644 --- a/lib/usagereporter/teleport/types.go +++ b/lib/usagereporter/teleport/types.go @@ -1373,6 +1373,17 @@ func ConvertUsageEvent(event *usageeventsv1.UsageEventOneOf, userMD UserMetadata return nil, trace.Wrap(err) } + return ret, nil + case *usageeventsv1.UsageEventOneOf_UiDiscoverCreateAppServerEvent: + ret := &UIDiscoverCreateAppServerEvent{ + Metadata: discoverMetadataToPrehog(e.UiDiscoverCreateAppServerEvent.Metadata, userMD), + Resource: discoverResourceToPrehog(e.UiDiscoverCreateAppServerEvent.Resource), + Status: discoverStatusToPrehog(e.UiDiscoverCreateAppServerEvent.Status), + } + if err := ret.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return ret, nil case *usageeventsv1.UsageEventOneOf_UiDiscoverDatabaseConfigureIamPolicyEvent: ret := &UIDiscoverDatabaseConfigureIAMPolicyEvent{ diff --git a/lib/usagereporter/teleport/types_discover.go b/lib/usagereporter/teleport/types_discover.go index e748e71cafaa2..6d315fda69276 100644 --- a/lib/usagereporter/teleport/types_discover.go +++ b/lib/usagereporter/teleport/types_discover.go @@ -466,6 +466,28 @@ func (u *UIDiscoverCreateNodeEvent) Anonymize(a utils.Anonymizer) prehogv1a.Subm } } +// UIDiscoverCreateAppServerEvent is emitted when the node is created in Teleport. +type UIDiscoverCreateAppServerEvent prehogv1a.UIDiscoverCreateAppServerEvent + +func (u *UIDiscoverCreateAppServerEvent) CheckAndSetDefaults() error { + return trace.Wrap(validateDiscoverBaseEventFields(u.Metadata, u.Resource, u.Status)) +} + +func (u *UIDiscoverCreateAppServerEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEventRequest { + return prehogv1a.SubmitEventRequest{ + Event: &prehogv1a.SubmitEventRequest_UiDiscoverCreateAppServerEvent{ + UiDiscoverCreateAppServerEvent: &prehogv1a.UIDiscoverCreateAppServerEvent{ + Metadata: &prehogv1a.DiscoverMetadata{ + Id: u.Metadata.Id, + UserName: a.AnonymizeString(u.Metadata.UserName), + }, + Resource: u.Resource, + Status: u.Status, + }, + }, + } +} + // UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user configured IAM for RDS database // and proceeded to the next step. type UIDiscoverDatabaseConfigureIAMPolicyEvent prehogv1a.UIDiscoverDatabaseConfigureIAMPolicyEvent diff --git a/lib/usagereporter/teleport/usagereporter_test.go b/lib/usagereporter/teleport/usagereporter_test.go index e8b6e1b6c157b..775df4d03d3c9 100644 --- a/lib/usagereporter/teleport/usagereporter_test.go +++ b/lib/usagereporter/teleport/usagereporter_test.go @@ -312,6 +312,29 @@ func TestConvertUsageEvent(t *testing.T) { }, }}, }, + { + name: "discover create app server event", + event: &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiDiscoverCreateAppServerEvent{ + UiDiscoverCreateAppServerEvent: &usageeventsv1.UIDiscoverCreateAppServerEvent{ + Metadata: &usageeventsv1.DiscoverMetadata{Id: "someid"}, + Resource: &usageeventsv1.DiscoverResourceMetadata{Resource: usageeventsv1.DiscoverResource_DISCOVER_RESOURCE_APPLICATION_AWS_CONSOLE}, + Status: &usageeventsv1.DiscoverStepStatus{Status: usageeventsv1.DiscoverStatus_DISCOVER_STATUS_SUCCESS}, + }, + }}, + identityUsername: "myuser", + errCheck: require.NoError, + expected: &prehogv1a.SubmitEventRequest{Event: &prehogv1a.SubmitEventRequest_UiDiscoverCreateAppServerEvent{ + UiDiscoverCreateAppServerEvent: &prehogv1a.UIDiscoverCreateAppServerEvent{ + Metadata: &prehogv1a.DiscoverMetadata{ + Id: "someid", + UserName: expectedAnonymizedUserString, + Sso: false, + }, + Resource: &prehogv1a.DiscoverResourceMetadata{Resource: prehogv1a.DiscoverResource_DISCOVER_RESOURCE_APPLICATION_AWS_CONSOLE}, + Status: &prehogv1a.DiscoverStepStatus{Status: prehogv1a.DiscoverStatus_DISCOVER_STATUS_SUCCESS}, + }, + }}, + }, { name: "discover deploy eice event", event: &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiDiscoverDeployEice{ diff --git a/lib/usagereporter/web/userevent.go b/lib/usagereporter/web/userevent.go index 7a139df55925c..e84ff834a6ab9 100644 --- a/lib/usagereporter/web/userevent.go +++ b/lib/usagereporter/web/userevent.go @@ -61,6 +61,7 @@ const ( uiDiscoverEC2InstanceSelectionEvent = "tp.ui.discover.selectedEC2Instance" uiDiscoverDeployEICEEvent = "tp.ui.discover.deployEICE" uiDiscoverCreateNodeEvent = "tp.ui.discover.createNode" + uiDiscoverCreateAppServerEvent = "tp.ui.discover.createAppServer" uiDiscoverCreateDiscoveryConfigEvent = "tp.ui.discover.createDiscoveryConfig" uiDiscoverPrincipalsConfigureEvent = "tp.ui.discover.principals.configure" uiDiscoverTestConnectionEvent = "tp.ui.discover.testConnection" @@ -301,6 +302,7 @@ func ConvertUserEventRequestToUsageEvent(req CreateUserEventRequest) (*usageeven uiDiscoverEC2InstanceSelectionEvent, uiDiscoverDeployEICEEvent, uiDiscoverCreateNodeEvent, + uiDiscoverCreateAppServerEvent, uiDiscoverCreateDiscoveryConfigEvent, uiDiscoverCompletedEvent: diff --git a/lib/usagereporter/web/userevent_discover.go b/lib/usagereporter/web/userevent_discover.go index 7afde050719b3..fb96620e26bb7 100644 --- a/lib/usagereporter/web/userevent_discover.go +++ b/lib/usagereporter/web/userevent_discover.go @@ -246,6 +246,15 @@ func (d *DiscoverEventData) ToUsageEvent(eventName string) (*usageeventsv1.Usage }, }}, nil + case uiDiscoverCreateAppServerEvent: + return &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiDiscoverCreateAppServerEvent{ + UiDiscoverCreateAppServerEvent: &usageeventsv1.UIDiscoverCreateAppServerEvent{ + Metadata: metadata, + Resource: resource, + Status: status, + }, + }}, nil + case uiDiscoverDatabaseConfigureIAMPolicyEvent: return &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiDiscoverDatabaseConfigureIamPolicyEvent{ UiDiscoverDatabaseConfigureIamPolicyEvent: &usageeventsv1.UIDiscoverDatabaseConfigureIAMPolicyEvent{ diff --git a/lib/usagereporter/web/userevent_discover_test.go b/lib/usagereporter/web/userevent_discover_test.go index f23cf7afa716b..ab4a75a495f4a 100644 --- a/lib/usagereporter/web/userevent_discover_test.go +++ b/lib/usagereporter/web/userevent_discover_test.go @@ -164,6 +164,25 @@ func TestDiscoverEventDataToUsageEvent(t *testing.T) { }, }}, }, + { + name: uiDiscoverCreateAppServerEvent + "/success_test", + event: uiDiscoverCreateAppServerEvent, + errCheck: require.NoError, + req: DiscoverEventData{ + ID: "someid", + Resource: "DISCOVER_RESOURCE_APPLICATION_AWS_CONSOLE", + StepStatus: "DISCOVER_STATUS_SUCCESS", + }, + expected: &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiDiscoverCreateAppServerEvent{ + UiDiscoverCreateAppServerEvent: &usageeventsv1.UIDiscoverCreateAppServerEvent{ + Metadata: &usageeventsv1.DiscoverMetadata{Id: "someid"}, + Resource: &usageeventsv1.DiscoverResourceMetadata{Resource: usageeventsv1.DiscoverResource_DISCOVER_RESOURCE_APPLICATION_AWS_CONSOLE}, + Status: &usageeventsv1.DiscoverStepStatus{ + Status: usageeventsv1.DiscoverStatus_DISCOVER_STATUS_SUCCESS, + }, + }, + }}, + }, { name: uiDiscoverKubeEKSEnrollEvent + "/success_test", event: uiDiscoverKubeEKSEnrollEvent, diff --git a/proto/prehog/v1alpha/teleport.proto b/proto/prehog/v1alpha/teleport.proto index ab95d650edf72..eeb145bc8b714 100644 --- a/proto/prehog/v1alpha/teleport.proto +++ b/proto/prehog/v1alpha/teleport.proto @@ -652,6 +652,13 @@ message UIDiscoverCreateNodeEvent { DiscoverStepStatus status = 3; } +// UIDiscoverCreateAppServerEvent is emitted when an app server is created. +message UIDiscoverCreateAppServerEvent { + DiscoverMetadata metadata = 1; + DiscoverResourceMetadata resource = 2; + DiscoverStepStatus status = 3; +} + // UIDiscoverDatabaseConfigureIAMPolicyEvent is emitted when a user is finished with the step that configures IAM policy for an RDS database. message UIDiscoverDatabaseConfigureIAMPolicyEvent { DiscoverMetadata metadata = 1; @@ -1443,6 +1450,8 @@ message SubmitEventRequest { UIDiscoverCreateDiscoveryConfigEvent ui_discover_create_discovery_config = 83; UIDiscoverKubeEKSEnrollEvent ui_discover_kube_eks_enroll_event = 84; + + UIDiscoverCreateAppServerEvent ui_discover_create_app_server_event = 85; } reserved 8; // UIOnboardGetStartedClickEvent diff --git a/web/packages/teleport/src/Discover/AwsMangementConsole/index.tsx b/web/packages/teleport/src/Discover/AwsMangementConsole/index.tsx index 8980f5d7937b3..d800066c628a1 100644 --- a/web/packages/teleport/src/Discover/AwsMangementConsole/index.tsx +++ b/web/packages/teleport/src/Discover/AwsMangementConsole/index.tsx @@ -43,7 +43,7 @@ export const AwsMangementConsole: ResourceViewConfig = { { title: 'Create Application Server', component: CreateAppAccess, - // TODO(lisa) define a create application aws step + eventName: DiscoverEvent.CreateApplicationServer, }, { title: 'Set Up Access', diff --git a/web/packages/teleport/src/services/userEvent/types.ts b/web/packages/teleport/src/services/userEvent/types.ts index 94e056ee8566b..03c966d658689 100644 --- a/web/packages/teleport/src/services/userEvent/types.ts +++ b/web/packages/teleport/src/services/userEvent/types.ts @@ -90,6 +90,7 @@ export enum DiscoverEvent { DatabaseConfigureIAMPolicy = 'tp.ui.discover.database.configure.iampolicy', EC2InstanceSelection = 'tp.ui.discover.selectedEC2Instance', EC2DeployEICE = 'tp.ui.discover.deployEICE', + CreateApplicationServer = 'tp.ui.discover.createAppServer', CreateNode = 'tp.ui.discover.createNode', CreateDiscoveryConfig = 'tp.ui.discover.createDiscoveryConfig', KubeEKSEnrollEvent = 'tp.ui.discover.kube.enroll.eks', From ca7e49b953d40234419132629727a37d782a527c Mon Sep 17 00:00:00 2001 From: Andrew Burke <31974658+atburke@users.noreply.github.com> Date: Mon, 19 Aug 2024 11:48:18 -0700 Subject: [PATCH 23/51] Add static host user cache (#45573) This change adds cache support for static host users. --- api/client/events.go | 8 + api/client/proto/event.pb.go | 573 +++++++++--------- .../teleport/legacy/client/proto/event.proto | 3 + lib/auth/accesspoint/accesspoint.go | 2 + lib/auth/authclient/api.go | 6 + lib/auth/authclient/clt.go | 10 + lib/auth/grpcserver.go | 1 + lib/auth/helpers.go | 1 + lib/auth/statichostuser/service.go | 21 +- lib/auth/statichostuser/service_test.go | 1 + lib/cache/cache.go | 39 ++ lib/cache/cache_test.go | 52 ++ lib/cache/collections.go | 70 +++ lib/service/service.go | 2 + lib/services/local/events.go | 32 + lib/services/local/statichostuser.go | 2 +- 16 files changed, 544 insertions(+), 279 deletions(-) diff --git a/api/client/events.go b/api/client/events.go index 1a59f92c4985d..70b4eb77be0eb 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -25,6 +25,7 @@ import ( kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" accesslistv1conv "github.com/gravitational/teleport/api/types/accesslist/convert/v1" @@ -94,6 +95,10 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_SPIFFEFederation{ SPIFFEFederation: r, } + case *userprovisioningpb.StaticHostUser: + out.Resource = &proto.Event_StaticHostUser{ + StaticHostUser: r, + } default: return nil, trace.BadParameter("resource type %T is not supported", r) } @@ -534,6 +539,9 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetSPIFFEFederation(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil + } else if r := in.GetStaticHostUser(); r != nil { + out.Resource = types.Resource153ToLegacy(r) + return &out, nil } else { return nil, trace.BadParameter("received unsupported resource %T", in.Resource) } diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index 7f9f4ceaf8994..bb626d8da876f 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -32,6 +32,7 @@ import ( v16 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" v13 "github.com/gravitational/teleport/api/gen/proto/go/teleport/secreports/v1" v11 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" + v111 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" types "github.com/gravitational/teleport/api/types" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -171,6 +172,7 @@ type Event struct { // *Event_BotInstance // *Event_AccessGraphSettings // *Event_SPIFFEFederation + // *Event_StaticHostUser Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -633,6 +635,13 @@ func (x *Event) GetSPIFFEFederation() *v19.SPIFFEFederation { return nil } +func (x *Event) GetStaticHostUser() *v111.StaticHostUser { + if x, ok := x.GetResource().(*Event_StaticHostUser); ok { + return x.StaticHostUser + } + return nil +} + type isEvent_Resource interface { isEvent_Resource() } @@ -935,6 +944,11 @@ type Event_SPIFFEFederation struct { SPIFFEFederation *v19.SPIFFEFederation `protobuf:"bytes,62,opt,name=SPIFFEFederation,proto3,oneof"` } +type Event_StaticHostUser struct { + // StaticHostUser is a resource for static host users. + StaticHostUser *v111.StaticHostUser `protobuf:"bytes,63,opt,name=StaticHostUser,proto3,oneof"` +} + func (*Event_ResourceHeader) isEvent_Resource() {} func (*Event_CertAuthority) isEvent_Resource() {} @@ -1053,6 +1067,8 @@ func (*Event_AccessGraphSettings) isEvent_Resource() {} func (*Event_SPIFFEFederation) isEvent_Resource() {} +func (*Event_StaticHostUser) isEvent_Resource() {} + var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ @@ -1096,275 +1112,283 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, - 0x20, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, - 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x3e, 0x0a, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, - 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0c, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, - 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x38, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0b, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, - 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, 0x52, 0x04, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x12, 0x47, 0x0a, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x41, 0x70, 0x70, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, - 0x00, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x41, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, - 0x33, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, - 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, - 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x33, 0x48, - 0x00, 0x52, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x17, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x16, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4c, 0x6f, 0x63, - 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x13, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, - 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, - 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x15, - 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, - 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, - 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x41, 0x70, 0x70, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, - 0x48, 0x00, 0x52, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a, - 0x03, 0x41, 0x70, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, 0x70, 0x70, 0x12, - 0x41, 0x0a, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x4b, - 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, - 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x56, 0x33, 0x48, 0x00, 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, - 0x52, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0f, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x23, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x31, 0x48, 0x00, - 0x52, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, - 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x56, 0x31, 0x48, 0x00, 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0e, - 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x25, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x41, 0x4d, - 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x09, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, - 0x2f, 0x0a, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, - 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x56, - 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x31, 0x48, 0x00, 0x52, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x38, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x57, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, 0x16, 0x48, 0x65, - 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x48, 0x65, 0x61, - 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, - 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x58, 0x0a, - 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, - 0x00, 0x52, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x38, 0x0a, - 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, - 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x48, 0x00, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, + 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x68, 0x6f, 0x73, 0x74, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xa1, 0x21, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, + 0x00, 0x52, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, + 0x41, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, + 0x48, 0x00, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, + 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, + 0x55, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x23, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, + 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x56, 0x32, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, + 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, + 0x00, 0x52, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, + 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, + 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, + 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, + 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, + 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x56, 0x0a, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, + 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, + 0x00, 0x52, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, + 0x48, 0x00, 0x52, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, + 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x12, 0x20, 0x0a, 0x03, 0x41, 0x70, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, + 0x70, 0x70, 0x12, 0x41, 0x0a, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, + 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, + 0x31, 0x48, 0x00, 0x52, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, + 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, + 0x31, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, + 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x3d, 0x0a, 0x0e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, + 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, + 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, + 0x6c, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, + 0x52, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, + 0x16, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, + 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x6d, - 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x7e, 0x0a, - 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6b, 0x75, 0x62, - 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, - 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, - 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x55, 0x0a, - 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x00, 0x52, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, - 0x77, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x48, 0x00, 0x52, - 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, 0x0a, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x3b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, - 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, 0x0a, 0x0b, 0x42, - 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x48, 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, - 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, - 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x53, 0x50, - 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, - 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, + 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, + 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x38, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, + 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, + 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x12, 0x6d, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x7e, 0x0a, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0x55, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, + 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, + 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, + 0x48, 0x00, 0x52, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, + 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x64, 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, + 0x0a, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x56, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, + 0x32, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1440,6 +1464,7 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v19.BotInstance)(nil), // 55: teleport.machineid.v1.BotInstance (*v110.AccessGraphSettings)(nil), // 56: teleport.clusterconfig.v1.AccessGraphSettings (*v19.SPIFFEFederation)(nil), // 57: teleport.machineid.v1.SPIFFEFederation + (*v111.StaticHostUser)(nil), // 58: teleport.userprovisioning.v1.StaticHostUser } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1502,11 +1527,12 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 55, // 57: proto.Event.BotInstance:type_name -> teleport.machineid.v1.BotInstance 56, // 58: proto.Event.AccessGraphSettings:type_name -> teleport.clusterconfig.v1.AccessGraphSettings 57, // 59: proto.Event.SPIFFEFederation:type_name -> teleport.machineid.v1.SPIFFEFederation - 60, // [60:60] is the sub-list for method output_type - 60, // [60:60] is the sub-list for method input_type - 60, // [60:60] is the sub-list for extension type_name - 60, // [60:60] is the sub-list for extension extendee - 0, // [0:60] is the sub-list for field type_name + 58, // 60: proto.Event.StaticHostUser:type_name -> teleport.userprovisioning.v1.StaticHostUser + 61, // [61:61] is the sub-list for method output_type + 61, // [61:61] is the sub-list for method input_type + 61, // [61:61] is the sub-list for extension type_name + 61, // [61:61] is the sub-list for extension extendee + 0, // [0:61] is the sub-list for field type_name } func init() { file_teleport_legacy_client_proto_event_proto_init() } @@ -1588,6 +1614,7 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_BotInstance)(nil), (*Event_AccessGraphSettings)(nil), (*Event_SPIFFEFederation)(nil), + (*Event_StaticHostUser)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 13934f3429e18..0eeb67fd4492e 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -29,6 +29,7 @@ import "teleport/machineid/v1/federation.proto"; import "teleport/notifications/v1/notifications.proto"; import "teleport/secreports/v1/secreports.proto"; import "teleport/userloginstate/v1/userloginstate.proto"; +import "teleport/userprovisioning/v1/statichostuser.proto"; option go_package = "github.com/gravitational/teleport/api/client/proto"; @@ -174,5 +175,7 @@ message Event { teleport.clusterconfig.v1.AccessGraphSettings AccessGraphSettings = 61; // SPIFFEFederation is a resource for SPIFFE federation. teleport.machineid.v1.SPIFFEFederation SPIFFEFederation = 62; + // StaticHostUser is a resource for static host users. + teleport.userprovisioning.v1.StaticHostUser StaticHostUser = 63; } } diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index a6ff5ea96b301..9fadf17ee8467 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -95,6 +95,7 @@ type Config struct { SecReports services.SecReports SnowflakeSession services.SnowflakeSession SPIFFEFederations cache.SPIFFEFederationReader + StaticHostUsers services.StaticHostUser Trust services.Trust UserGroups services.UserGroups UserLoginStates services.UserLoginStates @@ -186,6 +187,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { SecReports: cfg.SecReports, SnowflakeSession: cfg.SnowflakeSession, SPIFFEFederations: cfg.SPIFFEFederations, + StaticHostUsers: cfg.StaticHostUsers, Trust: cfg.Trust, UserGroups: cfg.UserGroups, UserLoginStates: cfg.UserLoginStates, diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 7b9edd0712ec3..b4a3fd3479e65 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -33,6 +33,7 @@ import ( integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" @@ -1183,6 +1184,11 @@ type Cache interface { // ListSPIFFEFederations lists all SPIFFE Federations using Google style // pagination. ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) + + // ListStaticHostUsers lists static host users. + ListStaticHostUsers(ctx context.Context, pageSize int, startKey string) ([]*userprovisioningpb.StaticHostUser, string, error) + // GetStaticHostUser returns a static host user by name. + GetStaticHostUser(ctx context.Context, name string) (*userprovisioningpb.StaticHostUser, error) } type NodeWrapper struct { diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 15d56301da945..84970a27d993d 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -680,6 +680,11 @@ func (c *Client) CrownJewelsClient() services.CrownJewels { return c.APIClient.CrownJewelServiceClient() } +// StaticHostUserClient returns a client for managing static host user resources. +func (c *Client) StaticHostUserClient() services.StaticHostUser { + return c.APIClient.StaticHostUserClient() +} + // DeleteStaticTokens deletes static tokens func (c *Client) DeleteStaticTokens() error { return trace.NotImplemented(notImplementedMessage) @@ -1742,6 +1747,11 @@ type ClientI interface { // will return "not implemented" errors (as per the default gRPC behavior). VnetConfigServiceClient() vnet.VnetConfigServiceClient + // StaticHostUserClient returns a StaticHostUser client. + // Clients connecting to older Teleport versions still get a client when calling this method, but all RPCs + // will return "not implemented" errors (as per the default gRPC behavior). + StaticHostUserClient() services.StaticHostUser + // CloneHTTPClient creates a new HTTP client with the same configuration. CloneHTTPClient(params ...roundtrip.ClientParam) (*HTTPClient, error) diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 2fbfde35ffcdd..b89737a2a153c 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5415,6 +5415,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { staticHostUserServer, err := statichostuserv1.NewService(statichostuserv1.ServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, + Cache: cfg.AuthServer.Cache, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index e2bc5c9986b81..5d4605c21dc1c 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -344,6 +344,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { SecReports: svces.SecReports, SnowflakeSession: svces.Identity, SPIFFEFederations: svces.SPIFFEFederations, + StaticHostUsers: svces.StaticHostUser, Trust: svces.TrustInternal, UserGroups: svces.UserGroups, UserLoginStates: svces.UserLoginStates, diff --git a/lib/auth/statichostuser/service.go b/lib/auth/statichostuser/service.go index e216a21f5a74b..2e157bbe9dec1 100644 --- a/lib/auth/statichostuser/service.go +++ b/lib/auth/statichostuser/service.go @@ -34,7 +34,16 @@ type ServiceConfig struct { Authorizer authz.Authorizer // Backend is the backend used to store static host users. Backend services.StaticHostUser - // TODO(atburke): add cache + // Cache is the cache used to store static host users. + Cache Cache +} + +// Cache is a subset of the service interface for reading items from the cache. +type Cache interface { + // ListStaticHostUsers lists static host users. + ListStaticHostUsers(ctx context.Context, pageSize int, pageToken string) ([]*userprovisioningpb.StaticHostUser, string, error) + // GetStaticHostUser returns a static host user by name. + GetStaticHostUser(ctx context.Context, name string) (*userprovisioningpb.StaticHostUser, error) } // Service implements the static host user RPC service. @@ -43,6 +52,7 @@ type Service struct { authorizer authz.Authorizer backend services.StaticHostUser + cache Cache } // NewService creates a new static host user gRPC service. @@ -52,11 +62,14 @@ func NewService(cfg ServiceConfig) (*Service, error) { return nil, trace.BadParameter("backend is required") case cfg.Authorizer == nil: return nil, trace.BadParameter("authorizer is required") + case cfg.Cache == nil: + return nil, trace.BadParameter("cache is required") } return &Service{ authorizer: cfg.Authorizer, backend: cfg.Backend, + cache: cfg.Cache, }, nil } @@ -73,8 +86,7 @@ func (s *Service) ListStaticHostUsers(ctx context.Context, req *userprovisioning return nil, trace.Wrap(err) } - // TODO(atburke): Switch to using the cache after static host users have been added to the cache. - users, nextToken, err := s.backend.ListStaticHostUsers(ctx, int(req.PageSize), req.PageToken) + users, nextToken, err := s.cache.ListStaticHostUsers(ctx, int(req.PageSize), req.PageToken) if err != nil { return nil, trace.Wrap(err) } @@ -100,8 +112,7 @@ func (s *Service) GetStaticHostUser(ctx context.Context, req *userprovisioningpb return nil, trace.Wrap(err) } - // TODO(atburke): Switch to using the cache after static host users have been added to the cache. - out, err := s.backend.GetStaticHostUser(ctx, req.Name) + out, err := s.cache.GetStaticHostUser(ctx, req.Name) return out, trace.Wrap(err) } diff --git a/lib/auth/statichostuser/service_test.go b/lib/auth/statichostuser/service_test.go index 1d6854ad8d1fc..8bb954be0a672 100644 --- a/lib/auth/statichostuser/service_test.go +++ b/lib/auth/statichostuser/service_test.go @@ -379,6 +379,7 @@ func initSvc(t *testing.T, authorizerFn func(t *testing.T, client localClient) a resourceSvc, err := NewService(ServiceConfig{ Authorizer: authorizerFn(t, client), Backend: localResourceService, + Cache: localResourceService, }) require.NoError(t, err) diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 4f9f523e08671..9229996865a2e 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -43,6 +43,7 @@ import ( dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/internalutils/stream" apitracing "github.com/gravitational/teleport/api/observability/tracing" @@ -183,6 +184,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindDatabaseObject}, {Kind: types.KindAccessGraphSettings}, {Kind: types.KindSPIFFEFederation}, + {Kind: types.KindStaticHostUser}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -294,6 +296,7 @@ func ForNode(cfg Config) Config { // data about other namespaces or node events {Kind: types.KindNamespace, Name: apidefaults.Namespace}, {Kind: types.KindNetworkRestrictions}, + {Kind: types.KindStaticHostUser}, } cfg.QueueSize = defaults.NodeQueueSize @@ -521,6 +524,7 @@ type Cache struct { notificationsCache services.Notifications accessMontoringRuleCache services.AccessMonitoringRules spiffeFederationCache spiffeFederationCacher + staticHostUsersCache *local.StaticHostUserService // closed indicates that the cache has been closed closed atomic.Bool @@ -695,6 +699,8 @@ type Config struct { AccessMonitoringRules services.AccessMonitoringRules // SPIFFEFederations is the SPIFFE federations service. SPIFFEFederations SPIFFEFederationReader + // StaticHostUsers is the static host user service. + StaticHostUsers services.StaticHostUser // Backend is a backend for local cache Backend backend.Backend // MaxRetryPeriod is the maximum period between cache retries on failures @@ -936,6 +942,12 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + staticHostUserCache, err := local.NewStaticHostUserService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + cs := &Cache{ ctx: ctx, cancel: cancel, @@ -977,6 +989,7 @@ func New(config Config) (*Cache, error) { lowVolumeEventsFanout: utils.NewRoundRobin(lowVolumeFanouts), kubeWaitingContsCache: kubeWaitingContsCache, spiffeFederationCache: spiffeFederationCache, + staticHostUsersCache: staticHostUserCache, Logger: log.WithFields(log.Fields{ teleport.ComponentKey: config.Component, }), @@ -2296,6 +2309,32 @@ func (c *Cache) GetKubernetesWaitingContainer(ctx context.Context, req *kubewait return rg.reader.GetKubernetesWaitingContainer(ctx, req) } +// ListStaticHostUsers lists static host users. +func (c *Cache) ListStaticHostUsers(ctx context.Context, pageSize int, pageToken string) ([]*userprovisioningpb.StaticHostUser, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListStaticHostUsers") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.staticHostUsers) + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + return rg.reader.ListStaticHostUsers(ctx, pageSize, pageToken) +} + +// GetStaticHostUser returns a static host user by name. +func (c *Cache) GetStaticHostUser(ctx context.Context, name string) (*userprovisioningpb.StaticHostUser, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetStaticHostUser") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.staticHostUsers) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetStaticHostUser(ctx, name) +} + // GetApplicationServers returns all registered application servers. func (c *Cache) GetApplicationServers(ctx context.Context, namespace string) ([]types.AppServer, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetApplicationServers") diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 1161aa27205ac..9e7a793ad9e36 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -49,6 +49,7 @@ import ( headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/clusterconfig" @@ -58,6 +59,7 @@ import ( "github.com/gravitational/teleport/api/types/secreports" "github.com/gravitational/teleport/api/types/trait" "github.com/gravitational/teleport/api/types/userloginstate" + "github.com/gravitational/teleport/api/types/userprovisioning" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/backend/lite" "github.com/gravitational/teleport/lib/backend/memory" @@ -127,6 +129,7 @@ type testPack struct { crownJewels services.CrownJewels databaseObjects services.DatabaseObjects spiffeFederations *local.SPIFFEFederationService + staticHostUsers services.StaticHostUser } // testFuncs are functions to support testing an object in a cache. @@ -349,6 +352,12 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { } p.notifications = notificationsSvc + staticHostUserService, err := local.NewStaticHostUserService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + p.staticHostUsers = staticHostUserService + return p, nil } @@ -396,6 +405,7 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) CrownJewels: p.crownJewels, SPIFFEFederations: p.spiffeFederations, DatabaseObjects: p.databaseObjects, + StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -608,6 +618,7 @@ func TestNodeCAFiltering(t *testing.T) { WindowsDesktops: p.cache.windowsDesktopsCache, SAMLIdPServiceProviders: p.samlIDPServiceProviders, UserGroups: p.userGroups, + StaticHostUsers: p.staticHostUsers, Backend: nodeCacheBackend, })) require.NoError(t, err) @@ -800,6 +811,7 @@ func TestCompletenessInit(t *testing.T) { CrownJewels: p.crownJewels, DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, + StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -878,6 +890,7 @@ func TestCompletenessReset(t *testing.T) { CrownJewels: p.crownJewels, DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, + StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -1082,6 +1095,7 @@ func TestListResources_NodesTTLVariant(t *testing.T) { CrownJewels: p.crownJewels, DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, + StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy @@ -1171,6 +1185,7 @@ func initStrategy(t *testing.T) { CrownJewels: p.crownJewels, DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, + StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -2672,6 +2687,34 @@ func TestGlobalNotifications(t *testing.T) { }) } +// TestStaticHostUsers tests that CRUD operations on static host user resources are +// replicated from the backend to the cache. +func TestStaticHostUsers(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*userprovisioningpb.StaticHostUser]{ + newResource: func(name string) (*userprovisioningpb.StaticHostUser, error) { + return newStaticHostUser(t, name), nil + }, + create: func(ctx context.Context, item *userprovisioningpb.StaticHostUser) error { + _, err := p.staticHostUsers.CreateStaticHostUser(ctx, item) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]*userprovisioningpb.StaticHostUser, error) { + items, _, err := p.staticHostUsers.ListStaticHostUsers(ctx, 0, "") + return items, trace.Wrap(err) + }, + cacheList: func(ctx context.Context) ([]*userprovisioningpb.StaticHostUser, error) { + items, _, err := p.cache.ListStaticHostUsers(ctx, 0, "") + return items, trace.Wrap(err) + }, + deleteAll: p.cache.staticHostUsersCache.DeleteAllStaticHostUsers, + }) +} + // testResources is a generic tester for resources. func testResources[T types.Resource](t *testing.T, p *testPack, funcs testFuncs[T]) { ctx := context.Background() @@ -3247,6 +3290,7 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindDatabaseObject: types.Resource153ToLegacy(newDatabaseObject(t, "test")), types.KindAccessGraphSettings: types.Resource153ToLegacy(newAccessGraphSettings(t)), types.KindSPIFFEFederation: types.Resource153ToLegacy(newSPIFFEFederation("test")), + types.KindStaticHostUser: types.Resource153ToLegacy(newStaticHostUser(t, "test")), } for name, cfg := range cases { @@ -3776,6 +3820,14 @@ func newAccessMonitoringRule(t *testing.T) *accessmonitoringrulesv1.AccessMonito return notification } +func newStaticHostUser(t *testing.T, name string) *userprovisioningpb.StaticHostUser { + t.Helper() + return userprovisioning.NewStaticHostUser(name, &userprovisioningpb.StaticHostUserSpec{ + Login: "foo", + Groups: []string{"bar", "baz"}, + }) +} + func withKeepalive[T any](fn func(context.Context, T) (*types.KeepAlive, error)) func(context.Context, T) error { return func(ctx context.Context, resource T) error { _, err := fn(ctx, resource) diff --git a/lib/cache/collections.go b/lib/cache/collections.go index 26c0f9192d37d..747ede4464b61 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -35,6 +35,7 @@ import ( kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" @@ -223,6 +224,7 @@ type cacheCollections struct { crownJewels collectionReader[crownjewelsGetter] kubeClusters collectionReader[kubernetesClusterGetter] kubeWaitingContainers collectionReader[kubernetesWaitingContainerGetter] + staticHostUsers collectionReader[staticHostUserGetter] kubeServers collectionReader[kubeServerGetter] locks collectionReader[services.LockGetter] namespaces collectionReader[namespaceGetter] @@ -711,6 +713,15 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.kubeWaitingContainers + case types.KindStaticHostUser: + if c.StaticHostUsers == nil { + return nil, trace.BadParameter("missing parameter StaticHostUsers") + } + collections.staticHostUsers = &genericCollection[*userprovisioningpb.StaticHostUser, staticHostUserGetter, staticHostUserExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.staticHostUsers case types.KindNotification: if c.Notifications == nil { return nil, trace.BadParameter("missing parameter Notifications") @@ -2325,6 +2336,65 @@ type kubernetesWaitingContainerGetter interface { var _ executor[*kubewaitingcontainerpb.KubernetesWaitingContainer, kubernetesWaitingContainerGetter] = kubeWaitingContainerExecutor{} +type staticHostUserExecutor struct{} + +func (staticHostUserExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*userprovisioningpb.StaticHostUser, error) { + var ( + startKey string + allUsers []*userprovisioningpb.StaticHostUser + ) + for { + users, nextKey, err := cache.StaticHostUsers.ListStaticHostUsers(ctx, 0, startKey) + if err != nil { + return nil, trace.Wrap(err) + } + + allUsers = append(allUsers, users...) + + if nextKey == "" { + break + } + startKey = nextKey + } + return allUsers, nil +} + +func (staticHostUserExecutor) upsert(ctx context.Context, cache *Cache, resource *userprovisioningpb.StaticHostUser) error { + _, err := cache.staticHostUsersCache.UpsertStaticHostUser(ctx, resource) + return trace.Wrap(err) +} + +func (staticHostUserExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return trace.Wrap(cache.staticHostUsersCache.DeleteAllStaticHostUsers(ctx)) +} + +func (staticHostUserExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + var hostUser *userprovisioningpb.StaticHostUser + r, ok := resource.(types.Resource153Unwrapper) + if ok { + hostUser, ok = r.Unwrap().(*userprovisioningpb.StaticHostUser) + if ok { + err := cache.staticHostUsersCache.DeleteStaticHostUser(ctx, hostUser.Metadata.Name) + return trace.Wrap(err) + } + } + return trace.BadParameter("unknown StaticHostUser type, expected %T, got %T", hostUser, resource) +} + +func (staticHostUserExecutor) isSingleton() bool { return false } + +func (staticHostUserExecutor) getReader(cache *Cache, cacheOK bool) staticHostUserGetter { + if cacheOK { + return cache.staticHostUsersCache + } + return cache.Config.StaticHostUsers +} + +type staticHostUserGetter interface { + ListStaticHostUsers(ctx context.Context, pageSize int, pageToken string) ([]*userprovisioningpb.StaticHostUser, string, error) + GetStaticHostUser(ctx context.Context, name string) (*userprovisioningpb.StaticHostUser, error) +} + type crownJewelsExecutor struct{} func (crownJewelsExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*crownjewelv1.CrownJewel, error) { diff --git a/lib/service/service.go b/lib/service/service.go index 4f9a367292211..40d5e404a4e9e 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2598,6 +2598,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.SecReports = services.SecReports cfg.SnowflakeSession = services.Identity cfg.SPIFFEFederations = services.SPIFFEFederations + cfg.StaticHostUsers = services.StaticHostUser cfg.Trust = services.TrustInternal cfg.UserGroups = services.UserGroups cfg.UserLoginStates = services.UserLoginStates @@ -2640,6 +2641,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.SAMLIdPSession = client cfg.SecReports = client.SecReportsClient() cfg.SnowflakeSession = client + cfg.StaticHostUsers = client.StaticHostUserClient() cfg.Trust = client cfg.UserGroups = client cfg.UserLoginStates = client.UserLoginStateClient() diff --git a/lib/services/local/events.go b/lib/services/local/events.go index e2fb84c230518..5f910d8f7e3fb 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -35,6 +35,7 @@ import ( kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/kubewaitingcontainer" "github.com/gravitational/teleport/lib/backend" @@ -226,6 +227,8 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newAccessGraphSettingsParser() case types.KindSPIFFEFederation: parser = newSPIFFEFederationParser() + case types.KindStaticHostUser: + parser = newStaticHostUserParser() default: if watch.AllowPartialSuccess { continue @@ -2201,6 +2204,35 @@ func (p *instanceParser) parse(event backend.Event) (types.Resource, error) { } } +func newStaticHostUserParser() *staticHostUserParser { + return &staticHostUserParser{ + baseParser: newBaseParser(backend.Key(staticHostUserPrefix)), + } +} + +type staticHostUserParser struct { + baseParser +} + +func (p *staticHostUserParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + return resourceHeader(event, types.KindStaticHostUser, types.V1, 0) + case types.OpPut: + resource, err := services.UnmarshalProtoResource[*userprovisioningpb.StaticHostUser]( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return types.Resource153ToLegacy(resource), nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func resourceHeader(event backend.Event, kind, version string, offset int) (types.Resource, error) { name, err := base(event.Item.Key, offset) if err != nil { diff --git a/lib/services/local/statichostuser.go b/lib/services/local/statichostuser.go index cd8ebdad96e0b..83eeead686f57 100644 --- a/lib/services/local/statichostuser.go +++ b/lib/services/local/statichostuser.go @@ -104,7 +104,7 @@ func (s *StaticHostUserService) DeleteStaticHostUser(ctx context.Context, name s return trace.Wrap(s.svc.DeleteResource(ctx, name)) } -// DeleteStaticHostUser deletes a static host user. Note that this does not +// DeleteAllStaticHostUsers deletes all static host users. Note that this does not // remove any host users created on nodes from the resources. func (s *StaticHostUserService) DeleteAllStaticHostUsers(ctx context.Context) error { return trace.Wrap(s.svc.DeleteAllResources(ctx)) From 45d33c47519b02431234994e1314a30a7d9bffd3 Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Mon, 19 Aug 2024 11:59:08 -0700 Subject: [PATCH 24/51] Device Trust support for split SSH and TLS keys (#45546) * Device Trust support for split SSH and TLS keys * chalResp -> tpmChallenge * clarify comment on sha256 import * use input struct, crypto.Signer instead of keys.PrivateKey * use trace errors in challenge package --- .../v1/authenticate_challenge.pb.go | 70 ++++++++---- .../devicetrust/v1/devicetrust_service.pb.go | 7 +- .../v1/authenticate_challenge.proto | 8 ++ .../devicetrust/v1/devicetrust_service.proto | 7 +- .../v1/authenticate_challenge_pb.ts | 36 ++++++- .../devicetrust/v1/devicetrust_service_pb.ts | 7 +- lib/client/api.go | 24 +++-- lib/client/api_login_test.go | 57 +++++----- lib/devicetrust/assert/assert.go | 6 +- lib/devicetrust/authn/authn.go | 66 +++++++++--- lib/devicetrust/authn/authn_test.go | 30 +++--- lib/devicetrust/challenge/challenge.go | 101 ++++++++++++++++++ lib/devicetrust/challenge/challenge_test.go | 90 ++++++++++++++++ .../testenv/fake_device_service.go | 66 ++++++++++-- lib/devicetrust/testenv/testenv.go | 23 ++++ 15 files changed, 490 insertions(+), 108 deletions(-) create mode 100644 lib/devicetrust/challenge/challenge.go create mode 100644 lib/devicetrust/challenge/challenge_test.go diff --git a/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go index b0e32c964b09b..e3a88fdd7fb89 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go @@ -92,6 +92,10 @@ type AuthenticateDeviceChallengeResponse struct { // Signature over the challenge, using the device key. Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + // Signature over the challenge, using the SSH key. This is required when the + // SSH and TLS public keys do not match, to prove ownership of the private key + // associated with the SSH certificate being augmented. + SshSignature []byte `protobuf:"bytes,2,opt,name=ssh_signature,json=sshSignature,proto3" json:"ssh_signature,omitempty"` } func (x *AuthenticateDeviceChallengeResponse) Reset() { @@ -133,6 +137,13 @@ func (x *AuthenticateDeviceChallengeResponse) GetSignature() []byte { return nil } +func (x *AuthenticateDeviceChallengeResponse) GetSshSignature() []byte { + if x != nil { + return x.SshSignature + } + return nil +} + // TPMAuthenticateDeviceChallenge carries the authentication challenge // specific to TPMs. type TPMAuthenticateDeviceChallenge struct { @@ -194,6 +205,10 @@ type TPMAuthenticateDeviceChallengeResponse struct { // The result of the client's platform attestation with the nonce provided // in `TPMAuthenticateDeviceChallenge`. PlatformParameters *TPMPlatformParameters `protobuf:"bytes,1,opt,name=platform_parameters,json=platformParameters,proto3" json:"platform_parameters,omitempty"` + // Signature over the attestation_nonce, using the SSH key. This is required + // when the SSH and TLS public keys do not match, to prove ownership of the + // private key associated with the SSH certificate being augmented. + SshSignature []byte `protobuf:"bytes,2,opt,name=ssh_signature,json=sshSignature,proto3" json:"ssh_signature,omitempty"` } func (x *TPMAuthenticateDeviceChallengeResponse) Reset() { @@ -235,6 +250,13 @@ func (x *TPMAuthenticateDeviceChallengeResponse) GetPlatformParameters() *TPMPla return nil } +func (x *TPMAuthenticateDeviceChallengeResponse) GetSshSignature() []byte { + if x != nil { + return x.SshSignature + } + return nil +} + var File_teleport_devicetrust_v1_authenticate_challenge_proto protoreflect.FileDescriptor var file_teleport_devicetrust_v1_authenticate_challenge_proto_rawDesc = []byte{ @@ -249,31 +271,35 @@ var file_teleport_devicetrust_v1_authenticate_challenge_proto_rawDesc = []byte{ 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, - 0x43, 0x0a, 0x23, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x68, 0x0a, 0x23, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0x4d, 0x0a, 0x1e, 0x54, 0x50, 0x4d, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x10, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, - 0x6e, 0x63, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x26, 0x54, 0x50, 0x4d, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, - 0x0a, 0x13, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x50, 0x4d, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x12, 0x70, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, - 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, - 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x73, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x73, 0x68, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x4d, 0x0a, 0x1e, 0x54, 0x50, 0x4d, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x26, 0x54, 0x50, 0x4d, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x50, 0x4d, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x52, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x73, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x73, 0x68, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go index ea637129ca1ab..d9962dd2adc08 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go @@ -1955,8 +1955,11 @@ type AuthenticateDeviceInit struct { // - The x509 certificate is acquired from the mTLS connection, thus the // in-band certificate is ignored. // - All certificates must be valid and issued by the Teleport CA. - // - All certificates must match (same public key, same Teleport user, plus - // whatever additional checks the backend sees fit). + // - TLS and SSH certificates must match (same Teleport user, plus whatever + // additional checks the backend sees fit). + // - TLS and SSH certificates must either have matching public keys, or + // (TPM)AuthenticateDeviceChallengeResponse.SshSignature must be a valid + // signature over the challenge by the SSH private key. // - Augmented certificates have the same expiration as the original // certificates. UserCertificates *UserCertificates `protobuf:"bytes,1,opt,name=user_certificates,json=userCertificates,proto3" json:"user_certificates,omitempty"` diff --git a/api/proto/teleport/devicetrust/v1/authenticate_challenge.proto b/api/proto/teleport/devicetrust/v1/authenticate_challenge.proto index 9f91a9046cae5..e47e71939ebc5 100644 --- a/api/proto/teleport/devicetrust/v1/authenticate_challenge.proto +++ b/api/proto/teleport/devicetrust/v1/authenticate_challenge.proto @@ -31,6 +31,10 @@ message AuthenticateDeviceChallenge { message AuthenticateDeviceChallengeResponse { // Signature over the challenge, using the device key. bytes signature = 1; + // Signature over the challenge, using the SSH key. This is required when the + // SSH and TLS public keys do not match, to prove ownership of the private key + // associated with the SSH certificate being augmented. + bytes ssh_signature = 2; } // TPMAuthenticateDeviceChallenge carries the authentication challenge @@ -47,4 +51,8 @@ message TPMAuthenticateDeviceChallengeResponse { // The result of the client's platform attestation with the nonce provided // in `TPMAuthenticateDeviceChallenge`. TPMPlatformParameters platform_parameters = 1; + // Signature over the attestation_nonce, using the SSH key. This is required + // when the SSH and TLS public keys do not match, to prove ownership of the + // private key associated with the SSH certificate being augmented. + bytes ssh_signature = 2; } diff --git a/api/proto/teleport/devicetrust/v1/devicetrust_service.proto b/api/proto/teleport/devicetrust/v1/devicetrust_service.proto index fbf9df18666d6..7f87e33bb82d2 100644 --- a/api/proto/teleport/devicetrust/v1/devicetrust_service.proto +++ b/api/proto/teleport/devicetrust/v1/devicetrust_service.proto @@ -513,8 +513,11 @@ message AuthenticateDeviceInit { // - The x509 certificate is acquired from the mTLS connection, thus the // in-band certificate is ignored. // - All certificates must be valid and issued by the Teleport CA. - // - All certificates must match (same public key, same Teleport user, plus - // whatever additional checks the backend sees fit). + // - TLS and SSH certificates must match (same Teleport user, plus whatever + // additional checks the backend sees fit). + // - TLS and SSH certificates must either have matching public keys, or + // (TPM)AuthenticateDeviceChallengeResponse.SshSignature must be a valid + // signature over the challenge by the SSH private key. // - Augmented certificates have the same expiration as the original // certificates. UserCertificates user_certificates = 1; diff --git a/gen/proto/ts/teleport/devicetrust/v1/authenticate_challenge_pb.ts b/gen/proto/ts/teleport/devicetrust/v1/authenticate_challenge_pb.ts index c2ad995034e85..dae2e42a5f941 100644 --- a/gen/proto/ts/teleport/devicetrust/v1/authenticate_challenge_pb.ts +++ b/gen/proto/ts/teleport/devicetrust/v1/authenticate_challenge_pb.ts @@ -54,6 +54,14 @@ export interface AuthenticateDeviceChallengeResponse { * @generated from protobuf field: bytes signature = 1; */ signature: Uint8Array; + /** + * Signature over the challenge, using the SSH key. This is required when the + * SSH and TLS public keys do not match, to prove ownership of the private key + * associated with the SSH certificate being augmented. + * + * @generated from protobuf field: bytes ssh_signature = 2; + */ + sshSignature: Uint8Array; } /** * TPMAuthenticateDeviceChallenge carries the authentication challenge @@ -84,6 +92,14 @@ export interface TPMAuthenticateDeviceChallengeResponse { * @generated from protobuf field: teleport.devicetrust.v1.TPMPlatformParameters platform_parameters = 1; */ platformParameters?: TPMPlatformParameters; + /** + * Signature over the attestation_nonce, using the SSH key. This is required + * when the SSH and TLS public keys do not match, to prove ownership of the + * private key associated with the SSH certificate being augmented. + * + * @generated from protobuf field: bytes ssh_signature = 2; + */ + sshSignature: Uint8Array; } // @generated message type with reflection information, may provide speed optimized methods class AuthenticateDeviceChallenge$Type extends MessageType { @@ -136,12 +152,14 @@ export const AuthenticateDeviceChallenge = new AuthenticateDeviceChallenge$Type( class AuthenticateDeviceChallengeResponse$Type extends MessageType { constructor() { super("teleport.devicetrust.v1.AuthenticateDeviceChallengeResponse", [ - { no: 1, name: "signature", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + { no: 1, name: "signature", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "ssh_signature", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } ]); } create(value?: PartialMessage): AuthenticateDeviceChallengeResponse { const message = globalThis.Object.create((this.messagePrototype!)); message.signature = new Uint8Array(0); + message.sshSignature = new Uint8Array(0); if (value !== undefined) reflectionMergePartial(this, message, value); return message; @@ -154,6 +172,9 @@ class AuthenticateDeviceChallengeResponse$Type extends MessageType { constructor() { super("teleport.devicetrust.v1.TPMAuthenticateDeviceChallengeResponse", [ - { no: 1, name: "platform_parameters", kind: "message", T: () => TPMPlatformParameters } + { no: 1, name: "platform_parameters", kind: "message", T: () => TPMPlatformParameters }, + { no: 2, name: "ssh_signature", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } ]); } create(value?: PartialMessage): TPMAuthenticateDeviceChallengeResponse { const message = globalThis.Object.create((this.messagePrototype!)); + message.sshSignature = new Uint8Array(0); if (value !== undefined) reflectionMergePartial(this, message, value); return message; @@ -247,6 +273,9 @@ class TPMAuthenticateDeviceChallengeResponse$Type extends MessageType"), - }, }, { name: "linux ok", dev: linuxDev1, - certs: &devicepb.UserCertificates{ - // SshAuthorizedKey is not parsed by the fake server. - SshAuthorizedKey: []byte(""), - }, }, { name: "windows ok", dev: windowsDev1, - certs: &devicepb.UserCertificates{ - // SshAuthorizedKey is not parsed by the fake server. - SshAuthorizedKey: []byte(""), - }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - _, err = newAuthnCeremony(test.dev).Run(ctx, devices, test.certs) + _, err = newAuthnCeremony(test.dev).Run(ctx, runParams) // A nil error is good enough for this test. assert.NoError(t, err, "RunCeremony failed") diff --git a/lib/devicetrust/challenge/challenge.go b/lib/devicetrust/challenge/challenge.go new file mode 100644 index 0000000000000..75f784f74c3ed --- /dev/null +++ b/lib/devicetrust/challenge/challenge.go @@ -0,0 +1,101 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package challenge + +import ( + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rand" + "crypto/rsa" + _ "crypto/sha256" // imported to register crypto.SHA256 in init func + + "github.com/gravitational/trace" +) + +const challengeLength = 32 + +// New creates a new Device Trust challenge with the default length. +func New() ([]byte, error) { + b := make([]byte, challengeLength) + if _, err := rand.Read(b); err != nil { + return nil, trace.Wrap(err) + } + return b, nil +} + +// Verify verifies that [sig] is a signature over [chal] by the private key +// corresponding to [pubKey]. +func Verify(chal, sig []byte, pubKey crypto.PublicKey) error { + switch pub := pubKey.(type) { + case *ecdsa.PublicKey: + digest, err := hash(crypto.SHA256, chal) + if err != nil { + return trace.Wrap(err) + } + if !ecdsa.VerifyASN1(pub, digest, sig) { + return trace.BadParameter("ecdsa verification failed") + } + return nil + + case *rsa.PublicKey: + digest, err := hash(crypto.SHA256, chal) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(rsa.VerifyPKCS1v15(pub, crypto.SHA256, digest, sig)) + + case ed25519.PublicKey: + // ed25519 is a special snowflake: the PublicKey type is not a pointer, + // and it doesn't like to pre-hash. + if !ed25519.Verify(pub, chal, sig) { + return trace.BadParameter("ed25519 verification failed") + } + return nil + + default: + return trace.BadParameter("unsupported key type: %T", pub) + } +} + +// Sign returns a signature over [challenge] by [signer]. A SHA256 hash is used +// for ECDSA and RSA, no pre-hash is used for Ed25519. +func Sign(challenge []byte, signer crypto.Signer) ([]byte, error) { + switch pub := signer.Public().(type) { + case *ecdsa.PublicKey, *rsa.PublicKey: + digest, err := hash(crypto.SHA256, challenge) + if err != nil { + return nil, trace.Wrap(err) + } + signature, err := signer.Sign(rand.Reader, digest, crypto.SHA256) + return signature, trace.Wrap(err) + case ed25519.PublicKey: + // No pre-hash is used for Ed25519. + signature, err := signer.Sign(rand.Reader, challenge, &ed25519.Options{}) + return signature, trace.Wrap(err) + default: + return nil, trace.BadParameter("unsupported key type: %T", pub) + } +} + +func hash(hash crypto.Hash, message []byte) ([]byte, error) { + hasher := hash.New() + if _, err := hasher.Write(message); err != nil { + return nil, trace.Wrap(err) + } + return hasher.Sum(nil), nil +} diff --git a/lib/devicetrust/challenge/challenge_test.go b/lib/devicetrust/challenge/challenge_test.go new file mode 100644 index 0000000000000..01e25c014b4c0 --- /dev/null +++ b/lib/devicetrust/challenge/challenge_test.go @@ -0,0 +1,90 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package challenge_test + +import ( + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "testing" + + "github.com/gravitational/teleport/lib/devicetrust/challenge" +) + +func TestSignAndVerify(t *testing.T) { + ecKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatalf("GenerateKey failed: %v", err) + } + rsaKey, err := rsa.GenerateKey(rand.Reader, 2048 /* bits */) + if err != nil { + t.Fatalf("GenerateKey failed: %v", err) + } + edPub, edPriv, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + t.Fatalf("GenerateKey failed: %v", err) + } + + tests := []struct { + name string + signer crypto.Signer + pubKey crypto.PublicKey + }{ + { + name: "ecdsa key", + signer: ecKey, + pubKey: ecKey.Public(), + }, + { + name: "rsa key", + signer: rsaKey, + pubKey: rsaKey.Public(), + }, + { + name: "ed25519 key", + signer: edPriv, + pubKey: edPub, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + chal, err := challenge.New() + if err != nil { + t.Fatalf("New failed: %v", err) + } + + sig, err := challenge.Sign(chal, test.signer) + if err != nil { + t.Fatalf("Sign failed: %v", err) + } + + // Verify correct challenge signature. + if err := challenge.Verify(chal, sig, test.pubKey); err != nil { + t.Errorf("Verify returned err=%v, want nil", err) + } + + // Verify bad challenge signature. + sig = []byte("invalid sig") + if err := challenge.Verify(chal, sig, test.pubKey); err == nil { + t.Error("Verify returned nil err, want non-nil") + } + }) + } +} diff --git a/lib/devicetrust/testenv/fake_device_service.go b/lib/devicetrust/testenv/fake_device_service.go index 346830b77178c..a2f1c23f35c0a 100644 --- a/lib/devicetrust/testenv/fake_device_service.go +++ b/lib/devicetrust/testenv/fake_device_service.go @@ -21,6 +21,7 @@ package testenv import ( "bytes" "context" + "crypto" "crypto/ecdsa" "crypto/rand" "crypto/sha256" @@ -31,11 +32,14 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" + "golang.org/x/crypto/ssh" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" + "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/devicetrust/assertserver" + "github.com/gravitational/teleport/lib/devicetrust/challenge" ) // FakeEnrollmentToken is a "free", never spent enrollment token. @@ -520,9 +524,9 @@ func (s *FakeDeviceService) AssertDevice(ctx context.Context, stream assertserve switch dev.pb.OsType { case devicepb.OSType_OS_TYPE_MACOS: - err = authenticateDeviceMacOS(dev, assertStreamAdapter{stream: stream}) + err = authenticateDeviceMacOS(dev, assertStreamAdapter{stream: stream}, nil /*sshCert*/) case devicepb.OSType_OS_TYPE_LINUX, devicepb.OSType_OS_TYPE_WINDOWS: - err = authenticateDeviceTPM(assertStreamAdapter{stream: stream}) + err = authenticateDeviceTPM(assertStreamAdapter{stream: stream}, nil /*sshCert*/) default: err = fmt.Errorf("unrecognized os type %q", dev.pb.OsType) } @@ -580,9 +584,9 @@ func (s *FakeDeviceService) AuthenticateDevice(stream devicepb.DeviceTrustServic switch dev.pb.OsType { case devicepb.OSType_OS_TYPE_MACOS: - err = authenticateDeviceMacOS(dev, stream) + err = authenticateDeviceMacOS(dev, stream, initReq.GetUserCertificates().GetSshAuthorizedKey()) case devicepb.OSType_OS_TYPE_LINUX, devicepb.OSType_OS_TYPE_WINDOWS: - err = authenticateDeviceTPM(stream) + err = authenticateDeviceTPM(stream, initReq.GetUserCertificates().GetSshAuthorizedKey()) default: err = fmt.Errorf("unrecognized os type %q", dev.pb.OsType) } @@ -645,7 +649,11 @@ func (s *FakeDeviceService) spendDeviceWebToken(webToken *devicepb.DeviceWebToke return nil, trace.AccessDenied(invalidWebTokenMessage) } -func authenticateDeviceMacOS(dev *storedDevice, stream authenticateDeviceStream) error { +func authenticateDeviceMacOS( + dev *storedDevice, + stream authenticateDeviceStream, + sshCert []byte, +) error { // 2. Challenge. chal, err := newChallenge() if err != nil { @@ -673,10 +681,21 @@ func authenticateDeviceMacOS(dev *storedDevice, stream authenticateDeviceStream) case len(chalResp.Signature) == 0: return trace.BadParameter("signature required") } - return trace.Wrap(verifyChallenge(chal, chalResp.Signature, dev.pub)) + if err := challenge.Verify(chal, chalResp.Signature, dev.pub); err != nil { + return trace.Wrap(err) + } + + // Verify SSH challenge signature if augmented SSH cert was requested. + if len(sshCert) != 0 { + if err := verifySSHChallenge(sshCert, chal, chalResp.SshSignature); err != nil { + return trace.Wrap(err) + } + } + + return nil } -func authenticateDeviceTPM(stream authenticateDeviceStream) error { +func authenticateDeviceTPM(stream authenticateDeviceStream, sshCert []byte) error { // Produce a nonce we can send in the challenge that we expect to see in // the EventLog field of the challenge response. nonce, err := randomBytes() @@ -706,6 +725,39 @@ func authenticateDeviceTPM(stream authenticateDeviceStream) error { case !bytes.Equal(nonce, chalResp.PlatformParameters.EventLog): return trace.BadParameter("nonce in challenge response did not match expected") } + + // Verify SSH challenge signature if augmented SSH cert was requested. + if len(sshCert) != 0 { + if err := verifySSHChallenge(sshCert, nonce, chalResp.SshSignature); err != nil { + return trace.Wrap(err) + } + } + + return nil +} + +func verifySSHChallenge(sshAuthorizedKey, chal, signature []byte) error { + switch { + case len(sshAuthorizedKey) == 0: + return trace.BadParameter("sshAuthorizedKey required") + case len(chal) == 0: + return trace.BadParameter("chal required") + case len(signature) == 0: + return trace.BadParameter("signature required") + } + sshCert, err := sshutils.ParseCertificate(sshAuthorizedKey) + if err != nil { + return trace.Wrap(err, "parsing SSH certificate") + } + var pubKey crypto.PublicKey + if cryptoKey, ok := sshCert.Key.(ssh.CryptoPublicKey); ok { + pubKey = cryptoKey.CryptoPublicKey() + } else { + return trace.BadParameter("unsupported SSH public key type %T", sshCert.Key) + } + if err := challenge.Verify(chal, signature, pubKey); err != nil { + return trace.BadParameter("SSH key verification failed: %v", err) + } return nil } diff --git a/lib/devicetrust/testenv/testenv.go b/lib/devicetrust/testenv/testenv.go index a0226ee030b0e..a1ee369e628c6 100644 --- a/lib/devicetrust/testenv/testenv.go +++ b/lib/devicetrust/testenv/testenv.go @@ -20,12 +20,15 @@ package testenv import ( "context" + "crypto" "crypto/ecdsa" + "crypto/rand" "crypto/x509" "net" "time" "github.com/gravitational/trace" + "golang.org/x/crypto/ssh" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" @@ -33,6 +36,7 @@ import ( devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" "github.com/gravitational/teleport/api/utils/grpc/interceptors" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/devicetrust/native" ) @@ -207,3 +211,22 @@ func CreateEnrolledDevice(deviceID string, d FakeDevice) (*devicepb.Device, *ecd } return dev, pub, nil } + +// NewSelfSignedSSHCert returns a self-signed SSH certificate in authorized-keys +// format, intended to be used as the user SSH certificate in authn tests. +func NewSelfSignedSSHCert() ([]byte, crypto.Signer, error) { + signer, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) + if err != nil { + return nil, nil, trace.Wrap(err) + } + sshSigner, err := ssh.NewSignerFromSigner(signer) + if err != nil { + return nil, nil, trace.Wrap(err) + } + sshCert := &ssh.Certificate{Key: sshSigner.PublicKey(), SignatureKey: sshSigner.PublicKey(), Serial: 1, CertType: ssh.UserCert} + if err := sshCert.SignCert(rand.Reader, sshSigner); err != nil { + return nil, nil, trace.Wrap(err) + } + sshAuthorizedKey := ssh.MarshalAuthorizedKey(sshCert) + return sshAuthorizedKey, signer, nil +} From d2cf47f7d352edea1462baf8233fde5c4ed5643e Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Mon, 19 Aug 2024 14:42:00 -0600 Subject: [PATCH 25/51] web: be more explicit about root/leaf clusters (#45531) We use the terms "root" and "leaf" pervasively in our docs and our conversations with customers, but the web UI tends to refer to everything as a "trusted cluster" without distinguishing between root and leaf. After noticing us incorrectly describing which clusters are roots and which are leafs, I decided we should make the UI self-explanatory. - change sidebar title to indicate that the Trusted Clusters page is listing trusted *root* clusters - update the manage clusters page to label leaf clusters in addition to roots --- .../teleport/src/Clusters/ClusterList/ClusterList.tsx | 6 ++++-- .../teleport/src/TrustedClusters/TrustedClusters.tsx | 10 +++++----- web/packages/teleport/src/features.tsx | 2 +- web/packages/teleport/src/types.ts | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx b/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx index 521058416a98c..b15118c38e98c 100644 --- a/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx +++ b/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx @@ -22,7 +22,7 @@ import styled from 'styled-components'; import { MenuButton, MenuItem } from 'shared/components/MenuAction'; import Table, { Cell } from 'design/DataTable'; -import { Primary } from 'design/Label'; +import { Primary, Secondary } from 'design/Label'; import { Cluster } from 'teleport/services/clusters'; import cfg from 'teleport/config'; @@ -61,7 +61,9 @@ export default function ClustersList(props: Props) { function renderRootLabelCell({ clusterId }: Cluster) { const isRoot = cfg.proxyCluster === clusterId; return ( - {isRoot && ROOT} + + {isRoot ? ROOT : LEAF} + ); } diff --git a/web/packages/teleport/src/TrustedClusters/TrustedClusters.tsx b/web/packages/teleport/src/TrustedClusters/TrustedClusters.tsx index e1ace0ea3affa..9144cf009133b 100644 --- a/web/packages/teleport/src/TrustedClusters/TrustedClusters.tsx +++ b/web/packages/teleport/src/TrustedClusters/TrustedClusters.tsx @@ -47,8 +47,8 @@ export default function TrustedClusters() { const title = resources.status === 'creating' - ? 'Add a new trusted cluster' - : 'Edit trusted cluster'; + ? 'Add a new trusted root cluster' + : 'Edit trusted root cluster'; function onRemove() { return remove(resources.item.name); @@ -63,7 +63,7 @@ export default function TrustedClusters() { return ( - Trusted Clusters + Trusted Root Clusters {hasClusters && (