From 40f33846cf20205148bb10346b0d9b61444235de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 28 Mar 2022 15:27:46 +0200 Subject: [PATCH 01/50] Changes for tctl sso test, tctl sso configure commands --- api/types/sso.go | 24 +++++ e | 2 +- lib/auth/apiserver.go | 19 ++++ lib/auth/auth_test.go | 9 +- lib/auth/auth_with_roles.go | 16 ++++ lib/auth/clt.go | 34 ++++++- lib/auth/github.go | 22 +++++ lib/auth/saml.go | 174 +++++++++++++++++++++++++++++------- lib/auth/saml_test.go | 2 +- lib/client/api.go | 2 +- lib/client/redirect.go | 64 +++++++++---- lib/client/weblogin.go | 4 +- lib/events/codes.go | 4 + lib/services/identity.go | 23 ++++- lib/services/local/users.go | 49 ++++++++++ lib/services/saml.go | 58 +++++++----- lib/web/apiserver.go | 13 +++ lib/web/saml.go | 16 ++++ 18 files changed, 455 insertions(+), 80 deletions(-) create mode 100644 api/types/sso.go diff --git a/api/types/sso.go b/api/types/sso.go new file mode 100644 index 0000000000000..ddf5e56ae61e0 --- /dev/null +++ b/api/types/sso.go @@ -0,0 +1,24 @@ +/* +Copyright 2022 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 types + +// SsoDiagInfoEntry records diagnostic information about sso auth requests. +type SsoDiagInfoEntry struct { + Key string `json:"key"` + Value interface{} `json:"value"` + ExtraInfo []interface{} `json:"extra_info,omitempty"` +} diff --git a/e b/e index 9956b32428b41..8a3ea77c36f82 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 9956b32428b41caa3f29c5ba8ccc0fe458c8e957 +Subproject commit 8a3ea77c36f82f710ffd3f546860c5331a772a8d diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index d9ee0df2029ad..beb18388fbf2b 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -212,6 +212,8 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.DELETE("/:version/saml/connectors/:id", srv.withAuth(srv.deleteSAMLConnector)) srv.POST("/:version/saml/requests/create", srv.withAuth(srv.createSAMLAuthRequest)) srv.POST("/:version/saml/requests/validate", srv.withAuth(srv.validateSAMLResponse)) + srv.GET("/:version/saml/requests/get/:id", srv.withAuth(srv.getSAMLAuthRequest)) + srv.GET("/:version/saml/requests/diag/:id", srv.withAuth(srv.getSAMLDiagnosticInfo)) // Github connector srv.POST("/:version/github/connectors", srv.withAuth(srv.createGithubConnector)) @@ -1430,6 +1432,23 @@ func (s *APIServer) createSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r return response, nil } +func (s *APIServer) getSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { + request, err := auth.GetSAMLAuthRequest(p.ByName("id")) + if err != nil { + return nil, trace.Wrap(err) + } + return request, nil +} + +func (s *APIServer) getSAMLDiagnosticInfo(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { + info, err := auth.GetSAMLDiagnosticInfo(r.Context(), p.ByName("id")) + if err != nil { + return nil, trace.Wrap(err) + } + + return info, nil +} + type validateSAMLResponseReq struct { Response string `json:"response"` } diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index 08b7d2813712f..5971e0075545e 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -990,7 +990,14 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) { AssertionConsumerService: "a", Issuer: "b", SSO: "c", - Cert: string(certBytes), + AttributesToRoles: []types.AttributeMapping{ + { + Name: "dummy", + Value: "dummy", + Roles: []string{"dummy"}, + }, + }, + Cert: string(certBytes), }) require.NoError(t, err) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index b173dd0eebba8..54c5655c9cfc6 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2342,6 +2342,22 @@ func (a *ServerWithRoles) ValidateSAMLResponse(re string) (*SAMLAuthResponse, er return a.authServer.ValidateSAMLResponse(re) } +func (a *ServerWithRoles) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { + if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + return a.authServer.GetSAMLAuthRequest(id) +} + +func (a *ServerWithRoles) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { + if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + return a.authServer.GetSAMLDiagnosticInfo(ctx, authRequestId) +} + // DeleteSAMLConnector deletes a SAML connector by name. func (a *ServerWithRoles) DeleteSAMLConnector(ctx context.Context, connectorID string) error { if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbDelete); err != nil { diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 68f75a5c99148..1624ca3dc6f15 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1162,6 +1162,32 @@ func (c *Client) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. return response, nil } +// GetSAMLAuthRequest gets SAML AuthnRequest +func (c *Client) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { + out, err := c.Get(context.Background(), c.Endpoint("saml", "requests", "get", id), url.Values{}) + if err != nil { + return nil, trace.Wrap(err) + } + var response *services.SAMLAuthRequest + if err := json.Unmarshal(out.Bytes(), &response); err != nil { + return nil, trace.Wrap(err) + } + return response, nil +} + +// GetSAMLDiagnosticInfo gets SAML diagnostic info. +func (c *Client) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { + out, err := c.Get(ctx, c.Endpoint("saml", "requests", "diag", authRequestId), url.Values{}) + if err != nil { + return nil, trace.Wrap(err) + } + var response map[string]types.SsoDiagInfoEntry + if err := json.Unmarshal(out.Bytes(), &response); err != nil { + return nil, trace.Wrap(err) + } + return response, nil +} + // ValidateSAMLResponse validates response returned by SAML identity provider func (c *Client) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) { out, err := c.PostJSON(context.TODO(), c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{ @@ -1741,7 +1767,7 @@ type IdentityService interface { // GetSAMLConnector returns SAML connector information by id GetSAMLConnector(ctx context.Context, id string, withSecrets bool) (types.SAMLConnector, error) - // GetSAMLConnector gets SAML connectors list + // GetSAMLConnectors gets SAML connectors list GetSAMLConnectors(ctx context.Context, withSecrets bool) ([]types.SAMLConnector, error) // DeleteSAMLConnector deletes SAML connector by ID @@ -1753,6 +1779,12 @@ type IdentityService interface { // ValidateSAMLResponse validates SAML auth response ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) + // GetSAMLAuthRequest returns SAML auth request if found + GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) + + // GetSAMLDiagnosticInfo TODO + GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) + // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error // UpsertGithubConnector creates or updates a Github connector diff --git a/lib/auth/github.go b/lib/auth/github.go index 2872aeee55bfb..cb271b954eac3 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -334,6 +334,28 @@ type createUserParams struct { sessionTTL time.Duration } +func (params createUserParams) toMap() map[string]interface{} { + result := map[string]interface{}{} + + result["connectorName"] = params.connectorName + result["username"] = params.username + result["roles"] = params.roles + result["traits"] = params.traits + result["sessionTTL"] = params.sessionTTL + + if len(params.logins) > 0 { + result["logins"] = params.logins + } + if len(params.kubeGroups) > 0 { + result["kubeGroups"] = params.kubeGroups + } + if len(params.kubeUsers) > 0 { + result["kubeUsers"] = params.kubeUsers + } + + return result +} + func (a *Server) calculateGithubUser(connector types.GithubConnector, claims *types.GithubClaims, request *services.GithubAuthRequest) (*createUserParams, error) { p := createUserParams{ connectorName: connector.GetName(), diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 8a97bee746508..3265b0a60deaa 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -85,11 +85,7 @@ func (a *Server) DeleteSAMLConnector(ctx context.Context, connectorName string) func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error) { ctx := context.TODO() - connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) - if err != nil { - return nil, trace.Wrap(err) - } - provider, err := a.getSAMLProvider(connector) + connector, provider, err := a.getConnectorAndProvider(ctx, req) if err != nil { return nil, trace.Wrap(err) } @@ -128,6 +124,44 @@ func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. return &req, nil } +func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLAuthRequest) (types.SAMLConnector, *saml2.SAMLServiceProvider, error) { + var connector types.SAMLConnector + var provider *saml2.SAMLServiceProvider + var err error + + if req.SSOTestFlow { + // stateless test flow + connector, err = types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) + if err != nil { + return nil, nil, err + } + + // validate, set defaults for connector + err := services.ValidateSAMLConnector(connector) + if err != nil { + return nil, nil, err + } + + // we don't want to cache the provider. construct it directly instead of using a.getSAMLProvider() + provider, err = services.GetSAMLServiceProvider(connector, a.clock) + if err != nil { + return nil, nil, trace.Wrap(err) + } + } else { + // regular execution flow + connector, err = a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) + if err != nil { + return nil, nil, trace.Wrap(err) + } + provider, err = a.getSAMLProvider(connector) + if err != nil { + return nil, nil, trace.Wrap(err) + } + } + + return connector, provider, nil +} + func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServiceProvider, error) { a.lock.Lock() defer a.lock.Unlock() @@ -158,11 +192,17 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo p.traits = services.SAMLAssertionsToTraits(assertionInfo) + _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLTraitsFromAssertions, p.traits) + _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLConnectorTraitMapping, connector.GetTraitMappings()) + var warnings []string warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits) if len(p.roles) == 0 { if len(warnings) != 0 { + _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLAttributesToRolesWarnings, "No roles mapped for the user", warnings) log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) + } else { + _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLAttributesToRolesWarnings, "No roles mapped for the user. The mappings may contain typos.") } return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName()) } @@ -178,7 +218,7 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo return &p, nil } -func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { +func (a *Server) createSAMLUser(p *createUserParams, dryRun bool) (types.User, error) { expires := a.GetClock().Now().UTC().Add(p.sessionTTL) log.Debugf("Generating dynamic SAML identity %v/%v with roles: %v.", p.connectorName, p.username, p.roles) @@ -214,6 +254,10 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { }, } + if dryRun { + return user, nil + } + // Get the user to check if it already exists or not. existingUser, err := a.Identity.GetUser(p.username, false) if err != nil && !trace.IsNotFound(err) { @@ -247,7 +291,7 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) { return user, nil } -func parseSAMLInResponseTo(response string) (string, error) { +func ParseSAMLInResponseTo(response string) (string, error) { raw, _ := base64.StdEncoding.DecodeString(response) doc := etree.NewDocument() @@ -315,7 +359,9 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e }, Method: events.LoginMethodSAML, } - re, err := a.validateSAMLResponse(samlResponse) + + re, request, err := a.validateSAMLResponse(samlResponse) + if re != nil && re.attributeStatements != nil { attributes, err := apievents.EncodeMapStrings(re.attributeStatements) if err != nil { @@ -326,8 +372,14 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } } + testFlow := request.SSOTestFlow + if err != nil { - event.Code = events.UserSSOLoginFailureCode + if testFlow { + event.Code = events.UserSSOTestFlowLoginFailureCode + } else { + event.Code = events.UserSSOLoginFailureCode + } event.Status.Success = false event.Status.Error = trace.Unwrap(err).Error() event.Status.UserMessage = err.Error() @@ -336,14 +388,22 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } return nil, trace.Wrap(err) } + event.Status.Success = true event.User = re.auth.Username - event.Code = events.UserSSOLoginCode + if testFlow { + event.Code = events.UserSSOTestFlowLoginCode + } else { + event.Code = events.UserSSOLoginCode + } if err := a.emitter.EmitAuditEvent(a.closeCtx, event); err != nil { log.WithError(err).Warn("Failed to emit SAML login event.") } + if err != nil { + return nil, err + } return &re.auth, nil } @@ -352,36 +412,62 @@ type samlAuthResponse struct { attributeStatements map[string][]string } -func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, error) { +const ( + DiagInfoError = "common.error" + DiagInfoResult = "common.result" + DiagInfoCreateUserParams = "common.createUserParams" + DiagInfoSAMLAttributesToRoles = "SAML.attributesToRoles" + DiagInfoSAMLAttributesToRolesWarnings = "SAML.attributesToRolesWarnings" + DiagInfoSAMLAssertionInfo = "SAML.assertionInfo" + DiagInfoSAMLAttributeStatements = "SAML.attributeStatements" + DiagInfoSAMLTraitsFromAssertions = "SAML.traits" + DiagInfoSAMLConnectorTraitMapping = "SAML.connector_traits" +) + +func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, *services.SAMLAuthRequest, error) { ctx := context.TODO() - requestID, err := parseSAMLInResponseTo(samlResponse) + + requestID, err := ParseSAMLInResponseTo(samlResponse) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } - request, err := a.Identity.GetSAMLAuthRequest(requestID) - if err != nil { - return nil, trace.Wrap(err) + + traceErr := func(msg string, errInfo error) { + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoError, msg, errInfo.Error()) } - connector, err := a.Identity.GetSAMLConnector(ctx, request.ConnectorID, true) + + request, err := a.Identity.GetSAMLAuthRequest(requestID) if err != nil { - return nil, trace.Wrap(err) + traceErr("Failed to get SAML Auth Request", err) + return nil, request, trace.Wrap(err) } - provider, err := a.getSAMLProvider(connector) + + connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { - return nil, trace.Wrap(err) + traceErr("Failed to get SAML connector and provider", err) + return nil, request, err } + assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse) if err != nil { - return nil, trace.AccessDenied( + errV := trace.AccessDenied( "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err) + traceErr("Failed to retrieve assertion info. This may indicate IdP configuration error.", errV) + return nil, request, errV } + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAssertionInfo, assertionInfo) + if assertionInfo.WarningInfo.InvalidTime { - return nil, trace.AccessDenied("invalid time in SAML assertion info") + err = trace.AccessDenied("invalid time in SAML assertion info") + traceErr("SAML assertion info contained warning: invalid time.", err) + return nil, request, err } if assertionInfo.WarningInfo.NotInAudience { - return nil, trace.AccessDenied("no audience in SAML assertion info") + err = trace.AccessDenied("no audience in SAML assertion info") + traceErr("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.", err) + return nil, request, err } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) @@ -397,22 +483,34 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e re.attributeStatements[key] = vals } + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAttributeStatements, re.attributeStatements) + log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAttributesToRoles, connector.GetAttributesToRoles()) + if len(connector.GetAttributesToRoles()) == 0 { - return re, trace.BadParameter("no attributes to roles mapping, check connector documentation") + err = trace.BadParameter("no attributes to roles mapping, check connector documentation") + traceErr("Attributes-to-roles mapping is empty, SSO user will never have any roles.", err) + return re, request, err } + log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles())) // Calculate (figure out name, roles, traits, session TTL) of user and // create the user in the backend. params, err := a.calculateSAMLUser(connector, *assertionInfo, request) if err != nil { - return re, trace.Wrap(err) + traceErr("Failed to calculate user attributes.", err) + return re, request, trace.Wrap(err) } - user, err := a.createSAMLUser(params) + + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoCreateUserParams, params.toMap()) + + user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { - return re, trace.Wrap(err) + traceErr("Failed to create user from provided parameters.", err) + return re, request, trace.Wrap(err) } // Auth was successful, return session, certificate, etc. to caller. @@ -425,6 +523,12 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e Username: user.GetName(), } + // In test flow skip signing and creating web sessions. + if request.SSOTestFlow { + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoResult, "success") + return re, request, nil + } + // If the request is coming from a browser, create a web session. if request.CreateWebSession { session, err := a.createWebSession(ctx, types.NewWebSessionRequest{ @@ -434,8 +538,10 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e SessionTTL: params.sessionTTL, LoginTime: a.clock.Now().UTC(), }) + if err != nil { - return re, trace.Wrap(err) + traceErr("Failed to create web session.", err) + return re, request, trace.Wrap(err) } re.auth.Session = session @@ -445,11 +551,13 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e if len(request.PublicKey) != 0 { sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster) if err != nil { - return nil, trace.Wrap(err) + traceErr("Failed to create session certificate.", err) + return nil, request, trace.Wrap(err) } clusterName, err := a.GetClusterName() if err != nil { - return nil, trace.Wrap(err) + traceErr("Failed to obtain cluster name.", err) + return nil, request, trace.Wrap(err) } re.auth.Cert = sshCert re.auth.TLSCert = tlsCert @@ -460,10 +568,12 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e DomainName: clusterName.GetClusterName(), }, false) if err != nil { - return nil, trace.Wrap(err) + traceErr("Failed to obtain cluster's host CA.", err) + return nil, request, trace.Wrap(err) } re.auth.HostSigners = append(re.auth.HostSigners, authority) } - return re, nil + _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoResult, "success") + return re, request, nil } diff --git a/lib/auth/saml_test.go b/lib/auth/saml_test.go index 0700b6b3bb63f..bbbbc602deeed 100644 --- a/lib/auth/saml_test.go +++ b/lib/auth/saml_test.go @@ -63,7 +63,7 @@ func TestCreateSAMLUser(t *testing.T) { logins: []string{"foo"}, roles: []string{"admin"}, sessionTTL: 1 * time.Minute, - }) + }, false) require.NoError(t, err) // Within that 1 minute period the user should still exist. diff --git a/lib/client/api.go b/lib/client/api.go index 1110d1aa5dcd2..5df9300dac2c3 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -2741,7 +2741,7 @@ func (tc *TeleportClient) ssoLogin(ctx context.Context, connectorID string, pub Protocol: protocol, BindAddr: tc.BindAddr, Browser: tc.Browser, - }) + }, nil) return response, trace.Wrap(err) } diff --git a/lib/client/redirect.go b/lib/client/redirect.go index 78324c9f2c0cb..1e6d954063300 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -75,10 +75,14 @@ type Redirector struct { context context.Context // cancel broadcasts cancel cancel context.CancelFunc + // issueSSOLoginConsoleRequest if not nil will be used as custom implementation of IssueSSOLoginConsoleRequest function. + issueSSOLoginConsoleRequest IssueSSOLoginConsoleRequest } +type IssueSSOLoginConsoleRequest func(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) + // NewRedirector returns new local web server redirector -func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) { +func NewRedirector(ctx context.Context, login SSHLoginSSO, issueLogin IssueSSOLoginConsoleRequest) (*Redirector, error) { clt, proxyURL, err := initClient(login.ProxyAddr, login.Insecure, login.Pool) if err != nil { return nil, trace.Wrap(err) @@ -93,16 +97,17 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) context, cancel := context.WithCancel(ctx) rd := &Redirector{ - context: context, - cancel: cancel, - proxyClient: clt, - proxyURL: proxyURL, - SSHLoginSSO: login, - mux: http.NewServeMux(), - key: key, - shortPath: "/" + uuid.New().String(), - responseC: make(chan *auth.SSHLoginResponse, 1), - errorC: make(chan error, 1), + context: context, + cancel: cancel, + proxyClient: clt, + proxyURL: proxyURL, + SSHLoginSSO: login, + mux: http.NewServeMux(), + key: key, + shortPath: "/" + uuid.New().String(), + responseC: make(chan *auth.SSHLoginResponse, 1), + errorC: make(chan error, 1), + issueSSOLoginConsoleRequest: issueLogin, } // callback is a callback URL communicated to the Teleport proxy, @@ -145,7 +150,7 @@ func (rd *Redirector) Start() error { query.Set("secret_key", rd.key.String()) u.RawQuery = query.Encode() - out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), SSOLoginConsoleReq{ + req := SSOLoginConsoleReq{ RedirectURL: u.String(), PublicKey: rd.PubKey, CertTTL: rd.TTL, @@ -153,24 +158,40 @@ func (rd *Redirector) Start() error { Compatibility: rd.Compatibility, RouteToCluster: rd.RouteToCluster, KubernetesCluster: rd.KubernetesCluster, - }) - if err != nil { - return trace.Wrap(err) } - var re *SSOLoginConsoleResponse - err = json.Unmarshal(out.Bytes(), &re) + response, err := rd.IssueSSOLoginConsoleRequest(req) if err != nil { - return trace.Wrap(err) + return err } + // notice late binding of the redirect URL here, it is referenced // in the callback handler, but is known only after the request // is sent to the Teleport Proxy, that's why // redirectURL is a SyncString - rd.redirectURL.Set(re.RedirectURL) + rd.redirectURL.Set(response.RedirectURL) return nil } +func (rd *Redirector) IssueSSOLoginConsoleRequest(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) { + if rd.issueSSOLoginConsoleRequest != nil { + return rd.issueSSOLoginConsoleRequest(req) + } + + out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), req) + if err != nil { + return nil, trace.Wrap(err) + } + + var re *SSOLoginConsoleResponse + err = json.Unmarshal(out.Bytes(), &re) + if err != nil { + return nil, trace.Wrap(err) + } + + return re, nil +} + // Done is called when redirector is closed // or parent context is closed func (rd *Redirector) Done() <-chan struct{} { @@ -202,6 +223,11 @@ func (rd *Redirector) callback(w http.ResponseWriter, r *http.Request) (*auth.SS return nil, trace.NotFound("path not found") } + if r.URL.Query().Has("err") { + err := r.URL.Query().Get("err") + return nil, trace.Errorf("sso flow failed, error: %v", err) + } + // Decrypt ciphertext to get login response. plaintext, err := rd.key.Open([]byte(r.URL.Query().Get("response"))) if err != nil { diff --git a/lib/client/weblogin.go b/lib/client/weblogin.go index 6148704369663..bf2ec7b96f646 100644 --- a/lib/client/weblogin.go +++ b/lib/client/weblogin.go @@ -253,8 +253,8 @@ func initClient(proxyAddr string, insecure bool, pool *x509.CertPool) (*WebClien } // SSHAgentSSOLogin is used by tsh to fetch user credentials using OpenID Connect (OIDC) or SAML. -func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO) (*auth.SSHLoginResponse, error) { - rd, err := NewRedirector(ctx, login) +func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO, issueLogin IssueSSOLoginConsoleRequest) (*auth.SSHLoginResponse, error) { + rd, err := NewRedirector(ctx, login, issueLogin) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/events/codes.go b/lib/events/codes.go index 9d0032d94c5b2..b72d307fdada3 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -304,6 +304,10 @@ const ( // RecoveryCodeUseFailureCode is an event code for when a // recovery code was not used successfully. RecoveryCodeUseFailureCode = "T1009W" + // UserSSOTestFlowLoginCode is the successful SSO test flow user login event code. + UserSSOTestFlowLoginCode = "T1010I" + // UserSSOTestFlowLoginFailureCode is the unsuccessful SSO test flow user login event code. + UserSSOTestFlowLoginFailureCode = "T1011W" // BillingCardCreateCode is an event code for when a user creates a new credit card. BillingCardCreateCode = "TBL00I" diff --git a/lib/services/identity.go b/lib/services/identity.go index ac34ad87f44d8..7d95f635302ff 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -202,9 +202,15 @@ type Identity interface { // CreateSAMLAuthRequest creates new auth request CreateSAMLAuthRequest(req SAMLAuthRequest, ttl time.Duration) error - // GetSAMLAuthRequest returns OSAML auth request if found + // GetSAMLAuthRequest returns SAML auth request if found GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) + // TraceSAMLDiagnosticInfo TODO + TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error + + // GetSAMLDiagnosticInfo TODO + GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) + // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error @@ -473,6 +479,12 @@ type SAMLAuthRequest struct { // KubernetesCluster is the name of Kubernetes cluster to issue credentials for. KubernetesCluster string `json:"kubernetes_cluster,omitempty"` + + // SSOTestFlow indicates if the request is part of the test flow. + SSOTestFlow bool `json:"sso_test_flow"` + + // ConnectorSpec is embedded connector spec for use in test flow. + ConnectorSpec *types.SAMLConnectorSpecV2 `json:"connector_spec,omitempty"` } // Check returns nil if all parameters are great, err otherwise @@ -490,6 +502,15 @@ func (i *SAMLAuthRequest) Check() error { } } + // we could collapse these two checks into one, but the error message would become ambiguous. + if i.SSOTestFlow && i.ConnectorSpec == nil { + return trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") + } + + if !i.SSOTestFlow && i.ConnectorSpec != nil { + return trace.BadParameter("ConnectorSpec must be nil when SSOTestFlow is false") + } + return nil } diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 2f64cd2c8ce70..a830ade17c718 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1215,6 +1215,54 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return &req, nil } +func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error { + if authRequestId == "" { + return trace.BadParameter("missing parameter authRequestId") + } + jsonValue, err := json.Marshal(types.SsoDiagInfoEntry{ + Key: key, + Value: value, + ExtraInfo: extraInfo, + }) + if err != nil { + return trace.Wrap(err) + } + + item := backend.Item{ + Key: backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestId, uuid.New().String()), + Value: jsonValue, + Expires: backend.Expiry(s.Clock(), time.Minute*15), + } + _, err = s.Create(ctx, item) + if err != nil { + return trace.Wrap(err) + } + return nil +} + +func (s *IdentityService) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { + if authRequestId == "" { + return nil, trace.BadParameter("missing parameter id") + } + + startKey := backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestId) + result, err := s.GetRange(ctx, startKey, backend.RangeEnd(startKey), backend.NoLimit) + if err != nil { + return nil, trace.Wrap(err) + } + + out := make(map[string]types.SsoDiagInfoEntry) + for _, item := range result.Items { + var req types.SsoDiagInfoEntry + if err := json.Unmarshal(item.Value, &req); err != nil { + return nil, trace.Wrap(err) + } + out[req.Key] = req + } + + return out, nil +} + // CreateGithubConnector creates a new Github connector func (s *IdentityService) CreateGithubConnector(connector types.GithubConnector) error { if err := connector.CheckAndSetDefaults(); err != nil { @@ -1485,6 +1533,7 @@ const ( samlPrefix = "saml" githubPrefix = "github" requestsPrefix = "requests" + requestsTracePrefix = "requestsTrace" usedTOTPPrefix = "used_totp" usedTOTPTTL = 30 * time.Second mfaDevicePrefix = "mfa" diff --git a/lib/services/saml.go b/lib/services/saml.go index 4a360f9fe553a..ef17d22bd38e8 100644 --- a/lib/services/saml.go +++ b/lib/services/saml.go @@ -69,7 +69,7 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { } sc.SetIssuer(metadata.EntityID) - if len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 { + if metadata.IDPSSODescriptor != nil && len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 { sc.SetSSO(metadata.IDPSSODescriptor.SingleSignOnServices[0].Location) } } @@ -95,6 +95,10 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { }) } + if len(sc.GetAttributesToRoles()) == 0 { + return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never give any roles.") + } + log.Debugf("[SAML] SSO: %v", sc.GetSSO()) log.Debugf("[SAML] Issuer: %v", sc.GetIssuer()) log.Debugf("[SAML] ACS: %v", sc.GetAssertionConsumerService()) @@ -124,33 +128,45 @@ func SAMLAssertionsToTraits(assertions saml2.AssertionInfo) map[string][]string return traits } -// GetSAMLServiceProvider gets the SAMLConnector's service provider -func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) { - certStore := dsig.MemoryX509CertificateStore{ - Roots: []*x509.Certificate{}, +// CheckSAMLEntityDescriptor checks if the entity descriptor XML is valid and has at least one valid certificate. +func CheckSAMLEntityDescriptor(entityDescriptor string) ([]*x509.Certificate, error) { + if entityDescriptor == "" { + return nil, nil } - if sc.GetEntityDescriptor() != "" { - metadata := &samltypes.EntityDescriptor{} - if err := xml.Unmarshal([]byte(sc.GetEntityDescriptor()), metadata); err != nil { - return nil, trace.Wrap(err, "failed to parse entity_descriptor") - } + metadata := &samltypes.EntityDescriptor{} + if err := xml.Unmarshal([]byte(entityDescriptor), metadata); err != nil { + return nil, trace.Wrap(err, "failed to parse entity_descriptor") + } - for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors { - for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates { - certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data)) - if err != nil { - return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor") - } - cert, err := x509.ParseCertificate(certData) - if err != nil { - return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor") - } - certStore.Roots = append(certStore.Roots, cert) + var roots []*x509.Certificate + + for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors { + for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates { + certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data)) + if err != nil { + return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor") + } + cert, err := x509.ParseCertificate(certData) + if err != nil { + return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor") } + roots = append(roots, cert) } } + return roots, nil +} + +// GetSAMLServiceProvider gets the SAMLConnector's service provider +func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) { + roots, errEd := CheckSAMLEntityDescriptor(sc.GetEntityDescriptor()) + if errEd != nil { + return nil, errEd + } + + certStore := dsig.MemoryX509CertificateStore{Roots: roots} + if sc.GetCert() != "" { cert, err := tlsca.ParseCertificatePEM([]byte(sc.GetCert())) if err != nil { diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index dee258c1876f2..69a85648fa761 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1331,6 +1331,19 @@ func ConstructSSHResponse(response AuthParams) (*url.URL, error) { return u, nil } +func returnErrorToClient(clientRedirectURL string, errReply error) (*url.URL, error) { + u, err := url.Parse(clientRedirectURL) + if err != nil { + return nil, trace.Wrap(err) + } + + values := u.Query() + values.Set("err", errReply.Error()) + + u.RawQuery = values.Encode() + return u, nil +} + // CreateSessionReq is a request to create session from username, password and // second factor token. type CreateSessionReq struct { diff --git a/lib/web/saml.go b/lib/web/saml.go index f618404161802..689687039b8e0 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -19,6 +19,8 @@ package web import ( "net/http" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/services" @@ -97,8 +99,22 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P } response, err := h.cfg.ProxyClient.ValidateSAMLResponse(samlResponse) + if err != nil { logger.WithError(err).Error("Error while processing callback.") + + // try to find the requestID, which bears the original client redirect URL. + // if found, use it to terminate the flow. + // + // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. + if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil { + if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(requestID); errGet == nil { + if url, errEnc := returnErrorToClient(request.ClientRedirectURL, err); errEnc == nil { + return url.String() + } + } + } + return client.LoginFailedBadCallbackRedirectURL } From e3601a5c840f10c4745ede111d86a366c3a2d346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 29 Mar 2022 11:42:19 +0200 Subject: [PATCH 02/50] Make SSO logging aware of test flows. --- lib/auth/auth_test.go | 17 ++++++++++++++++- lib/auth/auth_with_roles.go | 17 ++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index b033a9110359b..b00fd8ed2aa45 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -1020,7 +1020,7 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) { func TestEmitSSOLoginFailureEvent(t *testing.T) { mockE := &events.MockEmitter{} - emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error")) + emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), false) require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{ Metadata: apievents.Metadata{ @@ -1034,6 +1034,21 @@ func TestEmitSSOLoginFailureEvent(t *testing.T) { UserMessage: "some error", }, }) + + emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), true) + + require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{ + Metadata: apievents.Metadata{ + Type: events.UserLoginEvent, + Code: events.UserSSOTestFlowLoginFailureCode, + }, + Method: "test", + Status: apievents.Status{ + Success: false, + Error: "some error", + UserMessage: "some error", + }, + }) } func TestGenerateUserCertWithCertExtension(t *testing.T) { diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 54c5655c9cfc6..a461b6c5f0d99 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2253,7 +2253,8 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(req services.OIDCAuthRequest) (* oidcReq, err := a.authServer.CreateOIDCAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err) + // TODO(Tener): Update `testFlow` flag once OIDC SSO starts supporting test flows. + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err, false) return nil, trace.Wrap(err) } @@ -2330,7 +2331,7 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (* samlReq, err := a.authServer.CreateSAMLAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err) + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err, req.SSOTestFlow) return nil, trace.Wrap(err) } @@ -2451,7 +2452,8 @@ func (a *ServerWithRoles) CreateGithubAuthRequest(req services.GithubAuthRequest githubReq, err := a.authServer.CreateGithubAuthRequest(req) if err != nil { - emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err) + // TODO(Tener): Update `testFlow` flag once GitHub SSO starts supporting test flows. + emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err, false) return nil, trace.Wrap(err) } @@ -4312,11 +4314,16 @@ func NewAdminAuthServer(authServer *Server, sessions session.Service, alog event }, nil } -func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error) { +func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error, testFlow bool) { + code := events.UserSSOLoginFailureCode + if testFlow { + code = events.UserSSOTestFlowLoginFailureCode + } + emitErr := emitter.EmitAuditEvent(ctx, &apievents.UserLogin{ Metadata: apievents.Metadata{ Type: events.UserLoginEvent, - Code: events.UserSSOLoginFailureCode, + Code: code, }, Method: method, Status: apievents.Status{ From 6baf3475302a283ac5367543dc947ef0433a608a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 29 Mar 2022 14:06:10 +0200 Subject: [PATCH 03/50] Proper method comments. --- lib/auth/clt.go | 4 ++-- lib/services/identity.go | 4 ++-- lib/services/local/users.go | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 1624ca3dc6f15..7c88b795d11ac 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1175,7 +1175,7 @@ func (c *Client) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error return response, nil } -// GetSAMLDiagnosticInfo gets SAML diagnostic info. +// GetSAMLDiagnosticInfo returns SAML diagnostic info records. func (c *Client) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { out, err := c.Get(ctx, c.Endpoint("saml", "requests", "diag", authRequestId), url.Values{}) if err != nil { @@ -1782,7 +1782,7 @@ type IdentityService interface { // GetSAMLAuthRequest returns SAML auth request if found GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) - // GetSAMLDiagnosticInfo TODO + // GetSAMLDiagnosticInfo returns SAML diagnostic info records. GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) // CreateGithubConnector creates a new Github connector diff --git a/lib/services/identity.go b/lib/services/identity.go index 7d95f635302ff..1168fcc4a8770 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -205,10 +205,10 @@ type Identity interface { // GetSAMLAuthRequest returns SAML auth request if found GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) - // TraceSAMLDiagnosticInfo TODO + // TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error - // GetSAMLDiagnosticInfo TODO + // GetSAMLDiagnosticInfo returns SAML diagnostic info records. GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) // CreateGithubConnector creates a new Github connector diff --git a/lib/services/local/users.go b/lib/services/local/users.go index a830ade17c718..6091c688c605f 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1215,6 +1215,7 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return &req, nil } +// TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error { if authRequestId == "" { return trace.BadParameter("missing parameter authRequestId") @@ -1240,6 +1241,7 @@ func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authReque return nil } +// GetSAMLDiagnosticInfo returns SAML diagnostic info records. func (s *IdentityService) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { if authRequestId == "" { return nil, trace.BadParameter("missing parameter id") From 5d63ea4108ec311fcdf77eac1e4212ea810cae79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 29 Mar 2022 14:09:50 +0200 Subject: [PATCH 04/50] Linter issues. --- lib/auth/auth_with_roles.go | 4 ++-- lib/auth/clt.go | 6 +++--- lib/services/identity.go | 4 ++-- lib/services/local/users.go | 14 +++++++------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index a461b6c5f0d99..819ef4228d20c 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2351,12 +2351,12 @@ func (a *ServerWithRoles) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return a.authServer.GetSAMLAuthRequest(id) } -func (a *ServerWithRoles) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { +func (a *ServerWithRoles) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) } - return a.authServer.GetSAMLDiagnosticInfo(ctx, authRequestId) + return a.authServer.GetSAMLDiagnosticInfo(ctx, authRequestID) } // DeleteSAMLConnector deletes a SAML connector by name. diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 7c88b795d11ac..de4a9b05ab8c4 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1176,8 +1176,8 @@ func (c *Client) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error } // GetSAMLDiagnosticInfo returns SAML diagnostic info records. -func (c *Client) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { - out, err := c.Get(ctx, c.Endpoint("saml", "requests", "diag", authRequestId), url.Values{}) +func (c *Client) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { + out, err := c.Get(ctx, c.Endpoint("saml", "requests", "diag", authRequestID), url.Values{}) if err != nil { return nil, trace.Wrap(err) } @@ -1783,7 +1783,7 @@ type IdentityService interface { GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) // GetSAMLDiagnosticInfo returns SAML diagnostic info records. - GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) + GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/services/identity.go b/lib/services/identity.go index 1168fcc4a8770..ea3ee8d66ff01 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -206,10 +206,10 @@ type Identity interface { GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) // TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. - TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error + TraceSAMLDiagnosticInfo(ctx context.Context, authRequestID string, key string, value interface{}, extraInfo ...interface{}) error // GetSAMLDiagnosticInfo returns SAML diagnostic info records. - GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) + GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 6091c688c605f..f48f93787303e 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1216,9 +1216,9 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque } // TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. -func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authRequestId string, key string, value interface{}, extraInfo ...interface{}) error { - if authRequestId == "" { - return trace.BadParameter("missing parameter authRequestId") +func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authRequestID string, key string, value interface{}, extraInfo ...interface{}) error { + if authRequestID == "" { + return trace.BadParameter("missing parameter authRequestID") } jsonValue, err := json.Marshal(types.SsoDiagInfoEntry{ Key: key, @@ -1230,7 +1230,7 @@ func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authReque } item := backend.Item{ - Key: backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestId, uuid.New().String()), + Key: backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestID, uuid.New().String()), Value: jsonValue, Expires: backend.Expiry(s.Clock(), time.Minute*15), } @@ -1242,12 +1242,12 @@ func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authReque } // GetSAMLDiagnosticInfo returns SAML diagnostic info records. -func (s *IdentityService) GetSAMLDiagnosticInfo(ctx context.Context, authRequestId string) (map[string]types.SsoDiagInfoEntry, error) { - if authRequestId == "" { +func (s *IdentityService) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { + if authRequestID == "" { return nil, trace.BadParameter("missing parameter id") } - startKey := backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestId) + startKey := backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestID) result, err := s.GetRange(ctx, startKey, backend.RangeEnd(startKey), backend.NoLimit) if err != nil { return nil, trace.Wrap(err) From 93214311fc5ed481e0debf083b28658d7301eecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 29 Mar 2022 16:38:52 +0200 Subject: [PATCH 05/50] require additional permissions for SSO test flow. --- lib/auth/auth_with_roles.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 819ef4228d20c..9cfcd12aa4895 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2329,6 +2329,13 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (* return nil, trace.Wrap(err) } + // require additional permissions for executing SSO test flow. + if req.SSOTestFlow { + if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + } + samlReq, err := a.authServer.CreateSAMLAuthRequest(req) if err != nil { emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err, req.SSOTestFlow) From cbd10909445fc02a3220b444c88edc79aa95dbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 29 Mar 2022 16:41:37 +0200 Subject: [PATCH 06/50] Update submodule --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index 8a3ea77c36f82..2c7360026638e 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 8a3ea77c36f82f710ffd3f546860c5331a772a8d +Subproject commit 2c7360026638e8fc49e5012866a6607ab2d596f7 From 097f671b352c104c07a444c5e826bf9e3706213c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Wed, 30 Mar 2022 15:37:41 +0200 Subject: [PATCH 07/50] Correct the comment. --- lib/web/saml.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/saml.go b/lib/web/saml.go index 689687039b8e0..a867ff65a2fa7 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -103,7 +103,7 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P if err != nil { logger.WithError(err).Error("Error while processing callback.") - // try to find the requestID, which bears the original client redirect URL. + // try to find the auth request, which bears the original client redirect URL. // if found, use it to terminate the flow. // // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. From 0a6cb7f3c58c64d850082768711dff1f2a0604b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Wed, 30 Mar 2022 16:54:41 +0200 Subject: [PATCH 08/50] Take into account possibly nil variable. --- lib/auth/saml.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 3265b0a60deaa..254c7da3ac799 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -372,7 +372,7 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } } - testFlow := request.SSOTestFlow + testFlow := request != nil && request.SSOTestFlow if err != nil { if testFlow { From 1e528aa81fab6b38435f2d4d35875d465fe73818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:49:23 +0200 Subject: [PATCH 09/50] Declare SSOInfoType as protobuf message. --- api/types/sso.go | 34 +- api/types/sso_test.go | 127 +++ api/types/types.pb.go | 1783 ++++++++++++++++++++++++----------------- api/types/types.proto | 33 + 4 files changed, 1222 insertions(+), 755 deletions(-) create mode 100644 api/types/sso_test.go diff --git a/api/types/sso.go b/api/types/sso.go index ddf5e56ae61e0..d195da2d6e9a3 100644 --- a/api/types/sso.go +++ b/api/types/sso.go @@ -16,9 +16,33 @@ limitations under the License. package types -// SsoDiagInfoEntry records diagnostic information about sso auth requests. -type SsoDiagInfoEntry struct { - Key string `json:"key"` - Value interface{} `json:"value"` - ExtraInfo []interface{} `json:"extra_info,omitempty"` +import ( + "encoding/json" + + "github.com/gravitational/trace" +) + +// NewSSODiagnosticInfo creates new SSODiagnosticInfo object using arbitrary value, which is serialized using JSON. +func NewSSODiagnosticInfo(infoType SSOInfoType, value interface{}) (*SSODiagnosticInfo, error) { + out, err := json.Marshal(value) + if err != nil { + return nil, trace.Wrap(err) + } + + return &SSODiagnosticInfo{InfoType: infoType, Value: out}, nil +} + +// GetValue deserializes embedded JSON of SSODiagnosticInfo.Value with no assumption about underlying type. +func (m *SSODiagnosticInfo) GetValue() (interface{}, error) { + var value interface{} + err := json.Unmarshal(m.Value, &value) + if err != nil { + return nil, trace.Wrap(err) + } + return value, nil +} + +// GetValueTyped deserializes embedded JSON of SSODiagnosticInfo.Value given typed pointer. +func (m *SSODiagnosticInfo) GetValueTyped(value interface{}) error { + return trace.Wrap(json.Unmarshal(m.Value, &value)) } diff --git a/api/types/sso_test.go b/api/types/sso_test.go new file mode 100644 index 0000000000000..a1f53bb9ad46b --- /dev/null +++ b/api/types/sso_test.go @@ -0,0 +1,127 @@ +package types + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func TestSSODiagnosticInfo_GetValue(t *testing.T) { + mkInfo := func(value interface{}) *SSODiagnosticInfo { + info, err := NewSSODiagnosticInfo(SSOInfoType_UNKNOWN, value) + require.NoError(t, err) + return info + } + + type errInfo struct { + Message string + Error string + } + + tests := []struct { + name string + info *SSODiagnosticInfo + want interface{} + wantErr bool + }{ + { + name: "string", + info: mkInfo("foo"), + want: "foo", + wantErr: false, + }, + { + name: "int to float", + info: mkInfo(123), + want: 123.0, + wantErr: false, + }, + { + name: "struct", + info: mkInfo(errInfo{Message: "oh!", Error: "no..."}), + want: map[string]interface{}{"Message": "oh!", "Error": "no..."}, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.info.GetValue() + if tt.wantErr { + require.Error(t, err) + require.Nil(t, result) + } else { + require.NoError(t, err) + if err == nil { + require.Equal(t, tt.want, result) + } + } + }) + } +} + +func TestSSODiagnosticInfo_GetValueTyped(t *testing.T) { + mkInfo := func(value interface{}) *SSODiagnosticInfo { + info, err := NewSSODiagnosticInfo(SSOInfoType_UNKNOWN, value) + require.NoError(t, err) + return info + } + + ptrStr := func(v string) *string { return &v } + ptrInt := func(v int) *int { return &v } + + type errInfo struct { + Message string + Error string + } + + tests := []struct { + name string + info *SSODiagnosticInfo + arg interface{} + want interface{} + wantErr bool + }{ + { + name: "string ok", + info: mkInfo("foo"), + arg: new(string), + want: ptrStr("foo"), + wantErr: false, + }, + { + name: "int ok", + info: mkInfo(123), + arg: new(int), + want: ptrInt(123), + wantErr: false, + }, + { + name: "bad pointer type", + info: mkInfo(123), + arg: new(string), + want: nil, + wantErr: true, + }, + { + name: "custom struct", + info: mkInfo(errInfo{Message: "oh!", Error: "err"}), + arg: new(errInfo), + want: &errInfo{Message: "oh!", Error: "err"}, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.info.GetValueTyped(tt.arg) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + if err == nil { + require.Equal(t, tt.want, tt.arg) + } + } + }) + } +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 29ee65f6c47ad..13ec9e708d9bb 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -276,6 +276,66 @@ func (CertExtensionType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_d938547f84707355, []int{7} } +// SSOInfoType represents the SSO diagnostic info type. +type SSOInfoType int32 + +const ( + // Unknown info type. + SSOInfoType_UNKNOWN SSOInfoType = 0 + // Error info type, used for reporting errors. + SSOInfoType_ERROR SSOInfoType = 1 + // Success info type, used for marking successful flows. + SSOInfoType_SUCCESS SSOInfoType = 2 + // Create user params, contains info about attempted user creation parameters. + SSOInfoType_CREATE_USER_PARAMS SSOInfoType = 3 + // [SAML] Attributes to roles mapping. + SSOInfoType_SAML_ATTRIBUTES_TO_ROLES SSOInfoType = 4 + // [SAML] Attributes to roles warnings. + SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS SSOInfoType = 5 + // [SAML] Assertion info. + SSOInfoType_SAML_ASSERTION_INFO SSOInfoType = 6 + // [SAML] Attribute statements. + SSOInfoType_SAML_ATTRIBUTE_STATEMENTS SSOInfoType = 7 + // [SAML] Traits calculated from assertions. + SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS SSOInfoType = 8 + // [SAML] Assertion-to-trait mapping as specified in the connector. + SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING SSOInfoType = 9 +) + +var SSOInfoType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ERROR", + 2: "SUCCESS", + 3: "CREATE_USER_PARAMS", + 4: "SAML_ATTRIBUTES_TO_ROLES", + 5: "SAML_ATTRIBUTES_TO_ROLES_WARNINGS", + 6: "SAML_ASSERTION_INFO", + 7: "SAML_ATTRIBUTE_STATEMENTS", + 8: "SAML_TRAITS_FROM_ASSERTIONS", + 9: "SAML_CONNECTOR_TRAIT_MAPPING", +} + +var SSOInfoType_value = map[string]int32{ + "UNKNOWN": 0, + "ERROR": 1, + "SUCCESS": 2, + "CREATE_USER_PARAMS": 3, + "SAML_ATTRIBUTES_TO_ROLES": 4, + "SAML_ATTRIBUTES_TO_ROLES_WARNINGS": 5, + "SAML_ASSERTION_INFO": 6, + "SAML_ATTRIBUTE_STATEMENTS": 7, + "SAML_TRAITS_FROM_ASSERTIONS": 8, + "SAML_CONNECTOR_TRAIT_MAPPING": 9, +} + +func (x SSOInfoType) String() string { + return proto.EnumName(SSOInfoType_name, int32(x)) +} + +func (SSOInfoType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{8} +} + // SessionState represents the state of a session. type SessionState int32 @@ -307,7 +367,7 @@ func (x SessionState) String() string { } func (SessionState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{8} + return fileDescriptor_d938547f84707355, []int{9} } // Type is the type of keep alive, used by servers. At the moment only @@ -7616,6 +7676,51 @@ func (m *GithubConnectorSpecV3) XXX_DiscardUnknown() { var xxx_messageInfo_GithubConnectorSpecV3 proto.InternalMessageInfo +// SSODiagnosticInfo is a single SSO diagnostic info entry. +type SSODiagnosticInfo struct { + // SSO Diagnostic info type. + InfoType SSOInfoType `protobuf:"varint,1,opt,name=InfoType,proto3,enum=types.SSOInfoType" json:"info_type"` + // Value is arbitrary string encoding of particular value. The meaning depends on particular SSO + // diagnostic info type. + Value []byte `protobuf:"bytes,2,opt,name=Value,proto3" json:"value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } +func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } +func (*SSODiagnosticInfo) ProtoMessage() {} +func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{144} +} +func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSODiagnosticInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSODiagnosticInfo.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 *SSODiagnosticInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSODiagnosticInfo.Merge(m, src) +} +func (m *SSODiagnosticInfo) XXX_Size() int { + return m.Size() +} +func (m *SSODiagnosticInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SSODiagnosticInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SSODiagnosticInfo proto.InternalMessageInfo + // TeamMapping represents a single team membership mapping. type TeamMapping struct { // Organization is a Github organization a user belongs to. @@ -7637,7 +7742,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{145} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7686,7 +7791,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{146} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7728,7 +7833,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{147} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7784,7 +7889,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{148} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7837,7 +7942,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{149} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7883,7 +7988,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{150} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7938,7 +8043,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{151} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7982,7 +8087,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{152} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8025,7 +8130,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{153} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8078,7 +8183,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{154} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8122,7 +8227,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{155} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8168,7 +8273,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{156} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8212,7 +8317,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{157} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8256,7 +8361,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{158} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8302,7 +8407,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{159} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8368,7 +8473,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{160} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8422,7 +8527,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{161} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8467,7 +8572,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{162} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8511,7 +8616,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{163} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8555,7 +8660,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{164} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8637,7 +8742,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{165} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8684,7 +8789,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{166} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8732,7 +8837,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{167} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8776,7 +8881,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{168} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8814,6 +8919,7 @@ func init() { proto.RegisterEnum("types.RequestState", RequestState_name, RequestState_value) proto.RegisterEnum("types.CertExtensionMode", CertExtensionMode_name, CertExtensionMode_value) proto.RegisterEnum("types.CertExtensionType", CertExtensionType_name, CertExtensionType_value) + proto.RegisterEnum("types.SSOInfoType", SSOInfoType_name, SSOInfoType_value) proto.RegisterEnum("types.SessionState", SessionState_name, SessionState_value) proto.RegisterEnum("types.KeepAlive_KeepAliveType", KeepAlive_KeepAliveType_name, KeepAlive_KeepAliveType_value) proto.RegisterEnum("types.CertAuthoritySpecV2_SigningAlgType", CertAuthoritySpecV2_SigningAlgType_name, CertAuthoritySpecV2_SigningAlgType_value) @@ -8976,6 +9082,7 @@ func init() { proto.RegisterType((*GithubConnectorV3)(nil), "types.GithubConnectorV3") proto.RegisterType((*GithubConnectorV3List)(nil), "types.GithubConnectorV3List") proto.RegisterType((*GithubConnectorSpecV3)(nil), "types.GithubConnectorSpecV3") + proto.RegisterType((*SSODiagnosticInfo)(nil), "types.SSODiagnosticInfo") proto.RegisterType((*TeamMapping)(nil), "types.TeamMapping") proto.RegisterType((*TrustedClusterV2)(nil), "types.TrustedClusterV2") proto.RegisterType((*TrustedClusterV2List)(nil), "types.TrustedClusterV2List") @@ -9005,731 +9112,745 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 11573 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, - 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0x9c, 0x1f, 0xce, 0xec, 0xec, - 0xf6, 0x5c, 0xed, 0xdf, 0xcc, 0xdc, 0xee, 0xf0, 0x86, 0x73, 0x3b, 0xd2, 0xde, 0xfe, 0x5d, 0x37, - 0xc9, 0x99, 0xe1, 0x0e, 0x87, 0xe4, 0x56, 0xf3, 0xe7, 0x4e, 0x77, 0xa7, 0x52, 0xb1, 0x2b, 0x87, - 0xac, 0x65, 0x77, 0x57, 0xab, 0xaa, 0x7a, 0x66, 0x28, 0x7d, 0x82, 0xf4, 0xc1, 0x90, 0x05, 0x41, - 0xd0, 0xfd, 0x08, 0x27, 0x4b, 0x32, 0x64, 0x48, 0x16, 0x2c, 0xd8, 0xb2, 0x71, 0x7e, 0x90, 0x0d, - 0xd8, 0x06, 0x0c, 0x03, 0x02, 0x0c, 0xe1, 0x1e, 0x6c, 0x58, 0x6f, 0x86, 0x64, 0x83, 0xb6, 0xee, - 0xfc, 0x22, 0x02, 0x36, 0x0c, 0xf8, 0x49, 0x67, 0x0b, 0x36, 0x32, 0x32, 0xb3, 0x2a, 0xb3, 0xba, - 0x9a, 0x6c, 0xee, 0xce, 0x02, 0x37, 0xf3, 0x44, 0x76, 0x64, 0x44, 0x54, 0xfe, 0x46, 0x46, 0x64, - 0x46, 0x44, 0xc2, 0x78, 0x74, 0xd0, 0xa5, 0xe1, 0x8d, 0x6e, 0xe0, 0x47, 0x3e, 0x19, 0xc1, 0x1f, - 0x97, 0xce, 0xee, 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd8, 0x7f, 0xbc, 0xf0, 0x52, 0x75, 0xd7, 0xf7, - 0x77, 0x5b, 0x74, 0x0e, 0x7f, 0xed, 0xf4, 0x1e, 0xce, 0x45, 0x5e, 0x9b, 0x86, 0x91, 0xd3, 0xee, - 0x0a, 0x84, 0x85, 0x5d, 0x2f, 0xda, 0xeb, 0xed, 0xdc, 0x68, 0xfa, 0xed, 0xb9, 0xdd, 0xc0, 0x79, - 0xe4, 0x45, 0x4e, 0xe4, 0xf9, 0x1d, 0xa7, 0x35, 0x17, 0xd1, 0x16, 0xed, 0xfa, 0x41, 0x34, 0xe7, - 0x74, 0xbd, 0x39, 0xfc, 0xc6, 0xdc, 0xe3, 0xc0, 0xe9, 0x76, 0x69, 0x90, 0xfc, 0xc3, 0x99, 0x98, - 0x7f, 0x3f, 0x0f, 0xa5, 0xfb, 0x94, 0x76, 0x6b, 0x2d, 0xef, 0x11, 0x25, 0x2f, 0x43, 0x61, 0xd5, - 0x69, 0xd3, 0x59, 0xe3, 0x8a, 0x71, 0xb5, 0x54, 0x9f, 0x3a, 0x3a, 0xac, 0x8e, 0x87, 0x34, 0x78, - 0x44, 0x03, 0xbb, 0xe3, 0xb4, 0xa9, 0x85, 0x85, 0xe4, 0xf3, 0x50, 0x62, 0x7f, 0xc3, 0xae, 0xd3, - 0xa4, 0xb3, 0x39, 0xc4, 0x9c, 0x38, 0x3a, 0xac, 0x96, 0x3a, 0x12, 0x68, 0x25, 0xe5, 0xe4, 0x35, - 0x18, 0x5b, 0xa1, 0x4e, 0x48, 0x97, 0x17, 0x67, 0xf3, 0x57, 0x8c, 0xab, 0xf9, 0x7a, 0xf9, 0xe8, - 0xb0, 0x5a, 0x6c, 0x31, 0x90, 0xed, 0xb9, 0x96, 0x2c, 0x24, 0xcb, 0x30, 0xb6, 0xf4, 0xa4, 0xeb, - 0x05, 0x34, 0x9c, 0x2d, 0x5c, 0x31, 0xae, 0x8e, 0xcf, 0x5f, 0xba, 0xc1, 0xdb, 0x7f, 0x43, 0xb6, - 0xff, 0xc6, 0x86, 0x6c, 0x7f, 0x7d, 0xe6, 0xfb, 0x87, 0xd5, 0x33, 0x47, 0x87, 0xd5, 0x31, 0xca, - 0x49, 0xbe, 0xfd, 0x5f, 0xaa, 0x86, 0x25, 0xe9, 0xc9, 0xbb, 0x50, 0xd8, 0x38, 0xe8, 0xd2, 0xd9, - 0xd2, 0x15, 0xe3, 0xea, 0xe4, 0xfc, 0x4b, 0x37, 0x78, 0x8f, 0xc7, 0x8d, 0x4c, 0xfe, 0x63, 0x58, - 0xf5, 0xe2, 0xd1, 0x61, 0xb5, 0xc0, 0x50, 0x2c, 0xa4, 0x22, 0x6f, 0xc2, 0xe8, 0x3d, 0x3f, 0x8c, - 0x96, 0x17, 0x67, 0x01, 0x9b, 0x76, 0xee, 0xe8, 0xb0, 0x3a, 0xbd, 0xe7, 0x87, 0x91, 0xed, 0xb9, - 0x6f, 0xf8, 0x6d, 0x2f, 0xa2, 0xed, 0x6e, 0x74, 0x60, 0x09, 0x24, 0x73, 0x07, 0x26, 0x34, 0x7e, - 0x64, 0x1c, 0xc6, 0x36, 0x57, 0xef, 0xaf, 0xae, 0x6d, 0xaf, 0x56, 0xce, 0x90, 0x22, 0x14, 0x56, - 0xd7, 0x16, 0x97, 0x2a, 0x06, 0x19, 0x83, 0x7c, 0x6d, 0x7d, 0xbd, 0x92, 0x23, 0x65, 0x28, 0x2e, - 0xd6, 0x36, 0x6a, 0xf5, 0x5a, 0x63, 0xa9, 0x92, 0x27, 0x33, 0x30, 0xb5, 0xbd, 0xbc, 0xba, 0xb8, - 0xb6, 0xdd, 0xb0, 0x17, 0x97, 0x1a, 0xf7, 0x37, 0xd6, 0xd6, 0x2b, 0x05, 0x32, 0x09, 0x70, 0x7f, - 0xb3, 0xbe, 0x64, 0xad, 0x2e, 0x6d, 0x2c, 0x35, 0x2a, 0x23, 0xe6, 0xaf, 0xe4, 0xa1, 0xf8, 0x80, - 0x46, 0x8e, 0xeb, 0x44, 0x0e, 0xb9, 0xac, 0x0d, 0x11, 0xd6, 0x5e, 0x19, 0x9b, 0x97, 0xfb, 0xc7, - 0x66, 0xe4, 0xe8, 0xb0, 0x6a, 0xbc, 0xa9, 0x8e, 0xc9, 0x3b, 0x30, 0xbe, 0x48, 0xc3, 0x66, 0xe0, - 0x75, 0xd9, 0x7c, 0xc1, 0x71, 0x29, 0xd5, 0x2f, 0x1e, 0x1d, 0x56, 0xcf, 0xb9, 0x09, 0x58, 0x69, - 0xab, 0x8a, 0x4d, 0x96, 0x61, 0x74, 0xc5, 0xd9, 0xa1, 0xad, 0x70, 0x76, 0xe4, 0x4a, 0xfe, 0xea, - 0xf8, 0xfc, 0x0b, 0xa2, 0x7f, 0x65, 0x05, 0x6f, 0xf0, 0xd2, 0xa5, 0x4e, 0x14, 0x1c, 0xd4, 0xcf, - 0x1e, 0x1d, 0x56, 0x2b, 0x2d, 0x04, 0xa8, 0x7d, 0xc7, 0x51, 0x48, 0x23, 0x19, 0xf3, 0xd1, 0x13, - 0xc7, 0xfc, 0xc5, 0xef, 0x1f, 0x56, 0x0d, 0x36, 0x16, 0x62, 0xcc, 0x13, 0x7e, 0xfa, 0xe8, 0x5f, - 0x81, 0xdc, 0xf2, 0xe2, 0xec, 0x18, 0xce, 0xb5, 0xca, 0xd1, 0x61, 0xb5, 0xac, 0x0d, 0x5b, 0x6e, - 0x79, 0xf1, 0xd2, 0xdb, 0x30, 0xae, 0xd4, 0x91, 0x54, 0x20, 0xbf, 0x4f, 0x0f, 0x78, 0x7f, 0x5a, - 0xec, 0x5f, 0x72, 0x16, 0x46, 0x1e, 0x39, 0xad, 0x9e, 0xe8, 0x40, 0x8b, 0xff, 0xf8, 0x52, 0xee, - 0x27, 0x0d, 0xf3, 0x37, 0x0a, 0x50, 0xb4, 0x7c, 0xbe, 0xce, 0xc8, 0x35, 0x18, 0x69, 0x44, 0x4e, - 0x24, 0x87, 0x62, 0xe6, 0xe8, 0xb0, 0x3a, 0x15, 0x32, 0x80, 0xf2, 0x3d, 0x8e, 0xc1, 0x50, 0xd7, - 0xf7, 0x9c, 0x50, 0x0e, 0x09, 0xa2, 0x76, 0x19, 0x40, 0x45, 0x45, 0x0c, 0xf2, 0x1a, 0x14, 0x1e, - 0xf8, 0x2e, 0x15, 0xa3, 0x42, 0x8e, 0x0e, 0xab, 0x93, 0x6d, 0xdf, 0x55, 0x11, 0xb1, 0x9c, 0xbc, - 0x01, 0xa5, 0x85, 0x5e, 0x10, 0xd0, 0x0e, 0x9b, 0xaa, 0x05, 0x44, 0x9e, 0x3c, 0x3a, 0xac, 0x42, - 0x93, 0x03, 0xd9, 0xe2, 0x4a, 0x10, 0x58, 0x57, 0x37, 0x22, 0x27, 0x88, 0xa8, 0x3b, 0x3b, 0x32, - 0x54, 0x57, 0xb3, 0xe5, 0x35, 0x1d, 0x72, 0x92, 0x74, 0x57, 0x0b, 0x4e, 0xe4, 0x1e, 0x8c, 0xdf, - 0x0d, 0x9c, 0x26, 0x5d, 0xa7, 0x81, 0xe7, 0xbb, 0x38, 0x86, 0xf9, 0xfa, 0x6b, 0x47, 0x87, 0xd5, - 0xf3, 0xbb, 0x0c, 0x6c, 0x77, 0x11, 0x9e, 0x50, 0xff, 0xe8, 0xb0, 0x5a, 0x5c, 0xec, 0x05, 0xd8, - 0x7b, 0x96, 0x4a, 0x4a, 0x7e, 0x86, 0x0d, 0x49, 0x18, 0x61, 0xd7, 0x52, 0x17, 0x47, 0xef, 0xf8, - 0x2a, 0x9a, 0xa2, 0x8a, 0xe7, 0x5b, 0x4e, 0x18, 0xd9, 0x01, 0xa7, 0x4b, 0xd5, 0x53, 0x65, 0x49, - 0xd6, 0xa0, 0xd8, 0x68, 0xee, 0x51, 0xb7, 0xd7, 0xa2, 0xb3, 0x45, 0x64, 0x7f, 0x41, 0x4c, 0x5c, - 0x39, 0x9e, 0xb2, 0xb8, 0x7e, 0x49, 0xf0, 0x26, 0xa1, 0x80, 0x28, 0x7d, 0x1f, 0x33, 0xf9, 0x52, - 0xf1, 0xb7, 0x7f, 0xbf, 0x7a, 0xe6, 0x97, 0xfe, 0xf3, 0x95, 0x33, 0xe6, 0xbf, 0xc8, 0x41, 0x25, - 0xcd, 0x84, 0x3c, 0x84, 0x89, 0xcd, 0xae, 0xeb, 0x44, 0x74, 0xa1, 0xe5, 0xd1, 0x4e, 0x14, 0xe2, - 0x24, 0x39, 0xbe, 0x4d, 0xaf, 0x88, 0xef, 0xce, 0xf6, 0x90, 0xd0, 0x6e, 0x72, 0xca, 0x54, 0xab, - 0x74, 0xb6, 0xc9, 0x77, 0x1a, 0x28, 0xa7, 0x43, 0x9c, 0x61, 0xa7, 0xfb, 0x0e, 0x97, 0xf0, 0x03, - 0xbe, 0x23, 0xd8, 0x8a, 0x09, 0xd4, 0x71, 0x77, 0x0e, 0x70, 0x66, 0x0e, 0x3f, 0x81, 0x18, 0x49, - 0xc6, 0x04, 0x62, 0x60, 0xf3, 0xbf, 0x19, 0x30, 0x69, 0xd1, 0xd0, 0xef, 0x05, 0x4d, 0x7a, 0x8f, - 0x3a, 0x2e, 0x0d, 0xd8, 0xf4, 0xbf, 0xef, 0x75, 0x5c, 0xb1, 0xa6, 0x70, 0xfa, 0xef, 0x7b, 0x1d, - 0x75, 0x09, 0x63, 0x39, 0xf9, 0x02, 0x8c, 0x35, 0x7a, 0x3b, 0x88, 0xca, 0xd7, 0xd4, 0x79, 0x1c, - 0xb1, 0xde, 0x8e, 0x9d, 0x42, 0x97, 0x68, 0x64, 0x0e, 0xc6, 0xb6, 0x68, 0x10, 0x26, 0x12, 0x0f, - 0x25, 0xfb, 0x23, 0x0e, 0x52, 0x09, 0x04, 0x16, 0xb9, 0x9b, 0x48, 0x5d, 0xb1, 0x27, 0x4d, 0xa5, - 0x64, 0x5d, 0x32, 0x55, 0xda, 0x02, 0xa2, 0x4e, 0x15, 0x89, 0x65, 0x7e, 0x27, 0x07, 0x95, 0x45, - 0x27, 0x72, 0x76, 0x9c, 0x50, 0xf4, 0xe7, 0xd6, 0x2d, 0x26, 0xc7, 0x95, 0x86, 0xa2, 0x1c, 0x67, - 0x35, 0xff, 0xc4, 0xcd, 0x7b, 0x35, 0xdd, 0xbc, 0x71, 0xb6, 0x41, 0x8a, 0xe6, 0x25, 0x8d, 0x7a, - 0xef, 0xe4, 0x46, 0x55, 0x44, 0xa3, 0x8a, 0xb2, 0x51, 0x49, 0x53, 0xc8, 0x7b, 0x50, 0x68, 0x74, - 0x69, 0x53, 0x08, 0x11, 0x29, 0xfb, 0xf5, 0xc6, 0x31, 0x84, 0xad, 0x5b, 0xf5, 0xb2, 0x60, 0x53, - 0x08, 0xbb, 0xb4, 0x69, 0x21, 0x99, 0xb2, 0x68, 0xbe, 0x3b, 0x0a, 0x67, 0xb3, 0xc8, 0xc8, 0x7b, - 0xfa, 0xe6, 0xc4, 0xbb, 0xe7, 0x85, 0x81, 0x9b, 0xd3, 0xac, 0xa1, 0x6f, 0x4f, 0xd7, 0xa1, 0xb8, - 0xce, 0x26, 0x64, 0xd3, 0x6f, 0x89, 0x9e, 0x63, 0x52, 0xb1, 0xd8, 0x95, 0x30, 0xc3, 0x8a, 0xcb, - 0xc9, 0x0b, 0x90, 0xdf, 0xb4, 0x96, 0x45, 0x77, 0x95, 0x8e, 0x0e, 0xab, 0xf9, 0x5e, 0xe0, 0xcd, - 0x1a, 0x16, 0x83, 0x92, 0x39, 0x18, 0x5d, 0xa8, 0x2d, 0xd0, 0x20, 0xc2, 0x6e, 0x2a, 0xd7, 0x2f, - 0xb0, 0xd9, 0xd2, 0x74, 0xec, 0x26, 0x0d, 0x22, 0xed, 0xf3, 0x02, 0x8d, 0x7c, 0x1e, 0xf2, 0xb5, - 0xed, 0x86, 0xe8, 0x19, 0x10, 0x3d, 0x53, 0xdb, 0x6e, 0xd4, 0x27, 0x44, 0x47, 0xe4, 0x9d, 0xc7, - 0x21, 0xe3, 0x5e, 0xdb, 0x6e, 0xa8, 0xa3, 0x35, 0x7a, 0xcc, 0x68, 0x5d, 0x85, 0x22, 0xd3, 0x33, - 0xd8, 0x06, 0x8f, 0x42, 0xb1, 0xc4, 0xd5, 0xa7, 0x3d, 0x01, 0xb3, 0xe2, 0x52, 0xf2, 0x72, 0xac, - 0xb6, 0x14, 0x13, 0x7e, 0x42, 0x6d, 0x91, 0xca, 0x0a, 0x79, 0x02, 0x13, 0x8b, 0x07, 0x1d, 0xa7, - 0xed, 0x35, 0xc5, 0x16, 0x5e, 0xc2, 0x2d, 0xfc, 0xc6, 0x31, 0xc3, 0x78, 0x43, 0x23, 0xe0, 0xbb, - 0xba, 0x14, 0xbe, 0xb3, 0x2e, 0x2f, 0xb3, 0xd3, 0x3b, 0xfc, 0xac, 0x61, 0xe9, 0x1f, 0x62, 0x6b, - 0x49, 0x8a, 0x48, 0xd4, 0xab, 0x92, 0x69, 0x27, 0xc1, 0xc9, 0x5a, 0x0a, 0x04, 0x44, 0x5d, 0x4b, - 0xf1, 0xa6, 0xfb, 0x1e, 0xe4, 0xef, 0x2e, 0xac, 0xcf, 0x8e, 0x23, 0x0f, 0x22, 0x78, 0xdc, 0x5d, - 0x58, 0x5f, 0x68, 0xf9, 0x3d, 0xb7, 0xf1, 0xd1, 0x4a, 0xfd, 0x82, 0x60, 0x33, 0xb1, 0xdb, 0xec, - 0x6a, 0x35, 0x62, 0x74, 0x64, 0x09, 0x8a, 0xb2, 0x95, 0xb3, 0x65, 0xe4, 0x31, 0x9d, 0x6a, 0xfc, - 0xd6, 0x2d, 0xbe, 0xd6, 0x5c, 0xf1, 0x5b, 0xad, 0x85, 0xc4, 0xb9, 0xb4, 0x0d, 0xa4, 0xbf, 0x5f, - 0x32, 0x34, 0x89, 0xcf, 0xab, 0x9a, 0xc4, 0xf8, 0xfc, 0x39, 0xf1, 0xad, 0x05, 0xbf, 0xdd, 0x76, - 0x3a, 0x2e, 0xd2, 0x6e, 0xcd, 0xab, 0x0a, 0x46, 0x0d, 0x26, 0x93, 0x8a, 0xac, 0x78, 0x61, 0x44, - 0xe6, 0xa0, 0x24, 0x21, 0x6c, 0x13, 0xc9, 0x67, 0x56, 0xd9, 0x4a, 0x70, 0xcc, 0x3f, 0xcd, 0x01, - 0x24, 0x25, 0xcf, 0xa8, 0x9c, 0xf9, 0x09, 0x4d, 0xce, 0x9c, 0x4b, 0x4f, 0xd0, 0x81, 0x12, 0x86, - 0x7c, 0x00, 0xa3, 0x4c, 0xe5, 0xea, 0x49, 0x95, 0xf2, 0x42, 0x9a, 0x14, 0x0b, 0xb7, 0x6e, 0xd5, - 0x27, 0x05, 0xf1, 0x68, 0x88, 0x10, 0x4b, 0x90, 0x29, 0x22, 0xea, 0x7f, 0x14, 0x92, 0xc1, 0x10, - 0xc2, 0xe9, 0xaa, 0x22, 0x5d, 0x8c, 0x64, 0x3d, 0x4a, 0xe9, 0xa2, 0xc8, 0x96, 0x8b, 0x5c, 0xb6, - 0xf0, 0x4e, 0x1d, 0x13, 0xb2, 0x25, 0x2d, 0x59, 0x78, 0x07, 0x9e, 0x28, 0x59, 0xba, 0xe9, 0x65, - 0x5b, 0xc0, 0x69, 0x70, 0x35, 0xb3, 0x57, 0xb2, 0x16, 0xec, 0x95, 0x93, 0x16, 0x6c, 0x7a, 0xb9, - 0xde, 0x1a, 0x24, 0xcb, 0xce, 0xc9, 0xd5, 0xe5, 0x3c, 0x56, 0xc9, 0x51, 0xa6, 0xbd, 0xc3, 0x97, - 0xe6, 0xe8, 0xc0, 0xa5, 0x79, 0x2e, 0x73, 0x69, 0xf2, 0x85, 0xf9, 0x0e, 0x8c, 0xd4, 0x7e, 0xae, - 0x17, 0x50, 0xa1, 0xfb, 0x95, 0xe5, 0x37, 0x19, 0x2c, 0x5e, 0xd3, 0x53, 0x0e, 0xfb, 0xa9, 0xea, - 0xcc, 0x58, 0xce, 0xbe, 0xbc, 0xb1, 0xd2, 0x10, 0x7a, 0x1d, 0x49, 0x75, 0xcb, 0xc6, 0x8a, 0x52, - 0xed, 0x48, 0x6b, 0x35, 0xa3, 0x22, 0x73, 0x90, 0xab, 0x2d, 0xa2, 0xb1, 0x38, 0x3e, 0x5f, 0x92, - 0x9f, 0x5d, 0xac, 0x9f, 0x15, 0x24, 0x65, 0x47, 0xb3, 0x1f, 0x6a, 0x8b, 0x9f, 0xdd, 0xe2, 0x6f, - 0x29, 0x6a, 0x82, 0x98, 0xa6, 0xcc, 0x1c, 0x15, 0x93, 0xc5, 0x48, 0x94, 0x96, 0xbe, 0xc9, 0x12, - 0x4f, 0x95, 0x6b, 0x7c, 0xe0, 0x72, 0x7d, 0x03, 0x37, 0xae, 0x6c, 0x42, 0x38, 0x5c, 0xe6, 0x5f, - 0x19, 0x88, 0x4b, 0xde, 0x80, 0x51, 0x8b, 0xee, 0x26, 0x7b, 0x2d, 0xda, 0x6c, 0x01, 0x42, 0xd4, - 0x0f, 0x70, 0x1c, 0x14, 0xe4, 0xd4, 0x0d, 0xf7, 0xbc, 0x87, 0x91, 0xf8, 0x4a, 0x2c, 0xc8, 0x05, - 0x58, 0x11, 0xe4, 0x02, 0xa2, 0x09, 0x72, 0x01, 0x63, 0x53, 0xcc, 0x5a, 0x6c, 0x08, 0x65, 0x52, - 0xd6, 0xd4, 0x5a, 0x54, 0xc6, 0x2a, 0x70, 0xb5, 0xb1, 0xb2, 0x16, 0x1b, 0xe4, 0x36, 0x94, 0x6a, - 0xcd, 0xa6, 0xdf, 0x53, 0x8c, 0x9e, 0xd9, 0xa3, 0xc3, 0xea, 0x59, 0x87, 0x03, 0x75, 0x13, 0x3d, - 0x41, 0x35, 0xeb, 0x49, 0xad, 0x19, 0x8f, 0x85, 0x56, 0x2f, 0x8c, 0x68, 0xb0, 0xbc, 0x28, 0x9a, - 0x8c, 0x3c, 0x9a, 0x1c, 0x98, 0xe2, 0x11, 0xa3, 0x9a, 0xff, 0xc9, 0xc0, 0x1a, 0x93, 0xb7, 0x01, - 0x96, 0x3b, 0x4c, 0xb1, 0x6d, 0xd2, 0x98, 0x01, 0x1a, 0xcf, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, - 0xfd, 0xd3, 0xb9, 0xa1, 0x3f, 0xcd, 0x3e, 0x29, 0xd5, 0x64, 0x71, 0x8e, 0x22, 0x3e, 0x19, 0x08, - 0x68, 0xea, 0x93, 0x09, 0x32, 0x79, 0x0d, 0xc6, 0x96, 0x6b, 0x0f, 0x6a, 0xbd, 0x68, 0x0f, 0xfb, - 0xab, 0xc8, 0x05, 0x96, 0xe7, 0xb4, 0x6d, 0xa7, 0x17, 0xed, 0x59, 0xb2, 0xd0, 0xfc, 0x25, 0x03, - 0xc6, 0x95, 0xb5, 0xca, 0xaa, 0xba, 0x1e, 0xf8, 0x1f, 0xd3, 0x66, 0xa4, 0xf7, 0x52, 0x97, 0x03, - 0x53, 0x55, 0x8d, 0x51, 0x53, 0xbd, 0x93, 0x3b, 0x45, 0xef, 0x98, 0x73, 0x42, 0x04, 0x30, 0x1b, - 0x40, 0x39, 0xe2, 0x40, 0x1b, 0x80, 0xe9, 0x38, 0xaa, 0x0d, 0xc0, 0xca, 0xcd, 0x3f, 0x32, 0xd8, - 0xd2, 0x25, 0x73, 0x00, 0xf7, 0xe9, 0x41, 0xe4, 0xec, 0xdc, 0xf1, 0x5a, 0xda, 0xd1, 0xd5, 0x3e, - 0x42, 0xed, 0x87, 0x5e, 0x8b, 0x5a, 0x0a, 0x0a, 0xb9, 0x05, 0xc5, 0xfb, 0xc1, 0xce, 0x5b, 0x88, - 0x9e, 0x8b, 0x45, 0xf0, 0xcc, 0x7e, 0xb0, 0xf3, 0x16, 0x22, 0xab, 0xf3, 0x55, 0x22, 0x12, 0x13, - 0x46, 0x17, 0xfd, 0xb6, 0xe3, 0xc9, 0x6d, 0x0f, 0xd8, 0xde, 0xe1, 0x22, 0xc4, 0x12, 0x25, 0x4c, - 0xe8, 0x37, 0xd6, 0x57, 0xc5, 0xc4, 0x44, 0xa1, 0x1f, 0x76, 0x3b, 0x16, 0x83, 0x99, 0xdf, 0x33, - 0x60, 0x5c, 0x91, 0x48, 0xe4, 0x8b, 0xc2, 0xcc, 0x37, 0xf0, 0x90, 0xea, 0x7c, 0xbf, 0xcc, 0x62, - 0xa5, 0x7c, 0xbb, 0x66, 0xe6, 0xbf, 0x30, 0xfa, 0x13, 0x69, 0x90, 0x1b, 0x46, 0x1a, 0xbc, 0x0d, - 0xc0, 0x75, 0x39, 0xec, 0x4e, 0x65, 0xde, 0x28, 0x87, 0x7a, 0xea, 0x60, 0x24, 0xc8, 0xe6, 0xff, - 0x9f, 0x83, 0xa2, 0xb0, 0x55, 0xe6, 0x9f, 0x51, 0x1d, 0xe2, 0x2d, 0x4d, 0x87, 0x98, 0x11, 0xa4, - 0x8a, 0x72, 0x3b, 0x7f, 0x82, 0x8d, 0xf2, 0x36, 0x94, 0x65, 0x17, 0xa0, 0x2a, 0x76, 0x0d, 0xc6, - 0xa4, 0x95, 0xcd, 0x15, 0xb1, 0x29, 0x8d, 0xe7, 0xd6, 0xbc, 0x25, 0xcb, 0xcd, 0xef, 0x8c, 0x48, - 0x5a, 0xfe, 0x25, 0xd6, 0x85, 0x35, 0xd7, 0x0d, 0xd4, 0x2e, 0x74, 0x5c, 0x37, 0xb0, 0x10, 0xca, - 0x06, 0x6a, 0xbd, 0xb7, 0xd3, 0xf2, 0x9a, 0x88, 0xa3, 0xac, 0x9a, 0x2e, 0x42, 0x6d, 0x86, 0xaa, - 0x0e, 0x54, 0x82, 0xac, 0x99, 0x08, 0xf9, 0x63, 0x4d, 0x84, 0x9f, 0x86, 0xd2, 0x42, 0xdb, 0xd5, - 0x54, 0x08, 0x33, 0xa3, 0x53, 0x6e, 0xc4, 0x48, 0x5c, 0x79, 0xb8, 0x2c, 0xfa, 0xe8, 0x6c, 0xb3, - 0xed, 0xf6, 0x2b, 0x0e, 0x09, 0x4b, 0x4d, 0xc7, 0x1f, 0xf9, 0x34, 0x3a, 0xfe, 0x6d, 0x28, 0x6d, - 0x86, 0x74, 0xa3, 0xd7, 0xe9, 0xd0, 0x16, 0xaa, 0x13, 0x45, 0x2e, 0x7b, 0x7a, 0x21, 0xb5, 0x23, - 0x84, 0xaa, 0x15, 0x88, 0x51, 0xd5, 0x69, 0x35, 0x76, 0xcc, 0xb4, 0xfa, 0x22, 0x14, 0x6a, 0xdd, - 0xae, 0x34, 0x7e, 0xe2, 0x4d, 0xb2, 0xdb, 0xc5, 0xad, 0x6f, 0xd2, 0xe9, 0x76, 0x75, 0x53, 0x06, - 0xb1, 0x09, 0x05, 0x72, 0xbf, 0xb7, 0x43, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0x44, 0x73, 0x38, 0x0b, - 0xc8, 0x63, 0x56, 0x9e, 0x31, 0xa7, 0x11, 0xd0, 0x70, 0xbd, 0xb0, 0xdf, 0xdb, 0xa1, 0xb6, 0x90, - 0xf1, 0x6a, 0xdf, 0x65, 0x30, 0xbc, 0xd4, 0x80, 0x49, 0xbd, 0xff, 0x9f, 0x82, 0x62, 0xf1, 0x61, - 0xa1, 0x58, 0xac, 0x94, 0xcc, 0x5f, 0xc9, 0xc1, 0x78, 0xad, 0xdb, 0x7d, 0xc6, 0x4f, 0x20, 0x7e, - 0x52, 0x5b, 0xd5, 0xe7, 0x93, 0xd1, 0x3b, 0xc5, 0xe1, 0xc3, 0x5f, 0x1b, 0x30, 0x95, 0xa2, 0x50, - 0x6b, 0x6f, 0x0c, 0x69, 0x91, 0xe7, 0x86, 0xb4, 0xc8, 0xf3, 0x83, 0x2d, 0x72, 0x75, 0xcd, 0x14, - 0x3e, 0xcd, 0x9a, 0x79, 0x1d, 0xf2, 0xb5, 0x6e, 0x57, 0xf4, 0x4a, 0x39, 0xe9, 0x95, 0xad, 0x5b, - 0x7c, 0x23, 0x72, 0xba, 0x5d, 0x8b, 0x61, 0x98, 0x6f, 0x42, 0x09, 0xc1, 0x28, 0xd1, 0xae, 0x88, - 0xa5, 0xc0, 0xc5, 0x99, 0x46, 0xc6, 0xa7, 0xbd, 0xf9, 0xbf, 0x0d, 0x18, 0xc1, 0xdf, 0xcf, 0xe8, - 0x74, 0x99, 0xd7, 0xa6, 0x4b, 0x45, 0x99, 0x2e, 0xc3, 0x4c, 0x94, 0x3f, 0xce, 0x63, 0x6f, 0x89, - 0x29, 0x22, 0x6c, 0x3a, 0x23, 0xc3, 0xa6, 0xfb, 0x14, 0x02, 0x7c, 0x3f, 0x6d, 0xdd, 0xe5, 0x71, - 0x30, 0x5e, 0x4e, 0x57, 0xf5, 0xa9, 0x18, 0x76, 0xf7, 0x80, 0x2c, 0x77, 0x42, 0xda, 0xec, 0x05, - 0xb4, 0xb1, 0xef, 0x75, 0xb7, 0x68, 0xe0, 0x3d, 0x3c, 0x10, 0x9a, 0x21, 0xca, 0x58, 0x4f, 0x94, - 0xda, 0xe1, 0xbe, 0xd7, 0xb5, 0x1f, 0x61, 0xb9, 0x95, 0x41, 0x43, 0x3e, 0x80, 0x31, 0x8b, 0x3e, - 0x0e, 0xbc, 0x88, 0x8a, 0xbe, 0x9d, 0x8c, 0xed, 0x00, 0x84, 0x72, 0xdd, 0x24, 0xe0, 0x3f, 0xd4, - 0xf1, 0x17, 0xe5, 0x9f, 0x9d, 0x19, 0xf5, 0xdd, 0x11, 0x5c, 0x0b, 0x27, 0xdc, 0x94, 0x1d, 0x63, - 0xa0, 0xeb, 0x83, 0x99, 0x3f, 0xcd, 0x60, 0x6e, 0x41, 0x99, 0x99, 0x6e, 0x29, 0x4b, 0xfd, 0x72, - 0x32, 0x96, 0x37, 0xd4, 0xe2, 0xe3, 0x2e, 0xc9, 0x34, 0x3e, 0xc4, 0x4e, 0x4f, 0x12, 0x7e, 0xf9, - 0xf6, 0xa2, 0xc2, 0x38, 0x63, 0x7a, 0xc4, 0xa2, 0xa3, 0xc9, 0x3b, 0xeb, 0xd4, 0x13, 0x63, 0xf4, - 0xd3, 0x4d, 0x8c, 0xb1, 0x4f, 0x32, 0x31, 0xd2, 0xd7, 0x93, 0xc5, 0xd3, 0x5c, 0x4f, 0x5e, 0xfa, - 0x00, 0xa6, 0xfb, 0x7a, 0xf8, 0x34, 0x57, 0x7c, 0x9f, 0xdd, 0xb4, 0xfc, 0x85, 0xb8, 0x5f, 0xc8, - 0x3c, 0x9a, 0xa3, 0x5e, 0x40, 0x9b, 0x11, 0x8a, 0x5e, 0x21, 0x2d, 0x03, 0x01, 0x4b, 0xd9, 0xcb, - 0x08, 0x23, 0xef, 0xc3, 0x18, 0xbf, 0x22, 0x09, 0x67, 0x73, 0x38, 0xf6, 0x13, 0xe2, 0x8b, 0x1c, - 0x2a, 0xee, 0xa9, 0x39, 0x86, 0xda, 0xab, 0x82, 0xc8, 0xbc, 0x0b, 0xa3, 0xe2, 0x8a, 0xe5, 0xf8, - 0x75, 0x51, 0x85, 0x91, 0xad, 0xa4, 0x67, 0xf0, 0x58, 0x9c, 0x37, 0xc2, 0xe2, 0x70, 0xf3, 0xd7, - 0x0c, 0x98, 0xd4, 0x5b, 0x49, 0x6e, 0xc0, 0xa8, 0xb8, 0x03, 0x34, 0xf0, 0x0e, 0x90, 0xb5, 0x66, - 0x94, 0xdf, 0xfe, 0x69, 0x77, 0x7e, 0x02, 0x8b, 0x89, 0x7e, 0xc1, 0x01, 0xdb, 0x22, 0x44, 0xbf, - 0x98, 0xa4, 0x96, 0x2c, 0x63, 0x26, 0x97, 0x45, 0xc3, 0x5e, 0x2b, 0x52, 0x4d, 0xae, 0x00, 0x21, - 0x96, 0x28, 0x31, 0x0f, 0x0d, 0x80, 0x46, 0xe3, 0xde, 0x7d, 0x7a, 0xb0, 0xee, 0x78, 0x01, 0x9a, - 0xad, 0xb8, 0x1a, 0xef, 0x8b, 0xd1, 0x2a, 0x0b, 0xb3, 0x95, 0xaf, 0xdc, 0x7d, 0x7a, 0xa0, 0x99, - 0xad, 0x12, 0x15, 0x97, 0x7c, 0xe0, 0x3d, 0x72, 0x22, 0xca, 0x08, 0x73, 0x48, 0xc8, 0x97, 0x3c, - 0x87, 0xa6, 0x28, 0x15, 0x64, 0xf2, 0x0d, 0x98, 0x4c, 0x7e, 0xa1, 0xe3, 0x41, 0x1e, 0x6d, 0x3a, - 0x39, 0x23, 0xf4, 0xc2, 0xfa, 0x4b, 0x47, 0x87, 0xd5, 0x4b, 0x0a, 0x57, 0x9b, 0x61, 0x29, 0xac, - 0x53, 0xcc, 0xcc, 0x3f, 0x30, 0x00, 0x36, 0x56, 0x1a, 0xb2, 0x81, 0xaf, 0x41, 0x21, 0x3e, 0x0d, - 0x2a, 0x73, 0xdb, 0x38, 0x65, 0xfc, 0x61, 0x39, 0x79, 0x19, 0xf2, 0x49, 0x4b, 0xa6, 0x8f, 0x0e, - 0xab, 0x13, 0x7a, 0x0b, 0x58, 0x29, 0xb9, 0x0b, 0x63, 0x43, 0xd5, 0x19, 0x67, 0x67, 0x46, 0x5d, - 0x25, 0x35, 0x8e, 0xc2, 0x87, 0xdb, 0x1b, 0xcf, 0xef, 0x28, 0x7c, 0x2b, 0x07, 0x53, 0xac, 0x5f, - 0x6b, 0xbd, 0x68, 0xcf, 0x0f, 0xbc, 0xe8, 0xe0, 0x99, 0xb5, 0x8a, 0xdf, 0xd5, 0x14, 0xa2, 0x4b, - 0x52, 0x6c, 0xa9, 0x6d, 0x1b, 0xca, 0x38, 0xfe, 0xcb, 0x31, 0x98, 0xc9, 0xa0, 0x22, 0x6f, 0x08, - 0xef, 0x9b, 0xe4, 0xcc, 0x08, 0xbd, 0x6b, 0x7e, 0x74, 0x58, 0x2d, 0x4b, 0xf4, 0x8d, 0xc4, 0xdb, - 0x66, 0x1e, 0xc6, 0x85, 0xe9, 0xb3, 0x9a, 0x68, 0xd4, 0xe8, 0xb6, 0x21, 0xcf, 0xc4, 0x50, 0x34, - 0xa9, 0x48, 0xa4, 0x06, 0xe5, 0x85, 0x3d, 0xda, 0xdc, 0xf7, 0x3a, 0xbb, 0xf7, 0xe9, 0x01, 0xd7, - 0x97, 0xca, 0xf5, 0x17, 0x99, 0xa5, 0xd5, 0x14, 0x70, 0x36, 0xa4, 0xba, 0x11, 0xa7, 0x91, 0x90, - 0xf7, 0x61, 0xbc, 0xe1, 0xed, 0x76, 0x24, 0x87, 0x02, 0x72, 0xb8, 0x7c, 0x74, 0x58, 0x3d, 0x1f, - 0x72, 0x70, 0x3f, 0x03, 0x95, 0x80, 0x5c, 0x83, 0x11, 0xcb, 0x6f, 0x51, 0xbe, 0x0d, 0x0b, 0x7f, - 0x8e, 0x80, 0x01, 0xd4, 0xb3, 0x69, 0xc4, 0x20, 0xf7, 0x60, 0x8c, 0xfd, 0xf3, 0xc0, 0xe9, 0xce, - 0x8e, 0xa2, 0xdc, 0x26, 0xb1, 0x82, 0x8f, 0xd0, 0xae, 0xd7, 0xd9, 0x55, 0x75, 0xfc, 0x16, 0xb5, - 0xdb, 0x4e, 0x57, 0xdb, 0x17, 0x39, 0x22, 0xd9, 0x82, 0xf1, 0x44, 0x10, 0x84, 0xb3, 0x63, 0xda, - 0x5d, 0x50, 0x52, 0x52, 0xff, 0x9c, 0x60, 0x76, 0x21, 0x6a, 0x85, 0x38, 0xb7, 0xbb, 0x0c, 0x5f, - 0x6f, 0x8c, 0xc2, 0x48, 0xb3, 0x41, 0x8a, 0x83, 0x6d, 0x10, 0xe3, 0x44, 0x1b, 0xc4, 0x05, 0x10, - 0x9d, 0x54, 0x6b, 0xed, 0x0a, 0xf7, 0xab, 0x6b, 0x83, 0x27, 0xd8, 0x8d, 0x04, 0x19, 0xd7, 0x24, - 0x3f, 0x99, 0x12, 0xfd, 0xef, 0xb4, 0x76, 0xb5, 0x93, 0xa9, 0x18, 0x95, 0x75, 0x43, 0x22, 0x6a, - 0xa4, 0x05, 0x2e, 0xbb, 0x21, 0x29, 0x49, 0xba, 0xe1, 0xe3, 0xc7, 0xd1, 0xa0, 0x6e, 0x50, 0x18, - 0x91, 0x55, 0x80, 0x5a, 0x33, 0xf2, 0x1e, 0x51, 0x9c, 0x12, 0xe3, 0x5a, 0x47, 0x2c, 0xd4, 0xee, - 0xd3, 0x83, 0x06, 0x8d, 0x62, 0xcf, 0x86, 0x73, 0x0e, 0xa2, 0xa6, 0xa6, 0x89, 0xa5, 0x70, 0x20, - 0x5d, 0x38, 0x57, 0x73, 0x5d, 0x8f, 0xbb, 0xe4, 0x6d, 0x04, 0x6c, 0xfe, 0xba, 0xc8, 0xba, 0x9c, - 0xcd, 0xfa, 0x9a, 0x60, 0xfd, 0x39, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xfe, 0x4c, 0x36, 0x63, - 0x73, 0x0d, 0x26, 0xf5, 0x2e, 0xd5, 0x9d, 0xd1, 0xca, 0x50, 0xb4, 0x1a, 0x35, 0xbb, 0x71, 0xaf, - 0x76, 0xb3, 0x62, 0x90, 0x0a, 0x94, 0xc5, 0xaf, 0x79, 0x7b, 0xfe, 0xad, 0xdb, 0x95, 0x9c, 0x06, - 0x79, 0xeb, 0xe6, 0x7c, 0x25, 0x6f, 0xfe, 0xb1, 0x01, 0x45, 0x59, 0x3f, 0x72, 0x1b, 0xf2, 0x8d, - 0xc6, 0xbd, 0xd4, 0x15, 0x64, 0xb2, 0xf5, 0xf2, 0x4d, 0x26, 0x0c, 0xf7, 0xd4, 0x4d, 0xa6, 0xd1, - 0xb8, 0xc7, 0xe8, 0x36, 0x56, 0x1a, 0x42, 0x69, 0xc9, 0x98, 0xae, 0xd3, 0x03, 0xee, 0x65, 0x6e, - 0x43, 0xfe, 0xc3, 0xed, 0x0d, 0x61, 0x0d, 0x65, 0x8c, 0x2f, 0xd2, 0x7d, 0xfc, 0x58, 0xdd, 0xfa, - 0x18, 0x81, 0x69, 0xc1, 0xb8, 0xb2, 0xb4, 0xb8, 0x12, 0xd1, 0xf6, 0x63, 0x37, 0x2d, 0xa1, 0x44, - 0x30, 0x88, 0x25, 0x4a, 0x98, 0xce, 0xb3, 0xe2, 0x37, 0x9d, 0x96, 0xd0, 0x46, 0x50, 0xe7, 0x69, - 0x31, 0x80, 0xc5, 0xe1, 0xe6, 0x9f, 0x18, 0x50, 0x59, 0x0f, 0xfc, 0x47, 0x1e, 0x93, 0xc0, 0x1b, - 0xfe, 0x3e, 0xed, 0x6c, 0xdd, 0x24, 0x6f, 0x4a, 0x21, 0xc0, 0x55, 0xb8, 0x0b, 0x8c, 0x0a, 0x85, - 0xc0, 0x8f, 0x0e, 0xab, 0xd0, 0x38, 0x08, 0x23, 0xda, 0x66, 0xe5, 0x52, 0x10, 0x28, 0xde, 0x6e, - 0xb9, 0xe1, 0x3d, 0x68, 0x4e, 0xf0, 0x76, 0xab, 0xc2, 0x08, 0x56, 0x47, 0x71, 0x62, 0x18, 0x89, - 0x18, 0xc0, 0xe2, 0x70, 0x45, 0x60, 0x7f, 0x27, 0xd7, 0xd7, 0x86, 0xf9, 0xe7, 0xca, 0x0b, 0x45, - 0x6f, 0xdc, 0x50, 0x9b, 0xd8, 0x57, 0xe1, 0x6c, 0xba, 0x4b, 0xf0, 0x5c, 0xa4, 0x06, 0x53, 0x3a, - 0x5c, 0x1e, 0x91, 0x5c, 0xc8, 0xfc, 0xd6, 0xd6, 0xbc, 0x95, 0xc6, 0x37, 0x7f, 0x60, 0x40, 0x09, - 0xff, 0xb5, 0x7a, 0x2d, 0xca, 0x34, 0x9b, 0xda, 0x76, 0x43, 0x5c, 0x48, 0xa9, 0x97, 0x46, 0xce, - 0xe3, 0xd0, 0x16, 0xb7, 0x57, 0x9a, 0x1c, 0x89, 0x91, 0x05, 0x29, 0xbf, 0x7e, 0x0b, 0xc5, 0x0c, - 0x8d, 0x49, 0xf9, 0x3d, 0x5d, 0x98, 0x22, 0x15, 0xc8, 0x6c, 0xfc, 0xd8, 0x2f, 0xbf, 0x25, 0x8f, - 0x86, 0x71, 0xfc, 0x90, 0xce, 0xd7, 0xae, 0x39, 0x24, 0x1a, 0x79, 0x13, 0x46, 0xd9, 0xa7, 0x2d, - 0x79, 0x89, 0x81, 0x56, 0x05, 0xd6, 0x31, 0xd0, 0x6e, 0x03, 0x39, 0x92, 0xf9, 0x2f, 0x73, 0xe9, - 0x0e, 0x14, 0x5a, 0xc0, 0x29, 0xd7, 0xc6, 0x3b, 0x30, 0x52, 0x6b, 0xb5, 0xfc, 0xc7, 0x42, 0x4a, - 0xc8, 0x63, 0x9a, 0xb8, 0xff, 0xf8, 0x0e, 0xeb, 0x30, 0x14, 0xed, 0xf6, 0x97, 0x01, 0xc8, 0x02, - 0x94, 0x6a, 0xdb, 0x8d, 0xe5, 0xe5, 0xc5, 0x8d, 0x8d, 0x15, 0xe1, 0x64, 0xfc, 0xaa, 0xec, 0x1f, - 0xcf, 0x73, 0xed, 0x28, 0x6a, 0x0d, 0xf0, 0x41, 0x4c, 0xe8, 0xc8, 0x7b, 0x00, 0x1f, 0xfa, 0x5e, - 0xe7, 0x01, 0x8d, 0xf6, 0x7c, 0x57, 0x34, 0x9e, 0xa9, 0x14, 0xe3, 0x1f, 0xfb, 0x5e, 0xc7, 0x6e, - 0x23, 0x98, 0xd5, 0x3d, 0x41, 0xb2, 0x94, 0xff, 0x59, 0x4f, 0xd7, 0xfd, 0x08, 0x75, 0x98, 0x91, - 0xa4, 0xa7, 0x77, 0xfc, 0x28, 0x7d, 0xc7, 0x22, 0xd1, 0xcc, 0x5f, 0xcf, 0xc1, 0x24, 0xb7, 0x54, - 0xf9, 0x84, 0x79, 0x66, 0x17, 0xe3, 0x3b, 0xda, 0x62, 0xbc, 0x28, 0x37, 0x06, 0xa5, 0x69, 0x43, - 0x2d, 0xc5, 0x3d, 0x20, 0xfd, 0x34, 0xc4, 0x92, 0xe7, 0x29, 0xc3, 0xac, 0xc2, 0x9b, 0xc9, 0xdd, - 0x71, 0x88, 0x44, 0x36, 0x8a, 0xc2, 0xd0, 0xd2, 0x78, 0x98, 0xbf, 0x96, 0x83, 0x09, 0x45, 0x9f, - 0x7c, 0x66, 0x3b, 0xfe, 0x4b, 0x5a, 0xc7, 0xcb, 0x3b, 0x08, 0xa5, 0x65, 0x43, 0xf5, 0x7b, 0x0f, - 0xa6, 0xfb, 0x48, 0xd2, 0x6a, 0xb9, 0x31, 0x8c, 0x5a, 0xfe, 0x46, 0xff, 0xe5, 0x36, 0x77, 0x48, - 0x8e, 0x2f, 0xb7, 0xd5, 0xdb, 0xf4, 0x6f, 0xe5, 0xe0, 0xac, 0xf8, 0x55, 0xeb, 0xb9, 0x5e, 0xb4, - 0xe0, 0x77, 0x1e, 0x7a, 0xbb, 0xcf, 0xec, 0x58, 0xd4, 0xb4, 0xb1, 0xa8, 0xea, 0x63, 0xa1, 0x34, - 0x70, 0xf0, 0x90, 0x98, 0xff, 0xba, 0x08, 0xb3, 0x83, 0x08, 0x98, 0xd9, 0xaf, 0x58, 0x55, 0x68, - 0xf6, 0xa7, 0x2c, 0x56, 0x6e, 0x4f, 0x25, 0xce, 0x1c, 0xb9, 0x21, 0x9c, 0x39, 0x56, 0xa0, 0x82, - 0x9f, 0x6a, 0xd0, 0x90, 0x75, 0x42, 0x98, 0x78, 0x43, 0x5e, 0x39, 0x3a, 0xac, 0x5e, 0x76, 0x58, - 0x99, 0x1d, 0x8a, 0x42, 0xbb, 0x17, 0x78, 0x0a, 0x8f, 0x3e, 0x4a, 0xf2, 0x07, 0x06, 0x4c, 0x22, - 0x70, 0xe9, 0x11, 0xed, 0x44, 0xc8, 0xac, 0x20, 0x2e, 0x69, 0xe2, 0xa0, 0x93, 0x46, 0x14, 0x78, - 0x9d, 0x5d, 0x3c, 0x48, 0x0a, 0xeb, 0x3b, 0xac, 0x17, 0xfe, 0xe2, 0xb0, 0xfa, 0xee, 0x27, 0x09, - 0x64, 0x11, 0xac, 0x42, 0x66, 0xc8, 0xf3, 0x8a, 0x52, 0xfc, 0x6c, 0xaa, 0x9a, 0xa9, 0x1a, 0x91, - 0x9f, 0x82, 0x0b, 0x4b, 0x1d, 0x67, 0xa7, 0x45, 0x17, 0xfc, 0x4e, 0xe4, 0x75, 0x7a, 0x7e, 0x2f, - 0xac, 0x3b, 0xcd, 0xfd, 0x5e, 0x37, 0x14, 0x87, 0x9d, 0xd8, 0xf2, 0x66, 0x5c, 0x68, 0xef, 0xf0, - 0x52, 0x85, 0xe5, 0x20, 0x06, 0xe4, 0x1e, 0x4c, 0xf3, 0xa2, 0x5a, 0x2f, 0xf2, 0x1b, 0x4d, 0xa7, - 0xe5, 0x75, 0x76, 0xf1, 0x0c, 0xb4, 0x58, 0xbf, 0xc4, 0x6c, 0x4b, 0xa7, 0x17, 0xf9, 0x76, 0xc8, - 0xe1, 0x0a, 0xbf, 0x7e, 0x22, 0xb2, 0x0c, 0x53, 0x16, 0x75, 0xdc, 0x07, 0xce, 0x93, 0x05, 0xa7, - 0xeb, 0x34, 0xbd, 0xe8, 0x00, 0x2d, 0xb3, 0x7c, 0xbd, 0x7a, 0x74, 0x58, 0x7d, 0x21, 0xa0, 0x8e, - 0x6b, 0xb7, 0x9d, 0x27, 0x76, 0x53, 0x14, 0x2a, 0xcc, 0xd2, 0x74, 0x31, 0x2b, 0xaf, 0x13, 0xb3, - 0x2a, 0xa5, 0x59, 0x79, 0x9d, 0xc1, 0xac, 0x12, 0x3a, 0xc9, 0x6a, 0xc3, 0x09, 0x76, 0x69, 0xc4, - 0x0f, 0x09, 0xe1, 0x8a, 0x71, 0xd5, 0x50, 0x58, 0x45, 0x58, 0x66, 0xe3, 0x81, 0x61, 0x9a, 0x95, - 0x42, 0xc7, 0x66, 0xde, 0x76, 0xe0, 0x45, 0x54, 0x6d, 0xe1, 0x38, 0x56, 0x0b, 0xfb, 0x1f, 0x8f, - 0x49, 0x07, 0x35, 0xb1, 0x8f, 0x32, 0xe1, 0xa6, 0x34, 0xb2, 0xdc, 0xc7, 0x2d, 0xbb, 0x95, 0x7d, - 0x94, 0x31, 0x37, 0xb5, 0x9d, 0x13, 0xd8, 0x4e, 0x85, 0xdb, 0x80, 0x86, 0xf6, 0x51, 0x92, 0x55, - 0xd6, 0x69, 0x11, 0xed, 0xb0, 0x19, 0x2d, 0x0e, 0x49, 0x27, 0xb1, 0x6a, 0xaf, 0x08, 0x9b, 0xba, - 0x12, 0xc8, 0x62, 0x3b, 0xe3, 0xc8, 0x34, 0x4d, 0xfc, 0x61, 0xa1, 0x38, 0x52, 0x19, 0xb5, 0x2a, - 0x7c, 0xca, 0x47, 0x6c, 0xe2, 0xa0, 0x2c, 0x36, 0x7f, 0x27, 0x07, 0x17, 0xa5, 0x38, 0xa6, 0xd1, - 0x63, 0x3f, 0xd8, 0xf7, 0x3a, 0xbb, 0xcf, 0xb8, 0x54, 0xbd, 0xa3, 0x49, 0xd5, 0x57, 0x52, 0x3b, - 0x5c, 0xaa, 0x95, 0xc7, 0x88, 0xd6, 0x3f, 0x1f, 0x81, 0x17, 0x8f, 0xa5, 0x22, 0x1f, 0xb1, 0x5d, - 0xd0, 0xa3, 0x9d, 0x68, 0xd9, 0x6d, 0x51, 0x66, 0x86, 0xf9, 0xbd, 0x48, 0x1c, 0x66, 0xbf, 0x7c, - 0x74, 0x58, 0x9d, 0xe1, 0xb1, 0x18, 0xb6, 0xe7, 0xb6, 0xa8, 0x1d, 0xf1, 0x62, 0x6d, 0x98, 0xfa, - 0xa9, 0x19, 0xcb, 0x38, 0x32, 0x6c, 0xb9, 0x13, 0xd1, 0xe0, 0x91, 0xc3, 0x5d, 0xd2, 0x05, 0xcb, - 0x7d, 0x4a, 0xbb, 0xb6, 0xc3, 0x4a, 0x6d, 0x4f, 0x14, 0xeb, 0x2c, 0xfb, 0xa8, 0xc9, 0x1d, 0x85, - 0xe5, 0x02, 0x33, 0x0e, 0x1e, 0x38, 0x4f, 0x84, 0xc6, 0x8b, 0xe7, 0xab, 0x0a, 0x4b, 0xee, 0x0f, - 0xd7, 0x76, 0x9e, 0x58, 0xfd, 0x24, 0xe4, 0x1b, 0x70, 0x4e, 0x08, 0x6e, 0x26, 0xc4, 0x02, 0xbf, - 0x25, 0x5b, 0x5c, 0x40, 0x5e, 0xaf, 0x1f, 0x1d, 0x56, 0x2f, 0x08, 0xb1, 0x6f, 0x37, 0x39, 0x46, - 0x66, 0xab, 0xb3, 0xb9, 0x90, 0x0d, 0xb6, 0x91, 0xa5, 0xba, 0xe3, 0x01, 0x0d, 0x43, 0x67, 0x57, - 0x6a, 0xc7, 0xfc, 0x46, 0x49, 0xe9, 0x4c, 0xbb, 0xcd, 0xcb, 0xad, 0x81, 0x94, 0xe4, 0x1e, 0x4c, - 0x6e, 0xd3, 0x1d, 0x75, 0x7c, 0x46, 0xe3, 0x25, 0x5e, 0x79, 0x4c, 0x77, 0x06, 0x0f, 0x4e, 0x8a, - 0x8e, 0x78, 0x30, 0xbd, 0x1e, 0xf8, 0x4f, 0x0e, 0x98, 0xa9, 0x47, 0x3b, 0x34, 0x40, 0x47, 0xac, - 0x31, 0x3c, 0xae, 0x9a, 0x4d, 0x34, 0x4b, 0xbd, 0xbc, 0xfe, 0xb9, 0xa3, 0xc3, 0xea, 0x8b, 0x5d, - 0x06, 0xb6, 0x5b, 0x02, 0x6e, 0xa7, 0x02, 0xb3, 0xfa, 0xb9, 0x92, 0x9f, 0x81, 0x29, 0xcb, 0xef, - 0x45, 0x5e, 0x67, 0xb7, 0x11, 0x05, 0x4e, 0x44, 0x77, 0xb9, 0x20, 0x4f, 0x3c, 0xbe, 0x52, 0xa5, - 0xfc, 0x60, 0x3a, 0xe0, 0x40, 0x3b, 0x14, 0x50, 0x4d, 0x92, 0xea, 0x04, 0xe6, 0x6f, 0xe5, 0x60, - 0x56, 0x0c, 0x83, 0x45, 0x9b, 0x7e, 0xe0, 0x3e, 0xfb, 0xcb, 0x7e, 0x49, 0x5b, 0xf6, 0x2f, 0xc7, - 0x3e, 0x4a, 0x59, 0x8d, 0x3c, 0x66, 0xd5, 0xff, 0x53, 0x03, 0x2e, 0x1f, 0x47, 0xc4, 0x7a, 0x27, - 0xf6, 0xc1, 0x2b, 0xf5, 0xf9, 0xda, 0x75, 0x61, 0x06, 0xc7, 0x13, 0x0f, 0x8e, 0xc3, 0x7b, 0x7e, - 0x18, 0xe1, 0xe9, 0x5d, 0x4e, 0x73, 0x24, 0xa8, 0xfb, 0x7e, 0x0b, 0xe5, 0x7c, 0xfd, 0x0d, 0x26, - 0xce, 0xff, 0xe2, 0xb0, 0x0a, 0x0c, 0xb4, 0x86, 0x97, 0x91, 0x6c, 0xcf, 0xe7, 0x33, 0x06, 0xcf, - 0xa5, 0x43, 0x1b, 0xbd, 0x3f, 0xf6, 0xe9, 0x41, 0x68, 0x65, 0xb1, 0xc6, 0x13, 0x9a, 0x5a, 0x2f, - 0xda, 0x5b, 0x0f, 0xe8, 0x43, 0x1a, 0xd0, 0x4e, 0x93, 0x3e, 0x67, 0x27, 0x34, 0x7a, 0xe3, 0x86, - 0x32, 0x4f, 0xfe, 0xef, 0x28, 0x9c, 0xcd, 0x22, 0x63, 0xfd, 0xa2, 0x68, 0xc4, 0xe9, 0x28, 0xde, - 0xbf, 0x65, 0x40, 0xb9, 0x41, 0x9b, 0x7e, 0xc7, 0xbd, 0xe3, 0x34, 0x23, 0x5f, 0xba, 0x64, 0xd8, - 0x5c, 0xb2, 0x31, 0xb8, 0xfd, 0x10, 0x0b, 0xb4, 0x93, 0x81, 0x2f, 0x0f, 0xa7, 0x88, 0x36, 0x7d, - 0x74, 0x5a, 0x8d, 0xd8, 0x9c, 0x4c, 0x3e, 0x81, 0xb7, 0x1a, 0xda, 0x47, 0x49, 0x1d, 0x26, 0x16, - 0xfc, 0x4e, 0x87, 0xb2, 0x1f, 0x8a, 0x0b, 0xe6, 0xe5, 0xa3, 0xc3, 0xea, 0x6c, 0x53, 0x16, 0xa4, - 0x4f, 0x08, 0x74, 0x12, 0x72, 0x0b, 0xf2, 0x9b, 0xf3, 0x77, 0xc4, 0x18, 0x48, 0x67, 0xb5, 0xcd, - 0xf9, 0x3b, 0x68, 0xeb, 0x32, 0xfd, 0x61, 0xa2, 0x37, 0xff, 0x50, 0x3d, 0x03, 0xdd, 0x9c, 0xbf, - 0x43, 0xd6, 0x60, 0xda, 0xa2, 0x3f, 0xdb, 0xf3, 0x02, 0x2a, 0x16, 0xc0, 0x83, 0x3b, 0x35, 0x1c, - 0x8b, 0x22, 0x97, 0x63, 0x01, 0x2f, 0x94, 0xba, 0xbd, 0xdd, 0x7e, 0xa8, 0x46, 0xae, 0xf5, 0xd3, - 0x92, 0x5f, 0x84, 0x73, 0x8b, 0x5e, 0x28, 0xea, 0xcc, 0x0f, 0x1f, 0x5d, 0xbc, 0x87, 0x1c, 0x1d, - 0xb0, 0x1c, 0x7e, 0x22, 0x73, 0x39, 0x7c, 0xce, 0x8d, 0x99, 0xd8, 0xfc, 0x64, 0xd3, 0x4d, 0xfb, - 0xae, 0x66, 0x7f, 0x87, 0x7c, 0x0c, 0x93, 0x78, 0xda, 0x83, 0xe7, 0xb1, 0xe8, 0xce, 0x3c, 0x36, - 0xe0, 0xcb, 0x5f, 0xc8, 0xfc, 0xf2, 0x25, 0x3c, 0x3c, 0xb2, 0xf1, 0x54, 0x17, 0x5d, 0x9f, 0x35, - 0x1b, 0x41, 0xe3, 0x4c, 0x3e, 0x84, 0x29, 0xb1, 0xe9, 0xac, 0x3d, 0xdc, 0xd8, 0xa3, 0x8b, 0xce, - 0x81, 0x70, 0x42, 0x40, 0xfd, 0x4f, 0xec, 0x54, 0xb6, 0xff, 0xd0, 0x8e, 0xf6, 0xa8, 0xed, 0x3a, - 0x9a, 0x78, 0x4e, 0x11, 0x92, 0x9f, 0x87, 0xf1, 0x15, 0x1f, 0x2f, 0x9e, 0x50, 0xd4, 0x94, 0x90, - 0xcf, 0x57, 0x31, 0x72, 0x95, 0x83, 0x53, 0x9b, 0xc8, 0x8f, 0x0e, 0xab, 0xef, 0x9c, 0x76, 0x16, - 0x2a, 0x1f, 0xb0, 0xd4, 0xaf, 0x91, 0x05, 0x28, 0x6e, 0xd3, 0x1d, 0xd6, 0xda, 0x74, 0xd4, 0x95, - 0x04, 0x73, 0x79, 0xf1, 0x58, 0xfc, 0x52, 0x6f, 0x75, 0x24, 0x86, 0xf9, 0xaf, 0x0c, 0x9c, 0x81, - 0xe4, 0x3a, 0x3a, 0x82, 0xc5, 0xde, 0xe0, 0x68, 0x59, 0x3a, 0xdd, 0xae, 0xee, 0xcf, 0xcd, 0x51, - 0x98, 0x19, 0x7a, 0xc7, 0x69, 0xd2, 0x48, 0x9e, 0x57, 0x22, 0xf2, 0x43, 0x84, 0xa8, 0x66, 0x28, - 0xc7, 0x21, 0x5f, 0x81, 0xb3, 0x8b, 0xf4, 0x91, 0xd7, 0xa4, 0xb5, 0x28, 0xa2, 0x21, 0x6f, 0xed, - 0x42, 0x8d, 0x5f, 0xec, 0x95, 0xea, 0xaf, 0x1c, 0x1d, 0x56, 0xaf, 0xb8, 0x58, 0x6e, 0x3b, 0x09, - 0x82, 0xdd, 0x74, 0x54, 0x5e, 0x99, 0x1c, 0xcc, 0xff, 0x69, 0x24, 0x3d, 0x40, 0x5e, 0x87, 0x82, - 0xb5, 0x1e, 0xd7, 0x9f, 0xdf, 0xd9, 0xa5, 0xaa, 0x8f, 0x08, 0xe4, 0x6b, 0x70, 0x4e, 0xe1, 0x83, - 0x93, 0x83, 0xba, 0xac, 0x42, 0xbc, 0x31, 0xaf, 0xe2, 0x25, 0x8d, 0x52, 0x13, 0x87, 0x63, 0xa4, - 0x6a, 0x94, 0xcd, 0x83, 0x35, 0x56, 0x29, 0x58, 0xa4, 0x1d, 0x8f, 0xf3, 0x56, 0x1a, 0xab, 0xf2, - 0x76, 0x11, 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0x1f, 0x16, 0x8a, 0x85, 0xca, 0x88, 0xf9, 0xd7, 0x86, - 0x92, 0x02, 0xe0, 0x19, 0xdd, 0x3d, 0x6e, 0x6b, 0xbb, 0xc7, 0x59, 0x41, 0x1a, 0xb7, 0x8a, 0x95, - 0x65, 0xee, 0xf8, 0x53, 0x30, 0xa1, 0x21, 0xa1, 0xcb, 0xeb, 0x66, 0x48, 0x03, 0x7e, 0x3e, 0xf8, - 0x7c, 0xb9, 0xbc, 0xc6, 0xed, 0x1a, 0xca, 0x93, 0xf1, 0x2f, 0x0d, 0x98, 0x4a, 0x51, 0xb0, 0xde, - 0x60, 0x20, 0xb5, 0x37, 0x7a, 0x21, 0x0d, 0x2c, 0x84, 0x72, 0x07, 0xb9, 0x15, 0xdd, 0x41, 0xae, - 0x65, 0x31, 0x18, 0xf9, 0x32, 0x8c, 0x6c, 0xa2, 0x36, 0xaf, 0xfb, 0x58, 0xc4, 0xfc, 0xb1, 0x90, - 0xaf, 0xb0, 0x1e, 0xfb, 0x57, 0x15, 0x10, 0x58, 0x46, 0x1a, 0x30, 0xb6, 0x10, 0x50, 0x0c, 0xf6, - 0x2f, 0x0c, 0x7f, 0x19, 0xd6, 0xe4, 0x24, 0xe9, 0xcb, 0x30, 0xc1, 0xc9, 0xfc, 0xcd, 0x1c, 0x90, - 0xa4, 0x8d, 0xb4, 0x19, 0xd0, 0x28, 0x7c, 0x66, 0x07, 0xfd, 0x03, 0x6d, 0xd0, 0x5f, 0xec, 0x1b, - 0x74, 0xde, 0xbc, 0xa1, 0xc6, 0xfe, 0x4f, 0x0c, 0x38, 0x9f, 0x4d, 0x48, 0x5e, 0x86, 0xd1, 0xb5, - 0x8d, 0x75, 0xe9, 0xa6, 0x23, 0x9a, 0xe2, 0x77, 0x51, 0x4b, 0xb5, 0x44, 0x11, 0x79, 0x13, 0x46, - 0x3f, 0xb2, 0x16, 0xd8, 0xf6, 0xa5, 0x44, 0x9d, 0xfc, 0x6c, 0x60, 0x37, 0x75, 0xf3, 0x47, 0x20, - 0xa9, 0x63, 0x9b, 0x7f, 0x6a, 0x63, 0xfb, 0xad, 0x1c, 0x4c, 0xd5, 0x9a, 0x4d, 0x1a, 0x86, 0x4c, - 0x39, 0xa1, 0x61, 0xf4, 0xcc, 0x0e, 0x6c, 0xb6, 0x03, 0x8e, 0xd6, 0xb6, 0xa1, 0x46, 0xf5, 0x4f, - 0x0d, 0x38, 0x27, 0xa9, 0x1e, 0x79, 0xf4, 0xf1, 0xc6, 0x5e, 0x40, 0xc3, 0x3d, 0xbf, 0xe5, 0x0e, - 0x1b, 0x3f, 0x85, 0xbb, 0xb4, 0xd7, 0x8a, 0x68, 0xa0, 0x1e, 0x16, 0x3f, 0x44, 0x88, 0xb6, 0x4b, - 0x23, 0x84, 0xcc, 0xc1, 0x58, 0xad, 0xdb, 0x0d, 0xfc, 0x47, 0x7c, 0xd9, 0x4f, 0x88, 0xbb, 0x41, - 0x0e, 0xd2, 0xee, 0x12, 0x39, 0x88, 0x55, 0x63, 0x91, 0x76, 0xb8, 0x77, 0xf1, 0x04, 0xaf, 0x86, - 0x4b, 0x3b, 0xaa, 0xb6, 0x84, 0xe5, 0xe6, 0x37, 0x0b, 0x50, 0x56, 0x1b, 0x42, 0x4c, 0x18, 0xe5, - 0xae, 0x22, 0xea, 0x95, 0xbd, 0x83, 0x10, 0x4b, 0x94, 0x24, 0x1e, 0x38, 0xb9, 0x13, 0x3d, 0x70, - 0xb6, 0x61, 0x62, 0x3d, 0xf0, 0xbb, 0x7e, 0x48, 0x5d, 0x9e, 0xaf, 0x85, 0x4b, 0xad, 0x99, 0xd8, - 0x2d, 0x95, 0xf7, 0x39, 0x2b, 0xe2, 0xaa, 0x79, 0x57, 0x60, 0xdb, 0xe9, 0x6c, 0x2e, 0x3a, 0x1f, - 0x7e, 0xd8, 0xee, 0x84, 0xc2, 0x75, 0x3f, 0x3e, 0x6c, 0x67, 0x10, 0xfd, 0xb0, 0x9d, 0x41, 0xd4, - 0x65, 0x31, 0xf2, 0xb4, 0x96, 0x05, 0xf9, 0x4d, 0x03, 0xc6, 0x6b, 0x9d, 0x8e, 0xf0, 0xc0, 0x91, - 0x41, 0xcf, 0xe7, 0x92, 0x03, 0x77, 0xee, 0xa2, 0xc9, 0xcf, 0xdb, 0xbf, 0x2e, 0xce, 0xdb, 0xdf, - 0xf9, 0x44, 0xe7, 0xed, 0x1b, 0x81, 0xe3, 0x45, 0x21, 0x5e, 0xac, 0x26, 0x1f, 0x54, 0xdd, 0x70, - 0x95, 0x7a, 0x90, 0x77, 0xa0, 0x12, 0xcf, 0xc7, 0xe5, 0x8e, 0x4b, 0x9f, 0x50, 0xee, 0xb0, 0x34, - 0xc1, 0x23, 0xf3, 0xb4, 0x8b, 0x84, 0x34, 0xa2, 0xf9, 0x2d, 0x03, 0xce, 0xab, 0x13, 0xa2, 0xd1, - 0xdb, 0x69, 0x7b, 0x68, 0x8a, 0x90, 0x1b, 0x50, 0x12, 0xe3, 0x15, 0x2b, 0x72, 0xfd, 0x49, 0x7e, - 0x12, 0x14, 0xb2, 0xc4, 0x86, 0x88, 0xf1, 0x10, 0x76, 0xfb, 0x4c, 0x6a, 0xb9, 0xb1, 0xa2, 0xfa, - 0xac, 0xe8, 0xec, 0x4a, 0x80, 0xbf, 0xf5, 0xb1, 0x63, 0x10, 0xf3, 0x7d, 0x98, 0xd6, 0x6b, 0xd9, - 0xa0, 0x18, 0x0e, 0x26, 0x9b, 0x66, 0x64, 0x37, 0x4d, 0x96, 0x9b, 0xdb, 0x40, 0xfa, 0xe8, 0x43, - 0xbc, 0x34, 0xa2, 0x91, 0xbc, 0xd4, 0x94, 0x47, 0x4f, 0x7d, 0x88, 0x71, 0xba, 0xab, 0x71, 0xb5, - 0xbb, 0x91, 0xd4, 0xfc, 0x9b, 0x12, 0xcc, 0x64, 0x88, 0x8e, 0x13, 0xb6, 0xf6, 0xaa, 0xbe, 0x78, - 0x4a, 0xf1, 0xed, 0xbc, 0x5c, 0x32, 0xef, 0xcb, 0xd4, 0x46, 0xc7, 0x2c, 0x95, 0xe3, 0xf2, 0x1d, - 0x7d, 0x16, 0xdb, 0xbb, 0xea, 0x40, 0x33, 0xf2, 0xd4, 0x1c, 0x68, 0xea, 0x30, 0x21, 0x5a, 0x25, - 0x96, 0xf2, 0x68, 0x62, 0xa2, 0x07, 0xbc, 0xc0, 0xee, 0x5b, 0xd2, 0x3a, 0x09, 0xe7, 0x11, 0xfa, - 0xad, 0x47, 0x54, 0xf0, 0x18, 0x53, 0x79, 0x60, 0x41, 0x26, 0x0f, 0x85, 0x84, 0xfc, 0x13, 0x03, - 0x88, 0x80, 0xa8, 0xeb, 0xb9, 0x78, 0xdc, 0x7a, 0x76, 0x9f, 0xce, 0x7a, 0x7e, 0x51, 0xd6, 0x31, - 0x7b, 0x5d, 0x67, 0x54, 0x8b, 0xfc, 0x23, 0x03, 0xa6, 0xb9, 0x17, 0x87, 0x5a, 0xd9, 0xd2, 0x71, - 0x95, 0x6d, 0x3e, 0x9d, 0xca, 0x5e, 0x0e, 0xf1, 0xb3, 0x03, 0xea, 0xda, 0x5f, 0x29, 0xf2, 0x53, - 0x00, 0xf1, 0x8a, 0x92, 0xde, 0x82, 0x97, 0x33, 0xa4, 0x40, 0x8c, 0x94, 0x04, 0x3c, 0x46, 0x31, - 0x9d, 0xea, 0x5f, 0x93, 0x70, 0x23, 0xbf, 0x08, 0x67, 0xd9, 0x7a, 0x89, 0x21, 0xc2, 0xe7, 0x6c, - 0x76, 0x1c, 0xbf, 0xf2, 0xc5, 0xc1, 0x5b, 0xfb, 0x8d, 0x2c, 0x32, 0x1e, 0xb3, 0x91, 0x84, 0xbf, - 0x47, 0x6d, 0xd5, 0xe4, 0xcb, 0xa2, 0x40, 0xe7, 0x52, 0xac, 0x7d, 0x38, 0x5b, 0xc6, 0x6f, 0x66, - 0xca, 0xb7, 0x8b, 0x72, 0x2d, 0x70, 0xf9, 0x16, 0xea, 0x41, 0x17, 0x08, 0x22, 0x1f, 0x01, 0x69, - 0xf4, 0x76, 0x77, 0x69, 0x18, 0x51, 0x97, 0xc3, 0x68, 0x10, 0xce, 0x4e, 0xa0, 0x7c, 0xc0, 0x23, - 0xa3, 0x50, 0x96, 0xda, 0x81, 0x2c, 0x56, 0x27, 0x49, 0x3f, 0xf1, 0xa5, 0x1d, 0xb8, 0x38, 0xb0, - 0x99, 0x19, 0x01, 0x15, 0x73, 0x7a, 0x40, 0xc5, 0xc5, 0x41, 0xe2, 0x30, 0x54, 0x83, 0x2a, 0x7e, - 0xcf, 0x48, 0xc9, 0x3f, 0xa1, 0xac, 0xf0, 0x2c, 0x70, 0x83, 0x36, 0x88, 0x1c, 0x06, 0xc6, 0x73, - 0x09, 0x99, 0x4b, 0x94, 0x24, 0x26, 0x21, 0x55, 0x09, 0x8b, 0xb2, 0xf2, 0x53, 0x8a, 0x42, 0xf3, - 0x9f, 0x1b, 0x40, 0x78, 0x0d, 0x17, 0x9c, 0xae, 0xb3, 0xe3, 0xb5, 0xbc, 0xc8, 0xa3, 0x21, 0xb9, - 0x0f, 0x15, 0xc1, 0xc2, 0xd9, 0x69, 0x51, 0xd5, 0x57, 0x4a, 0x5c, 0xa6, 0xc6, 0x65, 0x76, 0x5a, - 0xad, 0xe9, 0x23, 0x1c, 0x30, 0x78, 0xb9, 0x4f, 0x31, 0x78, 0xe6, 0x0f, 0x0d, 0xb8, 0xd8, 0x5f, - 0x6d, 0xf1, 0xe5, 0xb8, 0xf3, 0x8c, 0x13, 0x3a, 0x2f, 0xab, 0x95, 0x39, 0x3c, 0x86, 0x7c, 0x6a, - 0xad, 0xcc, 0x27, 0xa7, 0x9a, 0xa7, 0x6f, 0xe5, 0xaf, 0xe6, 0xa0, 0xbc, 0xde, 0xea, 0xed, 0x7a, - 0x9d, 0x45, 0x27, 0x72, 0x9e, 0x59, 0x93, 0xe2, 0x6d, 0xcd, 0xa4, 0x88, 0xbd, 0xa3, 0xe2, 0x86, - 0x0d, 0x97, 0x91, 0xcb, 0x80, 0xa9, 0x84, 0x84, 0xaf, 0xd2, 0x7b, 0x50, 0x60, 0x3f, 0x84, 0x86, - 0x72, 0xa5, 0x8f, 0x31, 0x62, 0xdd, 0x88, 0xff, 0x13, 0x4a, 0xbe, 0x9e, 0x07, 0x0d, 0x39, 0x5c, - 0xfa, 0x09, 0x9e, 0xc6, 0xe8, 0xf4, 0x29, 0x17, 0xff, 0x99, 0x01, 0x95, 0x74, 0x4b, 0xc8, 0x7d, - 0x18, 0x63, 0x9c, 0xbc, 0x38, 0x25, 0xd2, 0x2b, 0x03, 0xda, 0x7c, 0x43, 0xa0, 0xf1, 0xea, 0x61, - 0xe7, 0x53, 0x0e, 0xb1, 0x24, 0x87, 0x4b, 0x16, 0x94, 0x55, 0xac, 0x8c, 0xda, 0xbd, 0xa1, 0x8b, - 0xa6, 0xf3, 0xd9, 0xfd, 0xa0, 0xd6, 0xfa, 0x77, 0xb5, 0x5a, 0x0b, 0xa1, 0x34, 0x6c, 0x6e, 0x3b, - 0x0c, 0x0f, 0xe3, 0x19, 0x3c, 0xd4, 0x79, 0x26, 0x93, 0x7d, 0xe8, 0xe1, 0x61, 0x1c, 0xc6, 0x6c, - 0x11, 0xfe, 0x3d, 0x31, 0xcf, 0xd0, 0x16, 0xe9, 0x22, 0x44, 0xd5, 0x67, 0x39, 0x8e, 0xf9, 0xf7, - 0xf2, 0x70, 0x3e, 0xa9, 0x1e, 0xcf, 0xf4, 0xb7, 0xee, 0x04, 0x4e, 0x3b, 0x3c, 0x61, 0x05, 0x5c, - 0xed, 0xab, 0x1a, 0x86, 0x3f, 0xcb, 0xaa, 0x29, 0x15, 0x32, 0x53, 0x15, 0x42, 0x23, 0x8e, 0x57, - 0x48, 0x56, 0x83, 0xdc, 0x87, 0x7c, 0x83, 0x46, 0x22, 0x48, 0xf2, 0xb5, 0xbe, 0x5e, 0x55, 0xeb, - 0x75, 0xa3, 0x41, 0x23, 0x3e, 0x88, 0xdc, 0xcf, 0x9c, 0x6a, 0x7e, 0xdf, 0x4c, 0x1d, 0xdf, 0x86, - 0xd1, 0xa5, 0x27, 0x5d, 0xda, 0x8c, 0x44, 0x6c, 0xe4, 0xb5, 0xe3, 0xf9, 0x71, 0x5c, 0x25, 0x02, - 0x93, 0x22, 0x40, 0xed, 0x2c, 0x8e, 0x72, 0xe9, 0x36, 0x14, 0xe5, 0xc7, 0x4f, 0x15, 0x49, 0xf8, - 0x36, 0x8c, 0x2b, 0x1f, 0x39, 0xd5, 0xa4, 0xff, 0x1b, 0x03, 0x46, 0x99, 0xd0, 0xdb, 0x7a, 0xeb, - 0x19, 0x95, 0x48, 0xb7, 0x34, 0x89, 0x34, 0xad, 0x84, 0xbc, 0xe0, 0xba, 0x7c, 0xeb, 0x04, 0x59, - 0x74, 0x68, 0x00, 0x24, 0xc8, 0xe4, 0x2e, 0x8c, 0xf1, 0x8b, 0x1c, 0x99, 0x46, 0x53, 0x8d, 0xa1, - 0x11, 0x25, 0x89, 0x96, 0xe3, 0x77, 0xd3, 0x6a, 0xa1, 0xa4, 0x26, 0x8b, 0x89, 0x9f, 0xb1, 0x1a, - 0xb4, 0xc9, 0xd8, 0x2c, 0xf8, 0x1d, 0x1e, 0x53, 0x11, 0x2a, 0xe9, 0xa6, 0xb2, 0x1d, 0x8e, 0x6b, - 0xe2, 0x60, 0x23, 0x7f, 0x1c, 0x93, 0xf3, 0x82, 0x49, 0xf6, 0x99, 0xc7, 0xb7, 0xc7, 0x79, 0x94, - 0x82, 0xac, 0xd8, 0x7b, 0x50, 0xbe, 0xe3, 0x07, 0x8f, 0x9d, 0xc0, 0xad, 0xed, 0x52, 0xe1, 0x21, - 0x5e, 0x44, 0x37, 0xef, 0x89, 0x87, 0x1c, 0x6e, 0x3b, 0xac, 0xe0, 0x47, 0x87, 0xd5, 0x42, 0xdd, - 0xf7, 0x5b, 0x96, 0x86, 0x4e, 0xd6, 0x60, 0xe2, 0x81, 0xf3, 0x44, 0xdc, 0xd7, 0x6d, 0x6c, 0xac, - 0x08, 0x3f, 0x93, 0x6b, 0x47, 0x87, 0xd5, 0x8b, 0x6d, 0xe7, 0x49, 0x7c, 0xcf, 0x37, 0xd8, 0x15, - 0x5a, 0xa7, 0x27, 0x1e, 0x4c, 0xae, 0xfb, 0x41, 0x24, 0x3e, 0xc2, 0x74, 0xda, 0xfc, 0x80, 0xeb, - 0xb6, 0xb9, 0xcc, 0xeb, 0xb6, 0x8b, 0x4c, 0x91, 0xb7, 0x1f, 0xc6, 0xe4, 0x5a, 0x68, 0x9d, 0xc6, - 0x98, 0xbc, 0x07, 0xd3, 0x0b, 0x34, 0x88, 0xbc, 0x87, 0x5e, 0xd3, 0x89, 0xe8, 0x1d, 0x3f, 0x68, - 0x3b, 0x91, 0x38, 0x50, 0x41, 0x83, 0xba, 0x49, 0x39, 0xa7, 0xb6, 0x13, 0x59, 0xfd, 0x98, 0xe4, - 0x6b, 0x59, 0x9e, 0x3b, 0x23, 0xd8, 0xfc, 0x37, 0x99, 0x52, 0x90, 0xe1, 0xb9, 0x33, 0xa0, 0x0b, - 0x32, 0x7c, 0x78, 0x76, 0x8f, 0xbb, 0xf6, 0x2c, 0xd6, 0x6f, 0x8a, 0x2b, 0xd8, 0x93, 0xaf, 0x35, - 0xe3, 0x71, 0x1b, 0x70, 0xbd, 0x39, 0x0f, 0xf9, 0xfa, 0xfa, 0x1d, 0x3c, 0x22, 0x11, 0xd7, 0x8c, - 0xb4, 0xb3, 0xe7, 0x74, 0x9a, 0xa8, 0xcb, 0x08, 0xdf, 0x05, 0x55, 0xe0, 0xd5, 0xd7, 0xef, 0x10, - 0x07, 0x66, 0xd6, 0x69, 0xd0, 0xf6, 0xa2, 0xaf, 0xdc, 0xbc, 0xa9, 0x0c, 0x54, 0x11, 0xab, 0x36, - 0x27, 0xaa, 0x56, 0xed, 0x22, 0x8a, 0xfd, 0xe4, 0xe6, 0xcd, 0xcc, 0xe1, 0x88, 0x2b, 0x96, 0xc5, - 0x8b, 0x2c, 0xc1, 0xe4, 0x03, 0xe7, 0x89, 0xb8, 0x90, 0x8e, 0x6d, 0xbc, 0x3c, 0x7a, 0xc6, 0xe3, - 0xc4, 0x6a, 0x26, 0x45, 0xea, 0x10, 0xeb, 0x44, 0xe4, 0x5d, 0x18, 0x4f, 0xa6, 0x57, 0x88, 0x57, - 0x91, 0x79, 0xee, 0x12, 0xa9, 0x4c, 0x4e, 0xed, 0x2c, 0x49, 0x41, 0x27, 0x9b, 0xb1, 0x89, 0xce, - 0x15, 0x52, 0x74, 0x14, 0x2c, 0xd5, 0xe7, 0x54, 0x13, 0xdd, 0xc1, 0x12, 0xad, 0x59, 0x53, 0xb1, - 0x8a, 0xce, 0x3d, 0x65, 0x2c, 0x9d, 0x8b, 0x62, 0xf9, 0xaf, 0x07, 0x7e, 0xbb, 0x1b, 0xa1, 0xc7, - 0x60, 0xca, 0xf2, 0xef, 0x62, 0x49, 0x86, 0xe5, 0xcf, 0x49, 0xb2, 0xef, 0xd9, 0x27, 0x3e, 0xc5, - 0x3d, 0x3b, 0x85, 0xc2, 0x8a, 0xdf, 0xdc, 0x47, 0x17, 0xc1, 0x52, 0xfd, 0x23, 0x26, 0x3f, 0x5a, - 0x7e, 0x73, 0xff, 0xe9, 0xdd, 0x0f, 0x23, 0x7b, 0xb2, 0xca, 0xda, 0xce, 0xa6, 0x95, 0xf8, 0xf4, - 0xec, 0x94, 0x76, 0xd3, 0xa6, 0x95, 0x71, 0x45, 0x85, 0xcf, 0x42, 0xd9, 0x10, 0x4b, 0x27, 0x27, - 0x14, 0x2a, 0x8b, 0x34, 0xdc, 0x8f, 0xfc, 0xee, 0x42, 0xcb, 0xeb, 0xee, 0xf8, 0x4e, 0xe0, 0xce, - 0x56, 0x06, 0x08, 0x8c, 0xd7, 0x33, 0x05, 0xc6, 0xb4, 0xcb, 0xe9, 0xed, 0xa6, 0x64, 0x60, 0xf5, - 0xb1, 0x24, 0x5f, 0x83, 0x49, 0xb6, 0x5a, 0x96, 0x9e, 0x44, 0xb4, 0xc3, 0xa7, 0xd2, 0x34, 0x6e, - 0xf5, 0x67, 0x95, 0x20, 0xc3, 0xb8, 0x90, 0x4f, 0x52, 0x94, 0x1e, 0x34, 0x26, 0x50, 0x27, 0xa9, - 0xce, 0xca, 0xfc, 0xa9, 0x54, 0x9f, 0x90, 0x65, 0x18, 0x13, 0x35, 0x10, 0xbb, 0x4e, 0x7f, 0x5b, - 0x5e, 0xcc, 0x6c, 0xcb, 0x98, 0x68, 0x8b, 0x25, 0xe9, 0xcd, 0x7f, 0x63, 0xc0, 0x84, 0xf6, 0x39, - 0x72, 0x5b, 0x71, 0x5f, 0x49, 0xdc, 0xce, 0x34, 0x9c, 0xcc, 0xf4, 0xf4, 0xb7, 0x85, 0xcf, 0x52, - 0x6e, 0x30, 0x5d, 0x66, 0xe6, 0x30, 0x19, 0xf4, 0x9f, 0x3f, 0x3e, 0xe8, 0xbf, 0x30, 0x20, 0xe8, - 0xff, 0xdb, 0x13, 0x30, 0xa9, 0x6f, 0x70, 0x4c, 0xe3, 0x5c, 0xf1, 0x77, 0xbd, 0x8e, 0xb4, 0x5b, - 0x79, 0x1a, 0x0b, 0x84, 0x68, 0xb9, 0xde, 0x11, 0x42, 0x5e, 0x05, 0x88, 0xaf, 0x66, 0xa5, 0x69, - 0x2a, 0x32, 0xd3, 0x2b, 0x05, 0xe4, 0xa7, 0x01, 0x56, 0x7d, 0x97, 0xc6, 0x99, 0x50, 0x8e, 0x39, - 0x50, 0x7a, 0x5d, 0x1c, 0x28, 0x89, 0x6c, 0xf2, 0x47, 0x87, 0xd5, 0x73, 0x1d, 0xdf, 0xa5, 0xfd, - 0x29, 0x50, 0x14, 0x8e, 0xe4, 0x4b, 0x30, 0x62, 0xf5, 0x5a, 0x54, 0x26, 0xe6, 0x18, 0x97, 0x13, - 0xbe, 0xd7, 0x52, 0xb2, 0x4c, 0x06, 0xbd, 0xf4, 0x3d, 0x02, 0x03, 0x90, 0x0f, 0x00, 0xee, 0xf7, - 0x76, 0xe8, 0xdd, 0xc0, 0xef, 0x75, 0x65, 0xe4, 0x2f, 0x9a, 0xb1, 0xfb, 0x71, 0x1a, 0x27, 0x7b, - 0x17, 0x0b, 0xd5, 0x8f, 0x27, 0x24, 0x64, 0x0d, 0xc6, 0x84, 0xf8, 0x10, 0xe7, 0xf4, 0x2f, 0x65, - 0x9d, 0x10, 0x29, 0x3a, 0x84, 0xc8, 0x94, 0x81, 0x60, 0xfd, 0xd0, 0x86, 0x9b, 0xe1, 0xef, 0x42, - 0x89, 0xb1, 0x67, 0xa6, 0x76, 0x28, 0xf6, 0x0e, 0xf4, 0x1f, 0x54, 0x2a, 0xc4, 0xcc, 0x72, 0x2d, - 0x5f, 0x57, 0x4c, 0x40, 0xbe, 0x86, 0xb9, 0x6d, 0x44, 0x57, 0x1f, 0x7b, 0xd0, 0xf8, 0x5a, 0x5f, - 0x57, 0x9f, 0x75, 0xba, 0xdd, 0x8c, 0x64, 0x60, 0x31, 0x3f, 0xb2, 0x1b, 0xc7, 0xd8, 0xc4, 0xa9, - 0x86, 0x8f, 0xf9, 0xc0, 0xf5, 0xbe, 0x0f, 0xcc, 0xca, 0xb0, 0x91, 0xfe, 0x8c, 0x36, 0x1a, 0x5f, - 0xd2, 0x85, 0x4a, 0x92, 0x46, 0x4b, 0x7c, 0x0b, 0x8e, 0xfb, 0xd6, 0x9b, 0x7d, 0xdf, 0x52, 0x07, - 0xb0, 0xef, 0x73, 0x7d, 0xdc, 0x89, 0x9b, 0xa4, 0x85, 0x15, 0xdf, 0x1b, 0x3f, 0xee, 0x7b, 0xaf, - 0xf6, 0x7d, 0x6f, 0xc6, 0xdd, 0xe9, 0xff, 0x4e, 0x8a, 0x27, 0x79, 0x17, 0x26, 0x24, 0x04, 0xd7, - 0x07, 0x1e, 0xf0, 0x09, 0xfd, 0xde, 0xdd, 0x41, 0xa7, 0x31, 0x3d, 0x9d, 0x8b, 0x8a, 0xac, 0x52, - 0xf3, 0xd9, 0x31, 0xa1, 0x51, 0xa7, 0x67, 0x85, 0x8e, 0x4c, 0xbe, 0x0a, 0xe3, 0xcb, 0x6d, 0xd6, - 0x10, 0xbf, 0xe3, 0x44, 0x14, 0x37, 0xa3, 0xe4, 0xd0, 0x54, 0x29, 0x51, 0xa6, 0x2a, 0xcf, 0xf1, - 0x98, 0x14, 0xa9, 0x9b, 0xb9, 0x42, 0xc1, 0x3a, 0x8f, 0x1f, 0xbf, 0x88, 0x39, 0x1c, 0x8a, 0xad, - 0xe7, 0xc5, 0x8c, 0x83, 0x4b, 0x85, 0x3d, 0xca, 0x72, 0x7e, 0xaa, 0x63, 0x8b, 0x05, 0xa1, 0x75, - 0x9e, 0xce, 0x93, 0xbc, 0x07, 0xe3, 0x22, 0xa2, 0xb1, 0x66, 0xad, 0x86, 0xb3, 0x15, 0x6c, 0x3c, - 0xe6, 0x62, 0x93, 0xc1, 0x8f, 0xb6, 0x13, 0xa4, 0x6e, 0xaf, 0x12, 0x7c, 0xf2, 0x15, 0x38, 0xbb, - 0xed, 0x75, 0x5c, 0xff, 0x71, 0x28, 0x04, 0xb8, 0x10, 0x74, 0xd3, 0x89, 0x8f, 0xce, 0x63, 0x5e, - 0x6e, 0xcb, 0x6d, 0xab, 0x4f, 0xf0, 0x65, 0x72, 0x20, 0xbf, 0xd0, 0xc7, 0x99, 0xcf, 0x20, 0x72, - 0xdc, 0x0c, 0x9a, 0xef, 0x9b, 0x41, 0xfd, 0x9f, 0x4f, 0x4f, 0xa7, 0xcc, 0xcf, 0x10, 0x1f, 0x88, - 0xae, 0x73, 0x7c, 0xe8, 0x7b, 0x9d, 0xd9, 0x19, 0xed, 0x21, 0x8f, 0xd8, 0x65, 0x16, 0xf1, 0xd6, - 0xfd, 0x96, 0xd7, 0x3c, 0xa8, 0x9b, 0x47, 0x87, 0xd5, 0x97, 0xd2, 0xda, 0xcc, 0xc7, 0xbe, 0x76, - 0xb8, 0x90, 0xc1, 0x9a, 0x7c, 0x15, 0xca, 0xec, 0x6f, 0xac, 0xfa, 0x9d, 0xd5, 0xae, 0xba, 0x14, - 0x4c, 0xf1, 0x1d, 0x1c, 0x23, 0x0c, 0xb9, 0xcc, 0xd0, 0x0a, 0x35, 0x56, 0xe6, 0x0f, 0x0d, 0x38, - 0x9b, 0x55, 0xd7, 0x13, 0xf2, 0xdb, 0x98, 0xa9, 0x4b, 0x6f, 0x3c, 0x97, 0xe0, 0x97, 0xde, 0xf1, - 0x55, 0x77, 0x15, 0x46, 0x98, 0xad, 0x2c, 0x9d, 0xb2, 0x70, 0x3b, 0x64, 0xf6, 0x74, 0x68, 0x71, - 0x38, 0x43, 0x40, 0x67, 0x7a, 0xdc, 0x2f, 0x47, 0x38, 0x02, 0x7a, 0xdc, 0x5b, 0x1c, 0xce, 0x10, - 0xd8, 0xb6, 0x2b, 0xb7, 0x09, 0x44, 0x60, 0xbb, 0x71, 0x68, 0x71, 0x38, 0x79, 0x0d, 0xc6, 0xd6, - 0x3a, 0x2b, 0xd4, 0x79, 0x44, 0xc5, 0x8d, 0x13, 0x9e, 0xa3, 0xf8, 0x1d, 0xbb, 0xc5, 0x60, 0x96, - 0x2c, 0x34, 0xbf, 0x6b, 0xc0, 0x74, 0x5f, 0x37, 0x9d, 0x9c, 0xc2, 0xe7, 0xf8, 0xeb, 0xbd, 0x61, - 0xda, 0xc7, 0xab, 0x5f, 0xc8, 0xae, 0xbe, 0xf9, 0x57, 0x79, 0xb8, 0x30, 0x60, 0xd7, 0x4a, 0xae, - 0xe6, 0x8d, 0x13, 0xaf, 0xe6, 0xbf, 0xce, 0x76, 0x09, 0xc7, 0x6b, 0x87, 0x1b, 0x7e, 0x52, 0xe3, - 0xe4, 0x16, 0x03, 0xcb, 0x64, 0x8e, 0x0c, 0x99, 0xcf, 0xe1, 0x62, 0x13, 0x29, 0xec, 0xc8, 0xef, - 0x3b, 0x33, 0xd6, 0x99, 0xf5, 0x5d, 0x8e, 0xe7, 0x7f, 0x4c, 0x2e, 0xc7, 0xf5, 0x2b, 0xa9, 0xc2, - 0x53, 0xbd, 0x92, 0xca, 0x3e, 0x24, 0x1f, 0xf9, 0x34, 0x57, 0x01, 0xff, 0x2e, 0x75, 0x1d, 0xff, - 0xe3, 0x38, 0xd4, 0xd7, 0x60, 0x64, 0x7b, 0x8f, 0x06, 0x52, 0xbf, 0xc5, 0x8a, 0x3c, 0x66, 0x00, - 0xb5, 0x22, 0x88, 0x61, 0xfe, 0x3c, 0x94, 0xd5, 0x8f, 0xe1, 0x5a, 0x66, 0xbf, 0xc5, 0x62, 0xe2, - 0x6b, 0x99, 0x01, 0x2c, 0x0e, 0x3f, 0x31, 0x23, 0x56, 0xd2, 0x0b, 0xf9, 0x93, 0x7a, 0xc1, 0xfc, - 0xb7, 0x06, 0x14, 0x30, 0x21, 0xc0, 0x5b, 0x50, 0x92, 0x47, 0xa5, 0x6a, 0x90, 0xfc, 0x8c, 0x3c, - 0x49, 0x0d, 0x75, 0x7f, 0x06, 0x01, 0x64, 0x9f, 0xda, 0xa2, 0xc1, 0x8e, 0xe6, 0xf6, 0xf2, 0x88, - 0x01, 0xd4, 0x4f, 0x21, 0xc6, 0x29, 0xba, 0x04, 0x5d, 0x7b, 0x84, 0x7d, 0xcf, 0x17, 0x3c, 0x77, - 0xed, 0xe9, 0xb3, 0xeb, 0x25, 0x96, 0xf9, 0xdb, 0x06, 0x9c, 0xcb, 0xd4, 0x03, 0xd8, 0x57, 0xb9, - 0xc2, 0xa1, 0xcc, 0x88, 0xb4, 0xb6, 0xc1, 0x31, 0x4e, 0xe3, 0xc2, 0x73, 0x8a, 0xe1, 0xfd, 0x1c, - 0x94, 0x62, 0xfb, 0x8c, 0x9c, 0x95, 0x43, 0x87, 0xe7, 0x69, 0xd2, 0x98, 0xf9, 0x1b, 0x03, 0x46, - 0x59, 0x15, 0x9e, 0xd9, 0xe8, 0x8a, 0xec, 0xd3, 0x55, 0xd6, 0xa4, 0xa1, 0x62, 0x2a, 0xfe, 0x60, - 0x14, 0x20, 0x41, 0x26, 0x3b, 0x30, 0xb9, 0xb6, 0xbc, 0xb8, 0xb0, 0xec, 0xd2, 0x4e, 0x84, 0xb7, - 0x7c, 0xa9, 0x28, 0x7b, 0x66, 0x58, 0x06, 0x1d, 0xa7, 0x25, 0x10, 0x0e, 0x92, 0xe5, 0xe9, 0x7b, - 0x6e, 0xd3, 0xf6, 0x62, 0x3a, 0x55, 0x21, 0xd3, 0x39, 0xb2, 0x6f, 0x34, 0x6a, 0x0f, 0x56, 0x94, - 0x6f, 0xe4, 0x86, 0xfc, 0x46, 0xe8, 0xb4, 0x5b, 0x03, 0xbe, 0xa1, 0x73, 0x24, 0x7b, 0x50, 0xb9, - 0x8b, 0xb2, 0x5b, 0xf9, 0x4a, 0xfe, 0xf8, 0xaf, 0xbc, 0x2c, 0xbe, 0xf2, 0x02, 0x17, 0xfa, 0xd9, - 0xdf, 0xe9, 0xe3, 0x9a, 0xcc, 0xdc, 0xc2, 0x89, 0x33, 0xf7, 0x6f, 0x1b, 0x30, 0xca, 0x37, 0x87, - 0xf8, 0x2d, 0x8b, 0xcc, 0xed, 0x67, 0xfb, 0xe9, 0x6c, 0x3f, 0x95, 0x08, 0xff, 0x53, 0x0d, 0x70, - 0x5e, 0x46, 0x16, 0x53, 0x0f, 0x63, 0xc8, 0x23, 0x74, 0x54, 0x4c, 0x79, 0x49, 0xe2, 0x08, 0xc5, - 0xdf, 0xc4, 0x50, 0xb9, 0x70, 0x0c, 0xf5, 0x99, 0xbe, 0xb1, 0x4f, 0xf9, 0x4c, 0xdf, 0x0a, 0x94, - 0x84, 0x67, 0x4f, 0xfd, 0x40, 0x98, 0x9f, 0xf2, 0x80, 0x25, 0x86, 0x2b, 0xc9, 0xa7, 0x39, 0xc8, - 0xde, 0xd1, 0x52, 0xc7, 0xc5, 0x88, 0x64, 0x0d, 0x4a, 0x49, 0x68, 0x48, 0x49, 0xbb, 0x07, 0x8d, - 0xe1, 0xc2, 0xf5, 0x95, 0x47, 0x1f, 0x66, 0x46, 0x82, 0x24, 0x3c, 0xcc, 0x6f, 0x1a, 0x50, 0x49, - 0xcf, 0x17, 0xf2, 0x2e, 0x8c, 0xc7, 0xd1, 0x39, 0xb1, 0x7f, 0x01, 0x1e, 0x64, 0x26, 0xe1, 0x3c, - 0x9a, 0xa7, 0x81, 0x8a, 0x4e, 0xe6, 0xa1, 0xc8, 0x96, 0x9d, 0x92, 0x3b, 0x18, 0xe5, 0x49, 0x4f, - 0xc0, 0xd4, 0x7b, 0x3d, 0x89, 0xa7, 0xac, 0xda, 0xff, 0x90, 0x87, 0x71, 0x65, 0xb0, 0xc8, 0x35, - 0x28, 0x2e, 0x87, 0x2b, 0x7e, 0x73, 0x9f, 0xba, 0xe2, 0xba, 0x00, 0x5f, 0x61, 0xf4, 0x42, 0xbb, - 0x85, 0x40, 0x2b, 0x2e, 0x26, 0x75, 0x98, 0xe0, 0xff, 0xc9, 0x28, 0xcc, 0x5c, 0x72, 0xd4, 0xc9, - 0x91, 0x65, 0xfc, 0xa5, 0xba, 0xc3, 0x6a, 0x24, 0xe4, 0x1b, 0x00, 0x1c, 0xc0, 0xc6, 0x77, 0x08, - 0xc7, 0x5e, 0xb9, 0x80, 0xcf, 0x89, 0x0f, 0x44, 0x9e, 0xda, 0x42, 0x9c, 0x0a, 0x0a, 0x43, 0x7c, - 0x01, 0xce, 0x6f, 0xee, 0x0f, 0xff, 0x06, 0x64, 0xf2, 0x02, 0x9c, 0xdf, 0xdc, 0xb7, 0xb3, 0xbd, - 0xbc, 0x54, 0x96, 0xe4, 0x5b, 0x06, 0x5c, 0xb2, 0x68, 0xd3, 0x7f, 0x44, 0x83, 0x83, 0x5a, 0x84, - 0x58, 0xea, 0x17, 0x4f, 0x76, 0x29, 0xbb, 0x25, 0xbe, 0xf8, 0x7a, 0x20, 0xb8, 0x60, 0x38, 0x4a, - 0xbb, 0x1b, 0xd9, 0xc7, 0x54, 0xe1, 0x98, 0x4f, 0x9a, 0x7f, 0x6e, 0x28, 0x4b, 0x80, 0xac, 0x42, - 0x29, 0x9e, 0x2c, 0xe2, 0xc0, 0x31, 0x56, 0x8e, 0x24, 0xdc, 0xa2, 0x0f, 0xeb, 0x2f, 0x88, 0x93, - 0xfd, 0x99, 0x78, 0xca, 0x69, 0x2b, 0x42, 0x02, 0xc9, 0x97, 0xa1, 0x80, 0x43, 0x75, 0x72, 0xb2, - 0x29, 0xb9, 0xd5, 0x14, 0xd8, 0x18, 0x61, 0xad, 0x91, 0x92, 0x7c, 0x41, 0x78, 0x79, 0xe4, 0xb5, - 0x34, 0xae, 0x0c, 0xc4, 0xea, 0x11, 0xef, 0x31, 0x89, 0x63, 0xa1, 0x32, 0x5b, 0xff, 0x4e, 0x0e, - 0x2a, 0xe9, 0x85, 0x47, 0x3e, 0x80, 0xf2, 0xba, 0x13, 0x86, 0x8f, 0xfd, 0xc0, 0xbd, 0xe7, 0x84, - 0x7b, 0x22, 0x35, 0x24, 0xda, 0x7c, 0x5d, 0x01, 0xb7, 0xf7, 0x1c, 0x2d, 0x85, 0x98, 0x46, 0xc0, - 0x36, 0xe4, 0x0d, 0xe1, 0xaf, 0xae, 0x2c, 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0xd4, 0x90, 0x12, 0x8d, - 0xbc, 0x05, 0x79, 0x1e, 0xfb, 0xa6, 0xe6, 0x15, 0x7a, 0x70, 0xa7, 0xc6, 0xc3, 0x85, 0xf8, 0x65, - 0xb2, 0x7e, 0x2a, 0xcf, 0xf0, 0xc9, 0x8a, 0x12, 0x39, 0x35, 0xaa, 0xe5, 0x57, 0x91, 0xe0, 0xb8, - 0x71, 0x27, 0x87, 0x50, 0x7d, 0x58, 0x28, 0xe6, 0x2b, 0x05, 0x11, 0x9f, 0xf3, 0x47, 0x79, 0x28, - 0xc5, 0xdf, 0x27, 0x04, 0x50, 0xdf, 0x10, 0xb7, 0xc2, 0xf8, 0x3f, 0xb9, 0x08, 0x45, 0xa9, 0x62, - 0x88, 0x9b, 0xe1, 0xb1, 0x50, 0xa8, 0x17, 0xb3, 0x20, 0x75, 0x09, 0xae, 0x5e, 0x58, 0xf2, 0x27, - 0xb9, 0x09, 0xb1, 0xa2, 0x30, 0x48, 0xa3, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, - 0x8f, 0xfb, 0x22, 0x97, 0xac, 0x9c, 0xe7, 0x92, 0x0f, 0xa0, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, - 0x1a, 0xe2, 0x3d, 0xce, 0x22, 0xe3, 0xc6, 0x25, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0x3e, - 0xc7, 0xd8, 0x0b, 0x87, 0x7a, 0xc3, 0x31, 0xe1, 0x50, 0x64, 0x64, 0x9b, 0x21, 0x75, 0xc9, 0xeb, - 0x50, 0x60, 0xa3, 0x29, 0xf6, 0x83, 0x38, 0x5b, 0xdc, 0xda, 0xc6, 0x3a, 0xef, 0xb0, 0x7b, 0x67, - 0x2c, 0x44, 0x20, 0xaf, 0x40, 0xbe, 0x37, 0xff, 0x50, 0x48, 0xfa, 0x4a, 0x12, 0x16, 0x19, 0xa3, - 0xb1, 0x62, 0x72, 0x0b, 0x8a, 0x8f, 0xf5, 0x00, 0xb8, 0x73, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0xc4, - 0x7a, 0x11, 0x46, 0x79, 0xb8, 0x99, 0xf9, 0x12, 0x40, 0xf2, 0xe9, 0xfe, 0x0b, 0x7c, 0xf3, 0x1b, - 0x50, 0x8a, 0x3f, 0x49, 0x5e, 0x04, 0xd8, 0xa7, 0x07, 0xf6, 0x9e, 0xd3, 0x71, 0xc5, 0x33, 0x24, - 0x65, 0xab, 0xb4, 0x4f, 0x0f, 0xee, 0x21, 0x80, 0x5c, 0x80, 0xb1, 0x2e, 0x1b, 0x55, 0x99, 0xd8, - 0xd4, 0x1a, 0xed, 0xf6, 0x76, 0xd8, 0x0c, 0x9d, 0x85, 0x31, 0x3c, 0x3a, 0x10, 0x0b, 0x6d, 0xc2, - 0x92, 0x3f, 0xcd, 0xdf, 0xcb, 0x61, 0xc8, 0xbb, 0x52, 0x4f, 0xf2, 0x32, 0x4c, 0x34, 0x03, 0x8a, - 0xdb, 0x91, 0xc3, 0xd4, 0x22, 0xf1, 0x9d, 0x72, 0x02, 0x5c, 0x76, 0xc9, 0x6b, 0x30, 0x95, 0x64, - 0x5a, 0xb5, 0x9b, 0x3b, 0x22, 0xfc, 0xb5, 0x6c, 0x4d, 0x74, 0x65, 0xaa, 0xd5, 0x85, 0x1d, 0xf4, - 0xa1, 0xaf, 0xa8, 0xa1, 0x66, 0x91, 0xcc, 0x9a, 0x5a, 0xb2, 0xa6, 0x14, 0x38, 0x5e, 0x3b, 0x9c, - 0x87, 0x51, 0xc7, 0xd9, 0xed, 0x79, 0xdc, 0x9f, 0xb7, 0x6c, 0x89, 0x5f, 0xe4, 0xf3, 0x30, 0x1d, - 0x7a, 0xbb, 0x1d, 0x27, 0xea, 0x05, 0x22, 0xe7, 0x00, 0x0d, 0x70, 0x4a, 0x4d, 0x58, 0x95, 0xb8, - 0x60, 0x81, 0xc3, 0xc9, 0x9b, 0x40, 0xd4, 0xef, 0xf9, 0x3b, 0x1f, 0xd3, 0x26, 0x9f, 0x6a, 0x65, - 0x6b, 0x5a, 0x29, 0x59, 0xc3, 0x02, 0xf2, 0x39, 0x28, 0x07, 0x34, 0x44, 0x95, 0x0c, 0xbb, 0x0d, - 0x33, 0xa9, 0x58, 0xe3, 0x12, 0x76, 0x9f, 0x1e, 0x98, 0x75, 0x98, 0xee, 0x5b, 0x8f, 0xe4, 0x4d, - 0xae, 0xdd, 0x8b, 0xfd, 0xb9, 0xcc, 0x8d, 0x19, 0x26, 0xa4, 0x52, 0x2f, 0xf8, 0x72, 0x24, 0xb3, - 0x03, 0x65, 0x55, 0xbe, 0x9e, 0x10, 0x58, 0x7c, 0x1e, 0x1d, 0x0b, 0xb9, 0xf0, 0x19, 0x3d, 0x3a, - 0xac, 0xe6, 0x3c, 0x17, 0xdd, 0x09, 0xaf, 0x42, 0x51, 0x6a, 0x09, 0xea, 0x33, 0x1c, 0x42, 0xa1, - 0x3c, 0xb0, 0xe2, 0x52, 0xf3, 0x75, 0x18, 0x13, 0x22, 0xf4, 0xf8, 0x63, 0x1c, 0xf3, 0x97, 0x73, - 0x30, 0x65, 0x51, 0xb6, 0xc0, 0xc5, 0x03, 0x17, 0xcf, 0x59, 0xce, 0x59, 0xad, 0x6d, 0xc7, 0xc4, - 0xf1, 0x7f, 0xcf, 0x80, 0x99, 0x0c, 0xdc, 0x4f, 0x94, 0xa4, 0xea, 0x36, 0x94, 0x16, 0x3d, 0xa7, - 0x55, 0x73, 0xdd, 0xd8, 0x41, 0x12, 0xb5, 0x41, 0x97, 0x2d, 0x27, 0x87, 0x41, 0xd5, 0xcd, 0x34, - 0x46, 0x25, 0xd7, 0xc5, 0xa4, 0x48, 0xd2, 0xe8, 0xc9, 0xac, 0xb6, 0xc0, 0xeb, 0x94, 0xe4, 0xb4, - 0xc5, 0x30, 0x34, 0x0e, 0x4c, 0xee, 0xc0, 0x9f, 0xd9, 0xa1, 0xcb, 0x0e, 0x43, 0x4b, 0x37, 0x6f, - 0x28, 0xb3, 0xf3, 0x9b, 0x39, 0x38, 0x9f, 0x4d, 0xf8, 0x49, 0xf3, 0x8d, 0x61, 0x12, 0x05, 0x25, - 0x71, 0x30, 0xe6, 0x1b, 0xe3, 0x19, 0x17, 0x10, 0x3f, 0x41, 0x20, 0x0f, 0x61, 0x62, 0xc5, 0x09, - 0xa3, 0x7b, 0xd4, 0x09, 0xa2, 0x1d, 0xea, 0x44, 0x43, 0x68, 0xb0, 0xf1, 0x3b, 0xb9, 0xb8, 0xa9, - 0xed, 0x49, 0xca, 0xf4, 0x3b, 0xb9, 0x1a, 0xdb, 0x78, 0xa2, 0x14, 0x86, 0x98, 0x28, 0x3f, 0x0b, - 0x53, 0x0d, 0xda, 0x76, 0xba, 0x7b, 0x7e, 0x40, 0xc5, 0xc9, 0xf3, 0x0d, 0x98, 0x88, 0x41, 0x99, - 0xb3, 0x45, 0x2f, 0xd6, 0xf0, 0x95, 0x8e, 0x48, 0x44, 0x89, 0x5e, 0x6c, 0xfe, 0x4e, 0x0e, 0x2e, - 0xd4, 0x9a, 0xe2, 0x98, 0x5e, 0x14, 0xc8, 0xdb, 0xc4, 0xcf, 0xf8, 0xdb, 0x64, 0x0e, 0x4a, 0x0f, - 0x9c, 0x27, 0xf8, 0xe0, 0x7b, 0x28, 0xb2, 0xd6, 0x70, 0xf5, 0xcb, 0x79, 0x62, 0xc7, 0xc7, 0x5e, - 0x56, 0x82, 0xf3, 0x34, 0xdf, 0x84, 0x37, 0x61, 0xf4, 0x9e, 0xdf, 0x72, 0xc5, 0xe6, 0x24, 0x4e, - 0xfd, 0xf7, 0x10, 0x62, 0x89, 0x12, 0xf3, 0x87, 0x06, 0x4c, 0xc6, 0x35, 0xc6, 0x2a, 0x7c, 0xe6, - 0x5d, 0x92, 0x7a, 0x1d, 0xbf, 0x34, 0xc4, 0xeb, 0xf8, 0x23, 0x9f, 0xae, 0x27, 0xcc, 0x7f, 0x8c, - 0x17, 0x0a, 0x6a, 0x2b, 0xd9, 0x4e, 0xa4, 0x54, 0xc4, 0x18, 0xb2, 0x22, 0xb9, 0xa7, 0x36, 0x24, - 0xf9, 0x81, 0x43, 0xf2, 0x2b, 0x39, 0x18, 0x8f, 0x2b, 0xfb, 0x9c, 0xc5, 0x6f, 0xc7, 0xed, 0x1a, - 0xca, 0x3b, 0xbb, 0xa1, 0xc8, 0x0a, 0xe1, 0x04, 0xfd, 0x65, 0x18, 0x15, 0x8b, 0xc9, 0x48, 0xdd, - 0xaa, 0xa5, 0x46, 0x37, 0x79, 0xeb, 0x14, 0x07, 0x34, 0xb4, 0x04, 0x1d, 0xba, 0xbf, 0x6f, 0xd3, - 0x1d, 0x71, 0xbf, 0xf4, 0xcc, 0xee, 0x51, 0xd9, 0xee, 0xef, 0x49, 0xc3, 0x86, 0xda, 0x9d, 0xfe, - 0x41, 0x01, 0x2a, 0x69, 0x92, 0x93, 0x23, 0xe4, 0xd7, 0x7b, 0x3b, 0xe2, 0x9d, 0x02, 0x8c, 0x90, - 0xef, 0xf6, 0x76, 0x2c, 0x06, 0x23, 0xaf, 0x41, 0x61, 0x3d, 0xf0, 0x1e, 0x61, 0xab, 0xc5, 0x33, - 0x0d, 0xdd, 0xc0, 0x7b, 0xa4, 0xfa, 0x81, 0xb2, 0x72, 0x34, 0x68, 0x57, 0x1a, 0xca, 0x33, 0xd3, - 0xdc, 0xa0, 0x6d, 0x85, 0xe9, 0xb4, 0x28, 0x12, 0x8d, 0x6d, 0x95, 0x75, 0xea, 0x04, 0x22, 0x9a, - 0x5b, 0x88, 0x33, 0xdc, 0x2a, 0x77, 0x10, 0xcc, 0x73, 0x9e, 0x5a, 0x2a, 0x12, 0x69, 0x01, 0x51, - 0x7e, 0xca, 0x05, 0x7c, 0xb2, 0x8d, 0x27, 0x9f, 0x17, 0x3a, 0xab, 0xb2, 0xb6, 0xd5, 0xd5, 0x9c, - 0xc1, 0xf7, 0x69, 0x9e, 0x11, 0xae, 0x43, 0x09, 0x8f, 0xbc, 0xf0, 0x20, 0xa3, 0x78, 0x22, 0x33, - 0xe9, 0x73, 0x0b, 0x78, 0x1b, 0x6f, 0xc7, 0xc7, 0x19, 0x09, 0x13, 0xf2, 0x3e, 0x8c, 0xab, 0x8e, - 0xa2, 0xdc, 0x9d, 0xf1, 0x32, 0x8f, 0x10, 0x1a, 0x90, 0x3e, 0x4c, 0x25, 0x30, 0xbf, 0xa0, 0xce, - 0x12, 0xb1, 0x69, 0x1f, 0x3b, 0x4b, 0xcc, 0xdf, 0x42, 0x35, 0xbe, 0xed, 0x47, 0x54, 0x68, 0x2f, - 0xcf, 0xac, 0x1c, 0x4b, 0x8e, 0x90, 0x47, 0x34, 0x8f, 0x10, 0xad, 0x75, 0xa7, 0x78, 0x60, 0xf9, - 0x0f, 0x0d, 0x38, 0x97, 0x49, 0x4b, 0x6e, 0x00, 0x24, 0x3a, 0xa2, 0xe8, 0x25, 0x9e, 0x4c, 0x36, - 0x86, 0x5a, 0x0a, 0x06, 0xf9, 0x7a, 0x5a, 0xbb, 0x3b, 0x79, 0x73, 0x92, 0x4f, 0x2e, 0x4c, 0xea, - 0xda, 0x5d, 0x86, 0x4e, 0x67, 0x7e, 0x2f, 0x0f, 0xd3, 0x7d, 0x4f, 0xf5, 0x9d, 0x70, 0x07, 0xbf, - 0x9f, 0x7a, 0x08, 0x8a, 0x5f, 0x77, 0x5c, 0x1f, 0xf4, 0x50, 0x60, 0xc6, 0xb3, 0x50, 0x78, 0x2c, - 0x26, 0xf2, 0x18, 0x9f, 0xf0, 0x3a, 0x54, 0x98, 0xfd, 0x84, 0xd8, 0xe7, 0x07, 0x7e, 0xed, 0x29, - 0x3c, 0x25, 0xf6, 0x63, 0xfc, 0xd2, 0xd2, 0x6f, 0xe5, 0x60, 0xa6, 0xaf, 0xcd, 0xcf, 0xec, 0xaa, - 0xfb, 0xb2, 0xb6, 0xbb, 0xbd, 0x34, 0x68, 0x4c, 0x87, 0xd2, 0x22, 0xfe, 0xbb, 0x01, 0x17, 0x06, - 0x50, 0x92, 0x83, 0xf4, 0x24, 0xe2, 0x5a, 0xc5, 0xcd, 0xe3, 0x3f, 0xf8, 0x54, 0xa6, 0xd2, 0x67, - 0x36, 0x13, 0x7e, 0x39, 0x07, 0xb0, 0x4d, 0x77, 0x9e, 0xed, 0xf4, 0x3f, 0xd9, 0x6f, 0xe1, 0xcb, - 0x66, 0x0d, 0x35, 0xee, 0x6b, 0x78, 0x90, 0x38, 0x7c, 0xee, 0x9f, 0xf8, 0x59, 0x89, 0x5c, 0xf6, - 0xb3, 0x12, 0xe6, 0x0e, 0x9c, 0xbd, 0x4b, 0xa3, 0x64, 0x27, 0x94, 0x36, 0xe4, 0xf1, 0x6c, 0xdf, - 0x80, 0x92, 0xc0, 0xd7, 0x53, 0x84, 0x4b, 0x87, 0x32, 0xcf, 0xb5, 0x12, 0x04, 0x93, 0xc2, 0x85, - 0x45, 0xda, 0xa2, 0x11, 0xfd, 0x6c, 0x3f, 0xd3, 0x00, 0xc2, 0x9b, 0xc2, 0x5f, 0x1b, 0x18, 0xea, - 0x0b, 0x27, 0xf6, 0xcf, 0x16, 0x9c, 0x8b, 0xeb, 0xfe, 0x34, 0xf9, 0xce, 0x31, 0x5d, 0x42, 0xc4, - 0xda, 0x25, 0x1c, 0x8f, 0x39, 0x44, 0x7c, 0x02, 0x97, 0x24, 0xc1, 0xb6, 0x17, 0xdf, 0xc4, 0x0c, - 0x45, 0x4b, 0xde, 0x85, 0x71, 0x85, 0x46, 0x04, 0xee, 0xe2, 0x6d, 0xe7, 0x63, 0x2f, 0xda, 0xb3, - 0x43, 0x0e, 0x57, 0x6f, 0x3b, 0x15, 0x74, 0xf3, 0x6b, 0xf0, 0x42, 0xec, 0xb7, 0x92, 0xf1, 0xe9, - 0x14, 0x73, 0xe3, 0x74, 0xcc, 0x57, 0x93, 0x66, 0x2d, 0x77, 0x62, 0xff, 0x71, 0xc9, 0x9b, 0xa8, - 0xcd, 0x12, 0x8d, 0xb9, 0xac, 0xa4, 0x45, 0x13, 0x7b, 0x51, 0x02, 0x30, 0xdf, 0x51, 0x2a, 0x9b, - 0xc1, 0x50, 0x23, 0x36, 0xd2, 0xc4, 0xbf, 0x9c, 0x83, 0xa9, 0xb5, 0xe5, 0xc5, 0x85, 0xf8, 0x18, - 0xf9, 0x39, 0xcb, 0x4d, 0xa4, 0xb5, 0x6d, 0xb0, 0xbc, 0x31, 0x37, 0x61, 0x26, 0xd5, 0x0d, 0xf8, - 0x98, 0xca, 0xfb, 0xdc, 0xbf, 0x24, 0x06, 0xcb, 0x9d, 0xe5, 0x7c, 0x16, 0xfb, 0xad, 0x5b, 0x56, - 0x0a, 0xdb, 0xfc, 0xde, 0x68, 0x8a, 0xaf, 0x10, 0x61, 0x6f, 0x40, 0x69, 0x39, 0x0c, 0x7b, 0x34, - 0xd8, 0xb4, 0x56, 0x54, 0x1d, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0xae, 0x41, - 0x51, 0xc4, 0x77, 0x49, 0x99, 0x80, 0xd7, 0xe5, 0x71, 0x78, 0x98, 0x15, 0x17, 0x93, 0xb7, 0xa0, - 0xcc, 0xff, 0xe7, 0xb3, 0x4d, 0x74, 0x38, 0x9e, 0x55, 0x09, 0x74, 0x3e, 0x3b, 0x2d, 0x0d, 0x8d, - 0x59, 0x66, 0xf2, 0xb5, 0x46, 0x56, 0xa3, 0x42, 0x62, 0x99, 0xc9, 0x87, 0x1d, 0xb1, 0x4e, 0x2a, - 0x12, 0xb9, 0x0e, 0xf9, 0xda, 0x82, 0xa5, 0x66, 0x45, 0x76, 0x9a, 0x01, 0xcf, 0x2a, 0xae, 0x3d, - 0x88, 0x54, 0x5b, 0xb0, 0xc8, 0x3c, 0x14, 0xf1, 0xc1, 0x0b, 0x97, 0x06, 0xc2, 0x67, 0x14, 0x67, - 0x4d, 0x57, 0xc0, 0xd4, 0x9b, 0x47, 0x89, 0x47, 0xe6, 0x60, 0x6c, 0xd1, 0x0b, 0xbb, 0x2d, 0xe7, - 0x40, 0x24, 0x25, 0xc1, 0xcb, 0x10, 0x97, 0x83, 0xd4, 0x79, 0x26, 0xb0, 0xc8, 0x35, 0x18, 0x69, - 0x34, 0xfd, 0x2e, 0xb3, 0xb6, 0x62, 0xd7, 0x96, 0x90, 0x01, 0xb4, 0xcc, 0x06, 0x0c, 0x80, 0x21, - 0xc7, 0x3c, 0x72, 0xaa, 0xa4, 0x84, 0x1c, 0xa7, 0x23, 0xa6, 0x04, 0x4e, 0xbf, 0xff, 0x1f, 0x3c, - 0x4d, 0xff, 0xbf, 0x1d, 0xb8, 0x70, 0x17, 0x55, 0xfd, 0x06, 0x0d, 0x30, 0x0f, 0x24, 0x7f, 0x3c, - 0x67, 0xd3, 0x5a, 0x16, 0xd1, 0x62, 0x57, 0x8f, 0x0e, 0xab, 0xaf, 0x70, 0x6b, 0xc0, 0x0e, 0x39, - 0x8e, 0x7c, 0x77, 0x27, 0xf5, 0x62, 0xc0, 0x20, 0x46, 0xe4, 0x2b, 0x70, 0x36, 0xab, 0x48, 0xc4, - 0x8d, 0xa1, 0x57, 0x78, 0xf6, 0x07, 0x54, 0xb7, 0xec, 0x2c, 0x0e, 0x64, 0x05, 0x2a, 0x1c, 0x5e, - 0x73, 0xdb, 0x5e, 0x67, 0xa9, 0xed, 0x78, 0x2d, 0x8c, 0x22, 0x13, 0xa1, 0x80, 0x82, 0xab, 0xc3, - 0x0a, 0x6d, 0xca, 0x4a, 0x35, 0xef, 0xa4, 0x14, 0x25, 0x8a, 0xa3, 0x46, 0xed, 0xc1, 0x4a, 0xb2, - 0xa6, 0x9e, 0xaf, 0x7b, 0x23, 0xad, 0x6d, 0xc7, 0xdc, 0x1b, 0x6d, 0xc2, 0x4c, 0xaa, 0x1b, 0xa4, - 0x38, 0xd2, 0xc0, 0x69, 0x71, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x1c, 0x4d, 0xf1, 0x15, - 0x67, 0x45, 0x26, 0x8c, 0x72, 0x69, 0xa3, 0x66, 0x2d, 0xe3, 0xb2, 0xc8, 0x12, 0x25, 0xe4, 0x22, - 0xe4, 0x1b, 0x8d, 0x35, 0x35, 0xa7, 0x62, 0x18, 0xfa, 0x16, 0x83, 0xb1, 0x11, 0xc2, 0x63, 0x20, - 0x25, 0x40, 0xab, 0x49, 0x83, 0x48, 0x3c, 0xe7, 0xf9, 0x6a, 0xb2, 0x8e, 0x0b, 0x49, 0x7f, 0x8b, - 0x75, 0x9c, 0xac, 0xde, 0x05, 0x98, 0xad, 0x85, 0x21, 0x0d, 0x22, 0x9e, 0x94, 0x3d, 0xec, 0xb5, - 0x69, 0x20, 0xe6, 0x9a, 0x90, 0x31, 0xfc, 0x31, 0xf0, 0x66, 0x68, 0x0d, 0x44, 0x24, 0x57, 0xa1, - 0x58, 0xeb, 0xb9, 0x1e, 0xed, 0x34, 0x35, 0xdf, 0x74, 0x47, 0xc0, 0xac, 0xb8, 0x94, 0x7c, 0x04, - 0xe7, 0x04, 0x91, 0x14, 0x38, 0xa2, 0x07, 0xb8, 0xac, 0xe1, 0x16, 0xac, 0x58, 0x0b, 0x52, 0x4c, - 0xd9, 0xa2, 0x4b, 0xb2, 0x29, 0x49, 0x0d, 0x2a, 0x4b, 0x78, 0x4f, 0x2a, 0x1f, 0xf5, 0xf5, 0x03, - 0x91, 0x7c, 0x17, 0x25, 0x17, 0xbf, 0x43, 0xb5, 0xdd, 0xb8, 0xd0, 0xea, 0x43, 0x27, 0xf7, 0x61, - 0x26, 0x0d, 0x63, 0xf2, 0xb8, 0x94, 0x3c, 0xba, 0xd5, 0xc7, 0x05, 0x05, 0x73, 0x16, 0x15, 0xd9, - 0x81, 0xe9, 0x5a, 0x14, 0x05, 0xde, 0x4e, 0x2f, 0xa2, 0x29, 0xd1, 0x25, 0x0f, 0x1a, 0xe3, 0x72, - 0x29, 0xbe, 0x5e, 0x10, 0x93, 0x71, 0xc6, 0x89, 0x29, 0x63, 0x11, 0x66, 0xf5, 0xb3, 0x23, 0x6e, - 0xfc, 0x6e, 0x9f, 0x78, 0xdb, 0x4e, 0x04, 0x14, 0xc9, 0x03, 0xdd, 0x5a, 0x78, 0xd0, 0x6e, 0xd3, - 0x28, 0xc0, 0x9b, 0x7b, 0x7c, 0xfb, 0xce, 0x14, 0x3e, 0x40, 0x97, 0x94, 0xe7, 0x2a, 0xf1, 0x7d, - 0x43, 0xcd, 0x3d, 0x52, 0xe3, 0xa9, 0x6d, 0x1f, 0xe5, 0x21, 0xb7, 0x8f, 0x16, 0x4c, 0x2f, 0x75, - 0x9a, 0xc1, 0x01, 0x46, 0x36, 0xca, 0xca, 0x4d, 0x9c, 0x50, 0x39, 0xf9, 0xb0, 0xc5, 0x65, 0x47, - 0xce, 0xb0, 0xac, 0xea, 0xf5, 0x33, 0x36, 0xff, 0x3f, 0xa8, 0xa4, 0xfb, 0xf2, 0x53, 0x3e, 0x56, - 0x7c, 0x1a, 0xd7, 0x6c, 0x36, 0xd2, 0xe9, 0xb6, 0x90, 0x39, 0xed, 0x45, 0x5a, 0x23, 0x89, 0x4a, - 0x57, 0xde, 0x8e, 0xd5, 0xde, 0xa1, 0x95, 0xcb, 0x38, 0x97, 0xb5, 0x8c, 0xcd, 0x5f, 0xcd, 0xc1, - 0x34, 0xf7, 0x26, 0x7d, 0xf6, 0x75, 0xc5, 0xf7, 0x35, 0xe1, 0x2c, 0xcf, 0x02, 0x53, 0xad, 0x3b, - 0x46, 0x5b, 0xfc, 0x06, 0x9c, 0xeb, 0xeb, 0x0a, 0x14, 0xd0, 0x8b, 0xd2, 0x8f, 0xb7, 0x4f, 0x44, - 0xcf, 0x66, 0x7f, 0x64, 0xeb, 0x96, 0xd5, 0x47, 0x61, 0xfe, 0xc3, 0x5c, 0x1f, 0x7f, 0xa1, 0x37, - 0xaa, 0x9a, 0xa0, 0x71, 0x3a, 0x4d, 0x30, 0xf7, 0x89, 0x34, 0xc1, 0xfc, 0x30, 0x9a, 0xe0, 0x47, - 0x30, 0xb1, 0x41, 0x1d, 0xa6, 0xd1, 0x88, 0x60, 0xb3, 0x82, 0xf6, 0x5a, 0x2c, 0x2b, 0x93, 0xf2, - 0x25, 0x0e, 0x54, 0x8d, 0x18, 0x01, 0x13, 0x2d, 0x3c, 0xfa, 0xcc, 0xd2, 0x39, 0xa8, 0x9b, 0xc6, - 0xc8, 0xe0, 0x4d, 0xc3, 0xfc, 0x66, 0x0e, 0xc6, 0x15, 0xf6, 0xe4, 0x8b, 0x50, 0x5e, 0x0b, 0x76, - 0x9d, 0x8e, 0xf7, 0x73, 0x8e, 0x72, 0xfc, 0x8a, 0xd5, 0xf7, 0x15, 0xb8, 0xa5, 0x61, 0xa1, 0xdb, - 0x0c, 0x75, 0xda, 0xea, 0xc4, 0x67, 0xd5, 0xb3, 0x10, 0xaa, 0x04, 0x0b, 0xe7, 0x87, 0x08, 0x16, - 0xd6, 0x23, 0x6d, 0x0b, 0xa7, 0x8f, 0xb4, 0xd5, 0x02, 0x63, 0x47, 0x4e, 0x19, 0x18, 0x6b, 0xfe, - 0x7a, 0x0e, 0x2a, 0xe2, 0x5d, 0x55, 0x79, 0x78, 0xf8, 0x7c, 0xbd, 0xc3, 0xa0, 0x37, 0xee, 0x98, - 0xeb, 0xb1, 0xc2, 0x6f, 0xff, 0x7e, 0x15, 0x5f, 0xc9, 0x4c, 0x77, 0x87, 0x7c, 0x25, 0x53, 0x87, - 0xa7, 0x23, 0x07, 0xd2, 0x54, 0x56, 0x1a, 0xdf, 0xfc, 0xb3, 0x5c, 0x9a, 0xb7, 0xd0, 0xa6, 0x5e, - 0x85, 0x31, 0xfe, 0x2c, 0x96, 0x74, 0x6e, 0x16, 0xb9, 0x9b, 0x10, 0x64, 0xc9, 0xb2, 0xd3, 0xc4, - 0x90, 0x9c, 0xf4, 0x54, 0x2a, 0xb9, 0x0d, 0x65, 0xf4, 0x17, 0xa9, 0xb9, 0x6e, 0x40, 0xc3, 0x50, - 0x28, 0x5a, 0x78, 0x77, 0xf7, 0x98, 0xee, 0xd8, 0xdc, 0xaf, 0xc4, 0x71, 0xdd, 0xc0, 0xd2, 0xf0, - 0xc8, 0x02, 0x9c, 0xd5, 0xdc, 0x93, 0x24, 0xfd, 0x48, 0xb2, 0x5b, 0x44, 0x58, 0xc0, 0x89, 0x33, - 0x91, 0x9f, 0xde, 0x33, 0xd1, 0xe6, 0xff, 0x32, 0xd8, 0x5a, 0x6b, 0xee, 0x3f, 0x67, 0xd1, 0x2d, - 0xac, 0x49, 0xc7, 0x28, 0xfb, 0xff, 0xde, 0xe0, 0xfe, 0xe9, 0x62, 0xfa, 0xbc, 0x0d, 0xa3, 0xfc, - 0x11, 0x2e, 0xe1, 0x49, 0xad, 0x72, 0xe1, 0x05, 0xc9, 0xfd, 0x14, 0x7f, 0xca, 0xcb, 0x12, 0x04, - 0xcc, 0x64, 0xd6, 0xdd, 0xe4, 0x51, 0xf1, 0xec, 0xf7, 0x8f, 0x97, 0x58, 0x6a, 0x5e, 0xd2, 0xe1, - 0xf2, 0x5d, 0x1b, 0x27, 0xe7, 0x25, 0x35, 0xff, 0x4f, 0x8e, 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0x84, - 0x7b, 0xaf, 0x41, 0x01, 0x9f, 0x7b, 0x55, 0xb2, 0x1a, 0xa6, 0x9e, 0x7a, 0xc5, 0x72, 0xb6, 0x6e, - 0x50, 0xd6, 0xaa, 0x01, 0x55, 0x28, 0x8e, 0xd5, 0x75, 0x83, 0x18, 0x98, 0x4d, 0xda, 0x77, 0xa9, - 0xba, 0x1c, 0x3a, 0x7a, 0xe2, 0x6f, 0x2c, 0x27, 0xb7, 0x15, 0xbf, 0x66, 0xf5, 0x40, 0xa3, 0xfd, - 0xd0, 0xb1, 0xb9, 0x3f, 0xad, 0x2a, 0x6d, 0x13, 0x17, 0xe8, 0x25, 0x98, 0xd4, 0x63, 0x95, 0x85, - 0xd1, 0x81, 0x21, 0xdf, 0xa9, 0x38, 0x67, 0x55, 0xbd, 0xd5, 0x89, 0x48, 0x1d, 0x26, 0xb4, 0x80, - 0x54, 0x35, 0x09, 0x2b, 0xcf, 0x0e, 0x63, 0xf7, 0x67, 0x52, 0xd0, 0x49, 0x94, 0x03, 0xf3, 0x2f, - 0x40, 0x45, 0xac, 0xcc, 0x38, 0xb6, 0x0d, 0x55, 0xbb, 0xe5, 0x45, 0x4b, 0x5d, 0x4d, 0x4d, 0xcf, - 0x0d, 0x2c, 0x84, 0x9a, 0xdf, 0x35, 0xe0, 0xa2, 0x78, 0x5c, 0xcc, 0xa2, 0x21, 0xd3, 0x21, 0x31, - 0x20, 0x0e, 0xe7, 0xe3, 0x17, 0xc9, 0xbb, 0x32, 0xf1, 0x94, 0x2e, 0x20, 0xd3, 0xdf, 0xa8, 0x4f, - 0x88, 0x49, 0x39, 0x82, 0xa9, 0xa7, 0x64, 0xc2, 0xa9, 0xb7, 0x45, 0xc2, 0xa9, 0xdc, 0xf1, 0xc4, - 0xf1, 0xba, 0x70, 0x69, 0x47, 0x26, 0x9a, 0xfa, 0x4e, 0x0e, 0xce, 0x65, 0x54, 0x6b, 0xeb, 0x8b, - 0xcf, 0xa8, 0x70, 0xa8, 0x6b, 0xc2, 0x41, 0x66, 0x24, 0x1c, 0xd8, 0xf1, 0x99, 0xb2, 0xe2, 0x77, - 0x0d, 0xb8, 0xa0, 0xcf, 0x1e, 0x61, 0x8b, 0x6e, 0xdd, 0x22, 0xef, 0xc0, 0xe8, 0x3d, 0xea, 0xb8, - 0x54, 0x86, 0x60, 0xc4, 0xd9, 0xbd, 0xc4, 0xe9, 0x30, 0x2f, 0xe4, 0x6c, 0xff, 0x8c, 0x2f, 0xe5, - 0x33, 0x96, 0x20, 0x21, 0x8b, 0xa2, 0x72, 0xfc, 0x7a, 0xca, 0x94, 0x37, 0x35, 0x59, 0x9f, 0x3a, - 0x46, 0x31, 0xfe, 0x43, 0x03, 0x5e, 0x38, 0x86, 0x86, 0x0d, 0x1c, 0x1b, 0x7a, 0x75, 0xe0, 0x70, - 0x63, 0x41, 0x28, 0x79, 0x1f, 0xa6, 0x36, 0x44, 0xa4, 0x98, 0x1c, 0x0e, 0x25, 0xbb, 0xbb, 0x0c, - 0x22, 0xb3, 0xe5, 0xb8, 0xa4, 0x91, 0x99, 0xf5, 0x7f, 0xcf, 0x0f, 0xa3, 0x4e, 0x92, 0x2c, 0x06, - 0xad, 0xff, 0x3d, 0x01, 0xb3, 0xe2, 0x52, 0xa6, 0x16, 0xe8, 0xd5, 0x14, 0xee, 0x10, 0x2f, 0xc3, - 0x28, 0xc3, 0x89, 0xb5, 0x6b, 0x9c, 0x07, 0xf8, 0xf4, 0x95, 0xe7, 0x5a, 0xa2, 0x28, 0xb6, 0xeb, - 0x72, 0x99, 0xb7, 0x16, 0xdf, 0x34, 0xa0, 0xa2, 0xf3, 0xfe, 0xb4, 0x43, 0xf3, 0x9e, 0x36, 0x34, - 0x2f, 0x64, 0x0f, 0xcd, 0xe0, 0x31, 0xe9, 0xcb, 0xdb, 0x30, 0xd4, 0x58, 0x98, 0x30, 0xba, 0xe8, - 0xb7, 0x1d, 0xaf, 0xa3, 0xe6, 0x1a, 0x70, 0x11, 0x62, 0x89, 0x12, 0xa5, 0xb7, 0xf2, 0x03, 0x7b, - 0xcb, 0xfc, 0x76, 0x01, 0x2e, 0x5a, 0x74, 0xd7, 0x63, 0x0a, 0xd2, 0x66, 0xe8, 0x75, 0x76, 0xb5, - 0x3b, 0x25, 0x33, 0xd5, 0xe1, 0xc2, 0x93, 0x8e, 0x41, 0xe2, 0xfe, 0xbe, 0x06, 0x45, 0x26, 0xa5, - 0x95, 0x3e, 0x47, 0xa3, 0x07, 0x33, 0xe6, 0xf0, 0x71, 0x95, 0xc5, 0xe4, 0xba, 0xd8, 0x43, 0x14, - 0x5f, 0x67, 0xb6, 0x87, 0xa4, 0x5e, 0xee, 0xe6, 0xfb, 0x48, 0xac, 0x54, 0x15, 0x06, 0x28, 0x55, - 0x0f, 0xe0, 0x6c, 0xcd, 0xe5, 0xf2, 0xc9, 0x69, 0xad, 0x07, 0x5e, 0xa7, 0xe9, 0x75, 0x9d, 0x96, - 0x54, 0xca, 0xf9, 0x3b, 0xe6, 0x71, 0xb9, 0xdd, 0x8d, 0x11, 0xac, 0x4c, 0x32, 0xd6, 0x8c, 0xc5, - 0xd5, 0x06, 0x4f, 0x88, 0x32, 0x8a, 0x2c, 0xb0, 0x19, 0x6e, 0x27, 0xe4, 0x19, 0x51, 0xac, 0xb8, - 0x18, 0xd5, 0x39, 0x0c, 0x77, 0xd8, 0x58, 0x69, 0xdc, 0x17, 0xe1, 0x03, 0xd2, 0x15, 0x8b, 0x47, - 0x47, 0x44, 0xad, 0x10, 0xed, 0x77, 0x0d, 0x2f, 0xa1, 0x6b, 0x34, 0xee, 0x31, 0xba, 0x62, 0x1f, - 0x5d, 0x18, 0xee, 0xa9, 0x74, 0x1c, 0x8f, 0xcc, 0x01, 0x70, 0x67, 0x16, 0x9c, 0x10, 0xa5, 0x44, - 0xf9, 0x0b, 0x10, 0xca, 0x95, 0x3f, 0x05, 0x85, 0xbc, 0x0b, 0x33, 0x4b, 0x0b, 0xf3, 0x32, 0x2e, - 0x60, 0xd1, 0x6f, 0xf6, 0xda, 0xb4, 0x13, 0x61, 0x9c, 0x4a, 0x99, 0x8f, 0x21, 0x6d, 0xce, 0xb3, - 0x59, 0x90, 0x85, 0x26, 0xa2, 0x03, 0x78, 0x6c, 0xd9, 0x82, 0xef, 0xd2, 0x70, 0xeb, 0xe6, 0x73, - 0x16, 0x1d, 0xa0, 0xb4, 0x0d, 0x57, 0xdb, 0xcd, 0xcc, 0x95, 0xf9, 0x77, 0x31, 0x3a, 0xa0, 0x0f, - 0x97, 0xfc, 0x24, 0x8c, 0xe0, 0x4f, 0xb1, 0xe3, 0xce, 0x64, 0xb0, 0x4d, 0x76, 0xdb, 0x26, 0xcf, - 0x6d, 0x81, 0x04, 0x64, 0x39, 0x49, 0x5e, 0x7f, 0x0a, 0x1f, 0x57, 0x11, 0xa0, 0xaa, 0xbf, 0x5a, - 0xe2, 0x42, 0x59, 0xfd, 0x20, 0x9b, 0x23, 0xf7, 0x9c, 0x70, 0x8f, 0xba, 0x0b, 0xf2, 0xdd, 0xc1, - 0x32, 0x9f, 0x23, 0x7b, 0x08, 0xc5, 0x17, 0x55, 0x2c, 0x05, 0x85, 0x49, 0x87, 0xe5, 0x70, 0x33, - 0x14, 0x55, 0x11, 0x56, 0x90, 0x87, 0xd6, 0xab, 0x6b, 0x89, 0x22, 0x94, 0x96, 0x32, 0x77, 0x63, - 0xe0, 0x34, 0xf7, 0x69, 0xb0, 0x75, 0xf3, 0xb3, 0x90, 0x96, 0xfa, 0x37, 0x8e, 0x19, 0x93, 0xdf, - 0x28, 0xc6, 0xa9, 0x59, 0x34, 0x64, 0xa6, 0x23, 0x26, 0x37, 0xf3, 0x46, 0xa2, 0x23, 0x26, 0x37, - 0xf3, 0xaa, 0x8e, 0x18, 0xa3, 0xc6, 0x99, 0x73, 0x73, 0x27, 0x64, 0xce, 0x1d, 0x90, 0xac, 0x5b, - 0x3a, 0x75, 0x3e, 0x47, 0xef, 0x16, 0x7c, 0x09, 0xca, 0xb5, 0x28, 0x72, 0x9a, 0x7b, 0xd4, 0xc5, - 0x0c, 0xcd, 0xca, 0x85, 0xa0, 0x23, 0xe0, 0xaa, 0xbb, 0x98, 0x8a, 0xab, 0xbc, 0x5b, 0x32, 0x36, - 0xc4, 0xbb, 0x25, 0x73, 0x30, 0xb6, 0xdc, 0x79, 0xe4, 0xb1, 0x3e, 0x29, 0x26, 0xc9, 0x21, 0x3c, - 0x0e, 0xd2, 0x1f, 0xbb, 0x40, 0x10, 0x79, 0x5b, 0xd1, 0x20, 0x4a, 0x89, 0x2a, 0x2f, 0x5e, 0x4c, - 0x96, 0x8a, 0x84, 0x7a, 0xde, 0x2c, 0xd1, 0xc9, 0x6d, 0x18, 0x93, 0xd6, 0x33, 0x24, 0xea, 0xbb, - 0xa0, 0x74, 0x78, 0x89, 0x96, 0x8f, 0x42, 0x58, 0xcf, 0xef, 0xea, 0xf1, 0x23, 0xe3, 0x4a, 0x5c, - 0xb6, 0x12, 0x3f, 0xa2, 0xc5, 0x65, 0x2b, 0x91, 0x24, 0xb1, 0x31, 0x54, 0x3e, 0xd1, 0x18, 0xda, - 0x82, 0xf2, 0xba, 0x13, 0x44, 0x1e, 0xdb, 0x8e, 0x3a, 0x11, 0x4f, 0xab, 0x95, 0xd8, 0xea, 0x4a, - 0x51, 0xfd, 0x25, 0x19, 0x9f, 0xdc, 0x55, 0xf0, 0xf5, 0xc0, 0xd6, 0x04, 0x4e, 0x56, 0x33, 0x3c, - 0x0c, 0x45, 0x12, 0x48, 0xbc, 0x02, 0x54, 0x0e, 0xae, 0x44, 0x8b, 0xd4, 0xa3, 0xf4, 0x7e, 0xe7, - 0xc4, 0x5b, 0x7c, 0x0c, 0xd0, 0x66, 0x9c, 0x42, 0x36, 0x98, 0x5d, 0x04, 0xf5, 0x8a, 0x94, 0xe1, - 0x18, 0x23, 0x92, 0xaf, 0x43, 0x99, 0xfd, 0x8f, 0x39, 0x86, 0x3c, 0xca, 0xd3, 0x66, 0x25, 0x1e, - 0x67, 0xfa, 0x82, 0xe6, 0x89, 0x88, 0x1a, 0x34, 0xe2, 0x0b, 0x18, 0x19, 0xa7, 0x0f, 0x5e, 0x34, - 0x6e, 0xe6, 0x0f, 0x0d, 0xb8, 0x30, 0x80, 0xc7, 0xd0, 0x2f, 0x16, 0xcd, 0x25, 0x1b, 0x92, 0x62, - 0x9b, 0x8b, 0x0d, 0x49, 0x9d, 0x18, 0x72, 0x6b, 0xca, 0x4e, 0x78, 0x95, 0xff, 0xcc, 0x12, 0x5e, - 0x99, 0x87, 0x06, 0x8c, 0x2b, 0x23, 0xfb, 0x14, 0x1f, 0x22, 0x78, 0x4d, 0x64, 0x7e, 0xcc, 0x27, - 0x78, 0xa9, 0xf7, 0x87, 0x79, 0xa6, 0xc7, 0x6f, 0x00, 0xac, 0x38, 0x61, 0x54, 0x6b, 0x46, 0xde, - 0x23, 0x3a, 0x84, 0x18, 0x4b, 0x02, 0xf5, 0x1d, 0x4c, 0xa4, 0xca, 0xc8, 0xfa, 0x02, 0xf5, 0x63, - 0x86, 0xe6, 0x2a, 0x8c, 0x36, 0xfc, 0x20, 0xaa, 0x1f, 0xf0, 0xbd, 0x69, 0x91, 0x86, 0x4d, 0xf5, - 0x84, 0xce, 0x43, 0x5b, 0xbd, 0x69, 0x89, 0x22, 0xa6, 0x20, 0xde, 0xf1, 0x68, 0xcb, 0x55, 0x6f, - 0x68, 0x1e, 0x32, 0x80, 0xc5, 0xe1, 0xd7, 0x3f, 0x80, 0x29, 0x99, 0x7c, 0x6e, 0x63, 0xa5, 0x81, - 0x2d, 0x98, 0x82, 0xf1, 0xad, 0x25, 0x6b, 0xf9, 0xce, 0x57, 0xed, 0x3b, 0x9b, 0x2b, 0x2b, 0x95, - 0x33, 0x64, 0x02, 0x4a, 0x02, 0xb0, 0x50, 0xab, 0x18, 0xa4, 0x0c, 0xc5, 0xe5, 0xd5, 0xc6, 0xd2, - 0xc2, 0xa6, 0xb5, 0x54, 0xc9, 0x5d, 0x7f, 0x15, 0x26, 0x93, 0xfb, 0x17, 0x8c, 0xd1, 0x1c, 0x83, - 0xbc, 0x55, 0xdb, 0xae, 0x9c, 0x21, 0x00, 0xa3, 0xeb, 0xf7, 0x17, 0x1a, 0x37, 0x6f, 0x56, 0x8c, - 0xeb, 0x5f, 0xc8, 0x78, 0xf4, 0x99, 0x71, 0x6a, 0xd0, 0xae, 0x13, 0x38, 0x11, 0xe5, 0x9f, 0x79, - 0xd0, 0x6b, 0x45, 0x5e, 0xb7, 0x45, 0x9f, 0x54, 0x8c, 0xeb, 0x6f, 0xf7, 0xbd, 0xdd, 0x4c, 0xce, - 0xc1, 0xf4, 0xe6, 0x6a, 0xed, 0x41, 0x7d, 0xf9, 0xee, 0xe6, 0xda, 0x66, 0xc3, 0x7e, 0x50, 0xdb, - 0x58, 0xb8, 0x57, 0x39, 0xc3, 0x2a, 0xfc, 0x60, 0xad, 0xb1, 0x61, 0x5b, 0x4b, 0x0b, 0x4b, 0xab, - 0x1b, 0x15, 0xe3, 0xfa, 0xaf, 0x19, 0x30, 0xa9, 0xbf, 0x86, 0x47, 0xae, 0xc0, 0xe5, 0xcd, 0xc6, - 0x92, 0x65, 0x6f, 0xac, 0xdd, 0x5f, 0x5a, 0xb5, 0x37, 0x1b, 0xb5, 0xbb, 0x4b, 0xf6, 0xe6, 0x6a, - 0x63, 0x7d, 0x69, 0x61, 0xf9, 0xce, 0xf2, 0xd2, 0x62, 0xe5, 0x0c, 0xa9, 0xc2, 0x0b, 0x0a, 0x86, - 0xb5, 0xb4, 0xb0, 0xb6, 0xb5, 0x64, 0xd9, 0xeb, 0xb5, 0x46, 0x63, 0x7b, 0xcd, 0x5a, 0xac, 0x18, - 0xe4, 0x12, 0x9c, 0xcf, 0x40, 0x78, 0x70, 0xa7, 0x56, 0xc9, 0xf5, 0x95, 0xad, 0x2e, 0x6d, 0xd7, - 0x56, 0xec, 0xfa, 0xda, 0x46, 0x25, 0x7f, 0xfd, 0x03, 0xa6, 0x85, 0x24, 0xcf, 0x55, 0x90, 0x22, - 0x14, 0x56, 0xd7, 0x56, 0x97, 0x2a, 0x67, 0xc8, 0x38, 0x8c, 0xad, 0x2f, 0xad, 0x2e, 0x2e, 0xaf, - 0xde, 0xe5, 0xdd, 0x5a, 0x5b, 0x5f, 0xb7, 0xd6, 0xb6, 0x96, 0x16, 0x2b, 0x39, 0xd6, 0x77, 0x8b, - 0x4b, 0xab, 0xac, 0x66, 0xf9, 0xeb, 0x26, 0x4f, 0xd1, 0xac, 0x65, 0x18, 0x65, 0xbd, 0xb5, 0xf4, - 0x95, 0x8d, 0xa5, 0xd5, 0xc6, 0xf2, 0xda, 0x6a, 0xe5, 0xcc, 0xf5, 0xcb, 0x29, 0x1c, 0x39, 0x12, - 0x8d, 0xc6, 0xbd, 0xca, 0x99, 0xeb, 0x5f, 0x87, 0xb2, 0xba, 0x09, 0x93, 0x0b, 0x30, 0xa3, 0xfe, - 0x5e, 0xa7, 0x1d, 0xd7, 0xeb, 0xec, 0x56, 0xce, 0xa4, 0x0b, 0xac, 0x5e, 0xa7, 0xc3, 0x0a, 0xb0, - 0xf1, 0x6a, 0xc1, 0x06, 0x0d, 0xda, 0x5e, 0x87, 0xed, 0xaf, 0x95, 0x5c, 0xbd, 0xf2, 0xfd, 0xbf, - 0x7c, 0xe9, 0xcc, 0xf7, 0x7f, 0xf0, 0x92, 0xf1, 0x67, 0x3f, 0x78, 0xc9, 0xf8, 0xaf, 0x3f, 0x78, - 0xc9, 0xd8, 0x19, 0xc5, 0x89, 0x7e, 0xeb, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x67, 0x6d, 0x41, - 0x27, 0x6f, 0xb5, 0x00, 0x00, + // 11794 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x6c, 0x24, 0x49, + 0x72, 0xd8, 0x54, 0x77, 0x93, 0xec, 0x0e, 0x36, 0xc9, 0x66, 0xce, 0x8b, 0x33, 0x3b, 0xbb, 0x3d, + 0x57, 0xfb, 0x9a, 0x9d, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0x47, 0xda, 0xdb, 0xd7, 0x75, 0x93, 0x3d, + 0x33, 0xdc, 0xe1, 0x6b, 0xab, 0x9b, 0xe4, 0x9d, 0xee, 0x4e, 0xa5, 0x62, 0x57, 0x0e, 0x59, 0xcb, + 0x66, 0x57, 0xab, 0xaa, 0x7a, 0x66, 0x28, 0x59, 0x90, 0x0c, 0x43, 0x16, 0x64, 0x41, 0xf7, 0x10, + 0x4e, 0x96, 0x64, 0xc8, 0x90, 0x2c, 0x58, 0xb0, 0x65, 0xe3, 0xfc, 0x21, 0x1b, 0xb0, 0x0d, 0x18, + 0x06, 0x04, 0x18, 0xc2, 0x7d, 0xd8, 0xb0, 0xfe, 0x0c, 0xc9, 0x06, 0x6d, 0xdd, 0xf9, 0x47, 0x04, + 0x6c, 0x18, 0xf0, 0x97, 0xce, 0x16, 0x6c, 0x64, 0x64, 0x66, 0x55, 0x66, 0x75, 0x35, 0xd9, 0xb3, + 0x3b, 0x0b, 0x68, 0xf6, 0x8b, 0xec, 0xc8, 0x88, 0xa8, 0x7c, 0x46, 0x46, 0x64, 0x46, 0x44, 0xc2, + 0x64, 0x74, 0xd8, 0xa3, 0xe1, 0x8d, 0x5e, 0xe0, 0x47, 0x3e, 0x19, 0xc3, 0x1f, 0x97, 0xcf, 0xed, + 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd9, 0x7f, 0xbc, 0xf0, 0x72, 0x75, 0xd7, 0xf7, 0x77, 0x3b, 0x74, + 0x1e, 0x7f, 0xed, 0xf4, 0x1f, 0xcc, 0x47, 0xde, 0x01, 0x0d, 0x23, 0xe7, 0xa0, 0x27, 0x10, 0x16, + 0x77, 0xbd, 0x68, 0xaf, 0xbf, 0x73, 0xa3, 0xed, 0x1f, 0xcc, 0xef, 0x06, 0xce, 0x43, 0x2f, 0x72, + 0x22, 0xcf, 0xef, 0x3a, 0x9d, 0xf9, 0x88, 0x76, 0x68, 0xcf, 0x0f, 0xa2, 0x79, 0xa7, 0xe7, 0xcd, + 0xe3, 0x37, 0xe6, 0x1f, 0x05, 0x4e, 0xaf, 0x47, 0x83, 0xe4, 0x1f, 0xce, 0xc4, 0xfc, 0x07, 0x79, + 0x28, 0xdd, 0xa7, 0xb4, 0x57, 0xeb, 0x78, 0x0f, 0x29, 0x79, 0x11, 0x0a, 0x6b, 0xce, 0x01, 0x9d, + 0x33, 0xae, 0x1a, 0xd7, 0x4a, 0xf5, 0x99, 0xe3, 0xa3, 0xea, 0x64, 0x48, 0x83, 0x87, 0x34, 0xb0, + 0xbb, 0xce, 0x01, 0xb5, 0xb0, 0x90, 0x7c, 0x1e, 0x4a, 0xec, 0x6f, 0xd8, 0x73, 0xda, 0x74, 0x2e, + 0x87, 0x98, 0x53, 0xc7, 0x47, 0xd5, 0x52, 0x57, 0x02, 0xad, 0xa4, 0x9c, 0xbc, 0x02, 0x13, 0x2b, + 0xd4, 0x09, 0xe9, 0xf2, 0xd2, 0x5c, 0xfe, 0xaa, 0x71, 0x2d, 0x5f, 0x2f, 0x1f, 0x1f, 0x55, 0x8b, + 0x1d, 0x06, 0xb2, 0x3d, 0xd7, 0x92, 0x85, 0x64, 0x19, 0x26, 0x1a, 0x8f, 0x7b, 0x5e, 0x40, 0xc3, + 0xb9, 0xc2, 0x55, 0xe3, 0xda, 0xe4, 0xc2, 0xe5, 0x1b, 0xbc, 0xfd, 0x37, 0x64, 0xfb, 0x6f, 0xb4, + 0x64, 0xfb, 0xeb, 0x67, 0xbf, 0x7f, 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x9d, 0xa0, 0x9c, 0xe4, 0xdb, + 0xff, 0xb5, 0x6a, 0x58, 0x92, 0x9e, 0xbc, 0x03, 0x85, 0xd6, 0x61, 0x8f, 0xce, 0x95, 0xae, 0x1a, + 0xd7, 0xa6, 0x17, 0x5e, 0xb8, 0xc1, 0x7b, 0x3c, 0x6e, 0x64, 0xf2, 0x1f, 0xc3, 0xaa, 0x17, 0x8f, + 0x8f, 0xaa, 0x05, 0x86, 0x62, 0x21, 0x15, 0x79, 0x03, 0xc6, 0xef, 0xf9, 0x61, 0xb4, 0xbc, 0x34, + 0x07, 0xd8, 0xb4, 0xf3, 0xc7, 0x47, 0xd5, 0xd9, 0x3d, 0x3f, 0x8c, 0x6c, 0xcf, 0x7d, 0xdd, 0x3f, + 0xf0, 0x22, 0x7a, 0xd0, 0x8b, 0x0e, 0x2d, 0x81, 0x64, 0xee, 0xc0, 0x94, 0xc6, 0x8f, 0x4c, 0xc2, + 0xc4, 0xe6, 0xda, 0xfd, 0xb5, 0xf5, 0xed, 0xb5, 0xca, 0x19, 0x52, 0x84, 0xc2, 0xda, 0xfa, 0x52, + 0xa3, 0x62, 0x90, 0x09, 0xc8, 0xd7, 0x36, 0x36, 0x2a, 0x39, 0x52, 0x86, 0xe2, 0x52, 0xad, 0x55, + 0xab, 0xd7, 0x9a, 0x8d, 0x4a, 0x9e, 0x9c, 0x85, 0x99, 0xed, 0xe5, 0xb5, 0xa5, 0xf5, 0xed, 0xa6, + 0xbd, 0xd4, 0x68, 0xde, 0x6f, 0xad, 0x6f, 0x54, 0x0a, 0x64, 0x1a, 0xe0, 0xfe, 0x66, 0xbd, 0x61, + 0xad, 0x35, 0x5a, 0x8d, 0x66, 0x65, 0xcc, 0xfc, 0xa5, 0x3c, 0x14, 0x57, 0x69, 0xe4, 0xb8, 0x4e, + 0xe4, 0x90, 0x2b, 0xda, 0x10, 0x61, 0xed, 0x95, 0xb1, 0x79, 0x71, 0x70, 0x6c, 0xc6, 0x8e, 0x8f, + 0xaa, 0xc6, 0x1b, 0xea, 0x98, 0xbc, 0x0d, 0x93, 0x4b, 0x34, 0x6c, 0x07, 0x5e, 0x8f, 0xcd, 0x17, + 0x1c, 0x97, 0x52, 0xfd, 0xd2, 0xf1, 0x51, 0xf5, 0xbc, 0x9b, 0x80, 0x95, 0xb6, 0xaa, 0xd8, 0x64, + 0x19, 0xc6, 0x57, 0x9c, 0x1d, 0xda, 0x09, 0xe7, 0xc6, 0xae, 0xe6, 0xaf, 0x4d, 0x2e, 0x3c, 0x27, + 0xfa, 0x57, 0x56, 0xf0, 0x06, 0x2f, 0x6d, 0x74, 0xa3, 0xe0, 0xb0, 0x7e, 0xee, 0xf8, 0xa8, 0x5a, + 0xe9, 0x20, 0x40, 0xed, 0x3b, 0x8e, 0x42, 0x9a, 0xc9, 0x98, 0x8f, 0x9f, 0x3a, 0xe6, 0xcf, 0x7f, + 0xff, 0xa8, 0x6a, 0xb0, 0xb1, 0x10, 0x63, 0x9e, 0xf0, 0xd3, 0x47, 0xff, 0x2a, 0xe4, 0x96, 0x97, + 0xe6, 0x26, 0x70, 0xae, 0x55, 0x8e, 0x8f, 0xaa, 0x65, 0x6d, 0xd8, 0x72, 0xcb, 0x4b, 0x97, 0xdf, + 0x82, 0x49, 0xa5, 0x8e, 0xa4, 0x02, 0xf9, 0x7d, 0x7a, 0xc8, 0xfb, 0xd3, 0x62, 0xff, 0x92, 0x73, + 0x30, 0xf6, 0xd0, 0xe9, 0xf4, 0x45, 0x07, 0x5a, 0xfc, 0xc7, 0x97, 0x72, 0x3f, 0x6e, 0x98, 0xbf, + 0x56, 0x80, 0xa2, 0xe5, 0xf3, 0x75, 0x46, 0x5e, 0x83, 0xb1, 0x66, 0xe4, 0x44, 0x72, 0x28, 0xce, + 0x1e, 0x1f, 0x55, 0x67, 0x42, 0x06, 0x50, 0xbe, 0xc7, 0x31, 0x18, 0xea, 0xc6, 0x9e, 0x13, 0xca, + 0x21, 0x41, 0xd4, 0x1e, 0x03, 0xa8, 0xa8, 0x88, 0x41, 0x5e, 0x81, 0xc2, 0xaa, 0xef, 0x52, 0x31, + 0x2a, 0xe4, 0xf8, 0xa8, 0x3a, 0x7d, 0xe0, 0xbb, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0xa1, 0xb4, 0xd8, + 0x0f, 0x02, 0xda, 0x65, 0x53, 0xb5, 0x80, 0xc8, 0xd3, 0xc7, 0x47, 0x55, 0x68, 0x73, 0x20, 0x5b, + 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x66, 0xe4, 0x04, 0x11, 0x75, 0xe7, 0xc6, 0x46, 0xea, 0x6a, 0xb6, + 0xbc, 0x66, 0x43, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, 0xdc, 0x83, 0xc9, 0xbb, 0x81, 0xd3, 0xa6, + 0x1b, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0x7f, 0xe5, 0xf8, 0xa8, 0x7a, 0x61, 0x97, 0x81, + 0xed, 0x1e, 0xc2, 0x13, 0xea, 0x1f, 0x1d, 0x55, 0x8b, 0x4b, 0xfd, 0x00, 0x7b, 0xcf, 0x52, 0x49, + 0xc9, 0x4f, 0xb1, 0x21, 0x09, 0x23, 0xec, 0x5a, 0xea, 0xe2, 0xe8, 0x9d, 0x5c, 0x45, 0x53, 0x54, + 0xf1, 0x42, 0xc7, 0x09, 0x23, 0x3b, 0xe0, 0x74, 0xa9, 0x7a, 0xaa, 0x2c, 0xc9, 0x3a, 0x14, 0x9b, + 0xed, 0x3d, 0xea, 0xf6, 0x3b, 0x74, 0xae, 0x88, 0xec, 0x2f, 0x8a, 0x89, 0x2b, 0xc7, 0x53, 0x16, + 0xd7, 0x2f, 0x0b, 0xde, 0x24, 0x14, 0x10, 0xa5, 0xef, 0x63, 0x26, 0x5f, 0x2a, 0xfe, 0xe6, 0xef, + 0x56, 0xcf, 0xfc, 0xc2, 0x7f, 0xb9, 0x7a, 0xc6, 0xfc, 0x97, 0x39, 0xa8, 0xa4, 0x99, 0x90, 0x07, + 0x30, 0xb5, 0xd9, 0x73, 0x9d, 0x88, 0x2e, 0x76, 0x3c, 0xda, 0x8d, 0x42, 0x9c, 0x24, 0x27, 0xb7, + 0xe9, 0x25, 0xf1, 0xdd, 0xb9, 0x3e, 0x12, 0xda, 0x6d, 0x4e, 0x99, 0x6a, 0x95, 0xce, 0x36, 0xf9, + 0x4e, 0x13, 0xe5, 0x74, 0x88, 0x33, 0xec, 0xc9, 0xbe, 0xc3, 0x25, 0xfc, 0x90, 0xef, 0x08, 0xb6, + 0x62, 0x02, 0x75, 0xdd, 0x9d, 0x43, 0x9c, 0x99, 0xa3, 0x4f, 0x20, 0x46, 0x92, 0x31, 0x81, 0x18, + 0xd8, 0xfc, 0xef, 0x06, 0x4c, 0x5b, 0x34, 0xf4, 0xfb, 0x41, 0x9b, 0xde, 0xa3, 0x8e, 0x4b, 0x03, + 0x36, 0xfd, 0xef, 0x7b, 0x5d, 0x57, 0xac, 0x29, 0x9c, 0xfe, 0xfb, 0x5e, 0x57, 0x5d, 0xc2, 0x58, + 0x4e, 0xbe, 0x00, 0x13, 0xcd, 0xfe, 0x0e, 0xa2, 0xf2, 0x35, 0x75, 0x01, 0x47, 0xac, 0xbf, 0x63, + 0xa7, 0xd0, 0x25, 0x1a, 0x99, 0x87, 0x89, 0x2d, 0x1a, 0x84, 0x89, 0xc4, 0x43, 0xc9, 0xfe, 0x90, + 0x83, 0x54, 0x02, 0x81, 0x45, 0xee, 0x26, 0x52, 0x57, 0xec, 0x49, 0x33, 0x29, 0x59, 0x97, 0x4c, + 0x95, 0x03, 0x01, 0x51, 0xa7, 0x8a, 0xc4, 0x32, 0xbf, 0x93, 0x83, 0xca, 0x92, 0x13, 0x39, 0x3b, + 0x4e, 0x28, 0xfa, 0x73, 0xeb, 0x16, 0x93, 0xe3, 0x4a, 0x43, 0x51, 0x8e, 0xb3, 0x9a, 0x7f, 0xec, + 0xe6, 0xbd, 0x9c, 0x6e, 0xde, 0x24, 0xdb, 0x20, 0x45, 0xf3, 0x92, 0x46, 0xbd, 0x7b, 0x7a, 0xa3, + 0x2a, 0xa2, 0x51, 0x45, 0xd9, 0xa8, 0xa4, 0x29, 0xe4, 0x5d, 0x28, 0x34, 0x7b, 0xb4, 0x2d, 0x84, + 0x88, 0x94, 0xfd, 0x7a, 0xe3, 0x18, 0xc2, 0xd6, 0xad, 0x7a, 0x59, 0xb0, 0x29, 0x84, 0x3d, 0xda, + 0xb6, 0x90, 0x4c, 0x59, 0x34, 0xdf, 0x1d, 0x87, 0x73, 0x59, 0x64, 0xe4, 0x5d, 0x7d, 0x73, 0xe2, + 0xdd, 0xf3, 0xdc, 0xd0, 0xcd, 0x69, 0xce, 0xd0, 0xb7, 0xa7, 0xeb, 0x50, 0xdc, 0x60, 0x13, 0xb2, + 0xed, 0x77, 0x44, 0xcf, 0x31, 0xa9, 0x58, 0xec, 0x49, 0x98, 0x61, 0xc5, 0xe5, 0xe4, 0x39, 0xc8, + 0x6f, 0x5a, 0xcb, 0xa2, 0xbb, 0x4a, 0xc7, 0x47, 0xd5, 0x7c, 0x3f, 0xf0, 0xe6, 0x0c, 0x8b, 0x41, + 0xc9, 0x3c, 0x8c, 0x2f, 0xd6, 0x16, 0x69, 0x10, 0x61, 0x37, 0x95, 0xeb, 0x17, 0xd9, 0x6c, 0x69, + 0x3b, 0x76, 0x9b, 0x06, 0x91, 0xf6, 0x79, 0x81, 0x46, 0x3e, 0x0f, 0xf9, 0xda, 0x76, 0x53, 0xf4, + 0x0c, 0x88, 0x9e, 0xa9, 0x6d, 0x37, 0xeb, 0x53, 0xa2, 0x23, 0xf2, 0xce, 0xa3, 0x90, 0x71, 0xaf, + 0x6d, 0x37, 0xd5, 0xd1, 0x1a, 0x3f, 0x61, 0xb4, 0xae, 0x41, 0x91, 0xe9, 0x19, 0x6c, 0x83, 0x47, + 0xa1, 0x58, 0xe2, 0xea, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x31, 0x56, 0x5b, 0x8a, 0x09, + 0x3f, 0xa1, 0xb6, 0x48, 0x65, 0x85, 0x3c, 0x86, 0xa9, 0xa5, 0xc3, 0xae, 0x73, 0xe0, 0xb5, 0xc5, + 0x16, 0x5e, 0xc2, 0x2d, 0xfc, 0xc6, 0x09, 0xc3, 0x78, 0x43, 0x23, 0xe0, 0xbb, 0xba, 0x14, 0xbe, + 0x73, 0x2e, 0x2f, 0xb3, 0xd3, 0x3b, 0xfc, 0x9c, 0x61, 0xe9, 0x1f, 0x62, 0x6b, 0x49, 0x8a, 0x48, + 0xd4, 0xab, 0x92, 0x69, 0x27, 0xc1, 0xc9, 0x5a, 0x0a, 0x04, 0x44, 0x5d, 0x4b, 0xf1, 0xa6, 0xfb, + 0x2e, 0xe4, 0xef, 0x2e, 0x6e, 0xcc, 0x4d, 0x22, 0x0f, 0x22, 0x78, 0xdc, 0x5d, 0xdc, 0x58, 0xec, + 0xf8, 0x7d, 0xb7, 0xf9, 0xe1, 0x4a, 0xfd, 0xa2, 0x60, 0x33, 0xb5, 0xdb, 0xee, 0x69, 0x35, 0x62, + 0x74, 0xa4, 0x01, 0x45, 0xd9, 0xca, 0xb9, 0x32, 0xf2, 0x98, 0x4d, 0x35, 0x7e, 0xeb, 0x16, 0x5f, + 0x6b, 0xae, 0xf8, 0xad, 0xd6, 0x42, 0xe2, 0x5c, 0xde, 0x06, 0x32, 0xd8, 0x2f, 0x19, 0x9a, 0xc4, + 0xe7, 0x55, 0x4d, 0x62, 0x72, 0xe1, 0xbc, 0xf8, 0xd6, 0xa2, 0x7f, 0x70, 0xe0, 0x74, 0x5d, 0xa4, + 0xdd, 0x5a, 0x50, 0x15, 0x8c, 0x1a, 0x4c, 0x27, 0x15, 0x59, 0xf1, 0xc2, 0x88, 0xcc, 0x43, 0x49, + 0x42, 0xd8, 0x26, 0x92, 0xcf, 0xac, 0xb2, 0x95, 0xe0, 0x98, 0x7f, 0x9c, 0x03, 0x48, 0x4a, 0x9e, + 0x51, 0x39, 0xf3, 0x63, 0x9a, 0x9c, 0x39, 0x9f, 0x9e, 0xa0, 0x43, 0x25, 0x0c, 0x79, 0x1f, 0xc6, + 0x99, 0xca, 0xd5, 0x97, 0x2a, 0xe5, 0xc5, 0x34, 0x29, 0x16, 0x6e, 0xdd, 0xaa, 0x4f, 0x0b, 0xe2, + 0xf1, 0x10, 0x21, 0x96, 0x20, 0x53, 0x44, 0xd4, 0xff, 0x2c, 0x24, 0x83, 0x21, 0x84, 0xd3, 0x35, + 0x45, 0xba, 0x18, 0xc9, 0x7a, 0x94, 0xd2, 0x45, 0x91, 0x2d, 0x97, 0xb8, 0x6c, 0xe1, 0x9d, 0x3a, + 0x21, 0x64, 0x4b, 0x5a, 0xb2, 0xf0, 0x0e, 0x3c, 0x55, 0xb2, 0xf4, 0xd2, 0xcb, 0xb6, 0x80, 0xd3, + 0xe0, 0x5a, 0x66, 0xaf, 0x64, 0x2d, 0xd8, 0xab, 0xa7, 0x2d, 0xd8, 0xf4, 0x72, 0xbd, 0x35, 0x4c, + 0x96, 0x9d, 0x97, 0xab, 0xcb, 0x79, 0xa4, 0x92, 0xa3, 0x4c, 0x7b, 0x9b, 0x2f, 0xcd, 0xf1, 0xa1, + 0x4b, 0xf3, 0x7c, 0xe6, 0xd2, 0xe4, 0x0b, 0xf3, 0x6d, 0x18, 0xab, 0xfd, 0x4c, 0x3f, 0xa0, 0x42, + 0xf7, 0x2b, 0xcb, 0x6f, 0x32, 0x58, 0xbc, 0xa6, 0x67, 0x1c, 0xf6, 0x53, 0xd5, 0x99, 0xb1, 0x9c, + 0x7d, 0xb9, 0xb5, 0xd2, 0x14, 0x7a, 0x1d, 0x49, 0x75, 0x4b, 0x6b, 0x45, 0xa9, 0x76, 0xa4, 0xb5, + 0x9a, 0x51, 0x91, 0x79, 0xc8, 0xd5, 0x96, 0xd0, 0x58, 0x9c, 0x5c, 0x28, 0xc9, 0xcf, 0x2e, 0xd5, + 0xcf, 0x09, 0x92, 0xb2, 0xa3, 0xd9, 0x0f, 0xb5, 0xa5, 0x4f, 0x6f, 0xf1, 0x77, 0x14, 0x35, 0x41, + 0x4c, 0x53, 0x66, 0x8e, 0x8a, 0xc9, 0x62, 0x24, 0x4a, 0xcb, 0xc0, 0x64, 0x89, 0xa7, 0xca, 0x6b, + 0x7c, 0xe0, 0x72, 0x03, 0x03, 0x37, 0xa9, 0x6c, 0x42, 0x38, 0x5c, 0xe6, 0x5f, 0x18, 0x88, 0x4b, + 0x5e, 0x87, 0x71, 0x8b, 0xee, 0x26, 0x7b, 0x2d, 0xda, 0x6c, 0x01, 0x42, 0xd4, 0x0f, 0x70, 0x1c, + 0x14, 0xe4, 0xd4, 0x0d, 0xf7, 0xbc, 0x07, 0x91, 0xf8, 0x4a, 0x2c, 0xc8, 0x05, 0x58, 0x11, 0xe4, + 0x02, 0xa2, 0x09, 0x72, 0x01, 0x63, 0x53, 0xcc, 0x5a, 0x6a, 0x0a, 0x65, 0x52, 0xd6, 0xd4, 0x5a, + 0x52, 0xc6, 0x2a, 0x70, 0xb5, 0xb1, 0xb2, 0x96, 0x9a, 0xe4, 0x36, 0x94, 0x6a, 0xed, 0xb6, 0xdf, + 0x57, 0x8c, 0x9e, 0xb9, 0xe3, 0xa3, 0xea, 0x39, 0x87, 0x03, 0x75, 0x13, 0x3d, 0x41, 0x35, 0xeb, + 0x49, 0xad, 0x19, 0x8f, 0xc5, 0x4e, 0x3f, 0x8c, 0x68, 0xb0, 0xbc, 0x24, 0x9a, 0x8c, 0x3c, 0xda, + 0x1c, 0x98, 0xe2, 0x11, 0xa3, 0x9a, 0xff, 0xd9, 0xc0, 0x1a, 0x93, 0xb7, 0x00, 0x96, 0xbb, 0x4c, + 0xb1, 0x6d, 0xd3, 0x98, 0x01, 0x1a, 0xcf, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, 0xfd, 0xd3, 0xb9, + 0x91, 0x3f, 0xcd, 0x3e, 0x29, 0xd5, 0x64, 0x71, 0x8e, 0x22, 0x3e, 0x19, 0x08, 0x68, 0xea, 0x93, + 0x09, 0x32, 0x79, 0x05, 0x26, 0x96, 0x6b, 0xab, 0xb5, 0x7e, 0xb4, 0x87, 0xfd, 0x55, 0xe4, 0x02, + 0xcb, 0x73, 0x0e, 0x6c, 0xa7, 0x1f, 0xed, 0x59, 0xb2, 0xd0, 0xfc, 0x05, 0x03, 0x26, 0x95, 0xb5, + 0xca, 0xaa, 0xba, 0x11, 0xf8, 0x1f, 0xd1, 0x76, 0xa4, 0xf7, 0x52, 0x8f, 0x03, 0x53, 0x55, 0x8d, + 0x51, 0x53, 0xbd, 0x93, 0x7b, 0x82, 0xde, 0x31, 0xe7, 0x85, 0x08, 0x60, 0x36, 0x80, 0x72, 0xc4, + 0x81, 0x36, 0x00, 0xd3, 0x71, 0x54, 0x1b, 0x80, 0x95, 0x9b, 0x7f, 0x60, 0xb0, 0xa5, 0x4b, 0xe6, + 0x01, 0xee, 0xd3, 0xc3, 0xc8, 0xd9, 0xb9, 0xe3, 0x75, 0xb4, 0xa3, 0xab, 0x7d, 0x84, 0xda, 0x0f, + 0xbc, 0x0e, 0xb5, 0x14, 0x14, 0x72, 0x0b, 0x8a, 0xf7, 0x83, 0x9d, 0x37, 0x11, 0x3d, 0x17, 0x8b, + 0xe0, 0xb3, 0xfb, 0xc1, 0xce, 0x9b, 0x88, 0xac, 0xce, 0x57, 0x89, 0x48, 0x4c, 0x18, 0x5f, 0xf2, + 0x0f, 0x1c, 0x4f, 0x6e, 0x7b, 0xc0, 0xf6, 0x0e, 0x17, 0x21, 0x96, 0x28, 0x61, 0x42, 0xbf, 0xb9, + 0xb1, 0x26, 0x26, 0x26, 0x0a, 0xfd, 0xb0, 0xd7, 0xb5, 0x18, 0xcc, 0xfc, 0x9e, 0x01, 0x93, 0x8a, + 0x44, 0x22, 0x5f, 0x14, 0x66, 0xbe, 0x81, 0x87, 0x54, 0x17, 0x06, 0x65, 0x16, 0x2b, 0xe5, 0xdb, + 0x35, 0x33, 0xff, 0x85, 0xd1, 0x9f, 0x48, 0x83, 0xdc, 0x28, 0xd2, 0xe0, 0x2d, 0x00, 0xae, 0xcb, + 0x61, 0x77, 0x2a, 0xf3, 0x46, 0x39, 0xd4, 0x53, 0x07, 0x23, 0x41, 0x36, 0xff, 0x66, 0x0e, 0x8a, + 0xc2, 0x56, 0x59, 0x78, 0x46, 0x75, 0x88, 0x37, 0x35, 0x1d, 0xe2, 0xac, 0x20, 0x55, 0x94, 0xdb, + 0x85, 0x53, 0x6c, 0x94, 0xb7, 0xa0, 0x2c, 0xbb, 0x00, 0x55, 0xb1, 0xd7, 0x60, 0x42, 0x5a, 0xd9, + 0x5c, 0x11, 0x9b, 0xd1, 0x78, 0x6e, 0x2d, 0x58, 0xb2, 0xdc, 0xfc, 0xce, 0x98, 0xa4, 0xe5, 0x5f, + 0x62, 0x5d, 0x58, 0x73, 0xdd, 0x40, 0xed, 0x42, 0xc7, 0x75, 0x03, 0x0b, 0xa1, 0x6c, 0xa0, 0x36, + 0xfa, 0x3b, 0x1d, 0xaf, 0x8d, 0x38, 0xca, 0xaa, 0xe9, 0x21, 0xd4, 0x66, 0xa8, 0xea, 0x40, 0x25, + 0xc8, 0x9a, 0x89, 0x90, 0x3f, 0xd1, 0x44, 0xf8, 0x49, 0x28, 0x2d, 0x1e, 0xb8, 0x9a, 0x0a, 0x61, + 0x66, 0x74, 0xca, 0x8d, 0x18, 0x89, 0x2b, 0x0f, 0x57, 0x44, 0x1f, 0x9d, 0x6b, 0x1f, 0xb8, 0x83, + 0x8a, 0x43, 0xc2, 0x52, 0xd3, 0xf1, 0xc7, 0x3e, 0x89, 0x8e, 0x7f, 0x1b, 0x4a, 0x9b, 0x21, 0x6d, + 0xf5, 0xbb, 0x5d, 0xda, 0x41, 0x75, 0xa2, 0xc8, 0x65, 0x4f, 0x3f, 0xa4, 0x76, 0x84, 0x50, 0xb5, + 0x02, 0x31, 0xaa, 0x3a, 0xad, 0x26, 0x4e, 0x98, 0x56, 0x5f, 0x84, 0x42, 0xad, 0xd7, 0x93, 0xc6, + 0x4f, 0xbc, 0x49, 0xf6, 0x7a, 0xb8, 0xf5, 0x4d, 0x3b, 0xbd, 0x9e, 0x6e, 0xca, 0x20, 0x36, 0xa1, + 0x40, 0xee, 0xf7, 0x77, 0x68, 0xd0, 0xa5, 0x11, 0x0d, 0x85, 0x68, 0x0e, 0xe7, 0x00, 0x79, 0xcc, + 0xc9, 0x33, 0xe6, 0x34, 0x02, 0x1a, 0xae, 0x17, 0xf7, 0xfb, 0x3b, 0xd4, 0x16, 0x32, 0x5e, 0xed, + 0xbb, 0x0c, 0x86, 0x97, 0x9b, 0x30, 0xad, 0xf7, 0xff, 0x53, 0x50, 0x2c, 0x3e, 0x28, 0x14, 0x8b, + 0x95, 0x92, 0xf9, 0x4b, 0x39, 0x98, 0xac, 0xf5, 0x7a, 0xcf, 0xf8, 0x09, 0xc4, 0x8f, 0x6b, 0xab, + 0xfa, 0x42, 0x32, 0x7a, 0x4f, 0x70, 0xf8, 0xf0, 0x97, 0x06, 0xcc, 0xa4, 0x28, 0xd4, 0xda, 0x1b, + 0x23, 0x5a, 0xe4, 0xb9, 0x11, 0x2d, 0xf2, 0xfc, 0x70, 0x8b, 0x5c, 0x5d, 0x33, 0x85, 0x4f, 0xb2, + 0x66, 0x5e, 0x85, 0x7c, 0xad, 0xd7, 0x13, 0xbd, 0x52, 0x4e, 0x7a, 0x65, 0xeb, 0x16, 0xdf, 0x88, + 0x9c, 0x5e, 0xcf, 0x62, 0x18, 0xe6, 0x1b, 0x50, 0x42, 0x30, 0x4a, 0xb4, 0xab, 0x62, 0x29, 0x70, + 0x71, 0xa6, 0x91, 0xf1, 0x69, 0x6f, 0xfe, 0x1f, 0x03, 0xc6, 0xf0, 0xf7, 0x33, 0x3a, 0x5d, 0x16, + 0xb4, 0xe9, 0x52, 0x51, 0xa6, 0xcb, 0x28, 0x13, 0xe5, 0x0f, 0xf3, 0xd8, 0x5b, 0x62, 0x8a, 0x08, + 0x9b, 0xce, 0xc8, 0xb0, 0xe9, 0x3e, 0x81, 0x00, 0xdf, 0x4f, 0x5b, 0x77, 0x79, 0x1c, 0x8c, 0x17, + 0xd3, 0x55, 0x7d, 0x2a, 0x86, 0xdd, 0x3d, 0x20, 0xcb, 0xdd, 0x90, 0xb6, 0xfb, 0x01, 0x6d, 0xee, + 0x7b, 0xbd, 0x2d, 0x1a, 0x78, 0x0f, 0x0e, 0x85, 0x66, 0x88, 0x32, 0xd6, 0x13, 0xa5, 0x76, 0xb8, + 0xef, 0xf5, 0xec, 0x87, 0x58, 0x6e, 0x65, 0xd0, 0x90, 0xf7, 0x61, 0xc2, 0xa2, 0x8f, 0x02, 0x2f, + 0xa2, 0xa2, 0x6f, 0xa7, 0x63, 0x3b, 0x00, 0xa1, 0x5c, 0x37, 0x09, 0xf8, 0x0f, 0x75, 0xfc, 0x45, + 0xf9, 0xa7, 0x67, 0x46, 0x7d, 0x77, 0x0c, 0xd7, 0xc2, 0x29, 0x37, 0x65, 0x27, 0x18, 0xe8, 0xfa, + 0x60, 0xe6, 0x9f, 0x64, 0x30, 0xb7, 0xa0, 0xcc, 0x4c, 0xb7, 0x94, 0xa5, 0x7e, 0x25, 0x19, 0xcb, + 0x1b, 0x6a, 0xf1, 0x49, 0x97, 0x64, 0x1a, 0x1f, 0x62, 0xa7, 0x27, 0x09, 0xbf, 0x7c, 0x7b, 0x5e, + 0x61, 0x9c, 0x31, 0x3d, 0x62, 0xd1, 0xd1, 0xe6, 0x9d, 0xf5, 0xc4, 0x13, 0x63, 0xfc, 0x93, 0x4d, + 0x8c, 0x89, 0x8f, 0x33, 0x31, 0xd2, 0xd7, 0x93, 0xc5, 0x27, 0xb9, 0x9e, 0xbc, 0xfc, 0x3e, 0xcc, + 0x0e, 0xf4, 0xf0, 0x93, 0x5c, 0xf1, 0x7d, 0x7a, 0xd3, 0xf2, 0xe7, 0xe2, 0x7e, 0x21, 0x0b, 0x68, + 0x8e, 0x7a, 0x01, 0x6d, 0x47, 0x28, 0x7a, 0x85, 0xb4, 0x0c, 0x04, 0x2c, 0x65, 0x2f, 0x23, 0x8c, + 0xbc, 0x07, 0x13, 0xfc, 0x8a, 0x24, 0x9c, 0xcb, 0xe1, 0xd8, 0x4f, 0x89, 0x2f, 0x72, 0xa8, 0xb8, + 0xa7, 0xe6, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x2e, 0x8c, 0x8b, 0x2b, 0x96, 0x93, 0xd7, 0x45, + 0x15, 0xc6, 0xb6, 0x92, 0x9e, 0xc1, 0x63, 0x71, 0xde, 0x08, 0x8b, 0xc3, 0xcd, 0x5f, 0x31, 0x60, + 0x5a, 0x6f, 0x25, 0xb9, 0x01, 0xe3, 0xe2, 0x0e, 0xd0, 0xc0, 0x3b, 0x40, 0xd6, 0x9a, 0x71, 0x7e, + 0xfb, 0xa7, 0xdd, 0xf9, 0x09, 0x2c, 0x26, 0xfa, 0x05, 0x07, 0x6c, 0x8b, 0x10, 0xfd, 0x62, 0x92, + 0x5a, 0xb2, 0x8c, 0x99, 0x5c, 0x16, 0x0d, 0xfb, 0x9d, 0x48, 0x35, 0xb9, 0x02, 0x84, 0x58, 0xa2, + 0xc4, 0x3c, 0x32, 0x00, 0x9a, 0xcd, 0x7b, 0xf7, 0xe9, 0xe1, 0x86, 0xe3, 0x05, 0x68, 0xb6, 0xe2, + 0x6a, 0xbc, 0x2f, 0x46, 0xab, 0x2c, 0xcc, 0x56, 0xbe, 0x72, 0xf7, 0xe9, 0xa1, 0x66, 0xb6, 0x4a, + 0x54, 0x5c, 0xf2, 0x81, 0xf7, 0xd0, 0x89, 0x28, 0x23, 0xcc, 0x21, 0x21, 0x5f, 0xf2, 0x1c, 0x9a, + 0xa2, 0x54, 0x90, 0xc9, 0x37, 0x60, 0x3a, 0xf9, 0x85, 0x8e, 0x07, 0x79, 0xb4, 0xe9, 0xe4, 0x8c, + 0xd0, 0x0b, 0xeb, 0x2f, 0x1c, 0x1f, 0x55, 0x2f, 0x2b, 0x5c, 0x6d, 0x86, 0xa5, 0xb0, 0x4e, 0x31, + 0x33, 0x7f, 0xcf, 0x00, 0x68, 0xad, 0x34, 0x65, 0x03, 0x5f, 0x81, 0x42, 0x7c, 0x1a, 0x54, 0xe6, + 0xb6, 0x71, 0xca, 0xf8, 0xc3, 0x72, 0xf2, 0x22, 0xe4, 0x93, 0x96, 0xcc, 0x1e, 0x1f, 0x55, 0xa7, + 0xf4, 0x16, 0xb0, 0x52, 0x72, 0x17, 0x26, 0x46, 0xaa, 0x33, 0xce, 0xce, 0x8c, 0xba, 0x4a, 0x6a, + 0x1c, 0x85, 0x0f, 0xb6, 0x5b, 0x9f, 0xdd, 0x51, 0xf8, 0x56, 0x0e, 0x66, 0x58, 0xbf, 0xd6, 0xfa, + 0xd1, 0x9e, 0x1f, 0x78, 0xd1, 0xe1, 0x33, 0x6b, 0x15, 0xbf, 0xa3, 0x29, 0x44, 0x97, 0xa5, 0xd8, + 0x52, 0xdb, 0x36, 0x92, 0x71, 0xfc, 0xe7, 0x13, 0x70, 0x36, 0x83, 0x8a, 0xbc, 0x2e, 0xbc, 0x6f, + 0x92, 0x33, 0x23, 0xf4, 0xae, 0xf9, 0xd1, 0x51, 0xb5, 0x2c, 0xd1, 0x5b, 0x89, 0xb7, 0xcd, 0x02, + 0x4c, 0x0a, 0xd3, 0x67, 0x2d, 0xd1, 0xa8, 0xd1, 0x6d, 0x43, 0x9e, 0x89, 0xa1, 0x68, 0x52, 0x91, + 0x48, 0x0d, 0xca, 0x8b, 0x7b, 0xb4, 0xbd, 0xef, 0x75, 0x77, 0xef, 0xd3, 0x43, 0xae, 0x2f, 0x95, + 0xeb, 0xcf, 0x33, 0x4b, 0xab, 0x2d, 0xe0, 0x6c, 0x48, 0x75, 0x23, 0x4e, 0x23, 0x21, 0xef, 0xc1, + 0x64, 0xd3, 0xdb, 0xed, 0x4a, 0x0e, 0x05, 0xe4, 0x70, 0xe5, 0xf8, 0xa8, 0x7a, 0x21, 0xe4, 0xe0, + 0x41, 0x06, 0x2a, 0x01, 0x79, 0x0d, 0xc6, 0x2c, 0xbf, 0x43, 0xf9, 0x36, 0x2c, 0xfc, 0x39, 0x02, + 0x06, 0x50, 0xcf, 0xa6, 0x11, 0x83, 0xdc, 0x83, 0x09, 0xf6, 0xcf, 0xaa, 0xd3, 0x9b, 0x1b, 0x47, + 0xb9, 0x4d, 0x62, 0x05, 0x1f, 0xa1, 0x3d, 0xaf, 0xbb, 0xab, 0xea, 0xf8, 0x1d, 0x6a, 0x1f, 0x38, + 0x3d, 0x6d, 0x5f, 0xe4, 0x88, 0x64, 0x0b, 0x26, 0x13, 0x41, 0x10, 0xce, 0x4d, 0x68, 0x77, 0x41, + 0x49, 0x49, 0xfd, 0x73, 0x82, 0xd9, 0xc5, 0xa8, 0x13, 0xe2, 0xdc, 0xee, 0x31, 0x7c, 0xbd, 0x31, + 0x0a, 0x23, 0xcd, 0x06, 0x29, 0x0e, 0xb7, 0x41, 0x8c, 0x53, 0x6d, 0x10, 0x17, 0x40, 0x74, 0x52, + 0xad, 0xb3, 0x2b, 0xdc, 0xaf, 0x5e, 0x1b, 0x3e, 0xc1, 0x6e, 0x24, 0xc8, 0xb8, 0x26, 0xf9, 0xc9, + 0x94, 0xe8, 0x7f, 0xa7, 0xb3, 0xab, 0x9d, 0x4c, 0xc5, 0xa8, 0xac, 0x1b, 0x12, 0x51, 0x23, 0x2d, + 0x70, 0xd9, 0x0d, 0x49, 0x49, 0xd2, 0x0d, 0x1f, 0x3d, 0x8a, 0x86, 0x75, 0x83, 0xc2, 0x88, 0xac, + 0x01, 0xd4, 0xda, 0x91, 0xf7, 0x90, 0xe2, 0x94, 0x98, 0xd4, 0x3a, 0x62, 0xb1, 0x76, 0x9f, 0x1e, + 0x36, 0x69, 0x14, 0x7b, 0x36, 0x9c, 0x77, 0x10, 0x35, 0x35, 0x4d, 0x2c, 0x85, 0x03, 0xe9, 0xc1, + 0xf9, 0x9a, 0xeb, 0x7a, 0xdc, 0x25, 0xaf, 0x15, 0xb0, 0xf9, 0xeb, 0x22, 0xeb, 0x72, 0x36, 0xeb, + 0xd7, 0x04, 0xeb, 0xcf, 0x39, 0x31, 0x95, 0x1d, 0x71, 0xb2, 0xf4, 0x67, 0xb2, 0x19, 0x9b, 0xeb, + 0x30, 0xad, 0x77, 0xa9, 0xee, 0x8c, 0x56, 0x86, 0xa2, 0xd5, 0xac, 0xd9, 0xcd, 0x7b, 0xb5, 0x9b, + 0x15, 0x83, 0x54, 0xa0, 0x2c, 0x7e, 0x2d, 0xd8, 0x0b, 0x6f, 0xde, 0xae, 0xe4, 0x34, 0xc8, 0x9b, + 0x37, 0x17, 0x2a, 0x79, 0xf3, 0x0f, 0x0d, 0x28, 0xca, 0xfa, 0x91, 0xdb, 0x90, 0x6f, 0x36, 0xef, + 0xa5, 0xae, 0x20, 0x93, 0xad, 0x97, 0x6f, 0x32, 0x61, 0xb8, 0xa7, 0x6e, 0x32, 0xcd, 0xe6, 0x3d, + 0x46, 0xd7, 0x5a, 0x69, 0x0a, 0xa5, 0x25, 0x63, 0xba, 0xce, 0x0e, 0xb9, 0x97, 0xb9, 0x0d, 0xf9, + 0x0f, 0xb6, 0x5b, 0xc2, 0x1a, 0xca, 0x18, 0x5f, 0xa4, 0xfb, 0xe8, 0x91, 0xba, 0xf5, 0x31, 0x02, + 0xd3, 0x82, 0x49, 0x65, 0x69, 0x71, 0x25, 0xe2, 0xc0, 0x8f, 0xdd, 0xb4, 0x84, 0x12, 0xc1, 0x20, + 0x96, 0x28, 0x61, 0x3a, 0xcf, 0x8a, 0xdf, 0x76, 0x3a, 0x42, 0x1b, 0x41, 0x9d, 0xa7, 0xc3, 0x00, + 0x16, 0x87, 0x9b, 0x7f, 0x64, 0x40, 0x65, 0x23, 0xf0, 0x1f, 0x7a, 0x4c, 0x02, 0xb7, 0xfc, 0x7d, + 0xda, 0xdd, 0xba, 0x49, 0xde, 0x90, 0x42, 0x80, 0xab, 0x70, 0x17, 0x19, 0x15, 0x0a, 0x81, 0x1f, + 0x1d, 0x55, 0xa1, 0x79, 0x18, 0x46, 0xf4, 0x80, 0x95, 0x4b, 0x41, 0xa0, 0x78, 0xbb, 0xe5, 0x46, + 0xf7, 0xa0, 0x39, 0xc5, 0xdb, 0xad, 0x0a, 0x63, 0x58, 0x1d, 0xc5, 0x89, 0x61, 0x2c, 0x62, 0x00, + 0x8b, 0xc3, 0x15, 0x81, 0xfd, 0x9d, 0xdc, 0x40, 0x1b, 0x16, 0x3e, 0x53, 0x5e, 0x28, 0x7a, 0xe3, + 0x46, 0xda, 0xc4, 0xbe, 0x0a, 0xe7, 0xd2, 0x5d, 0x82, 0xe7, 0x22, 0x35, 0x98, 0xd1, 0xe1, 0xf2, + 0x88, 0xe4, 0x62, 0xe6, 0xb7, 0xb6, 0x16, 0xac, 0x34, 0xbe, 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, + 0xd5, 0xef, 0x50, 0xa6, 0xd9, 0xd4, 0xb6, 0x9b, 0xe2, 0x42, 0x4a, 0xbd, 0x34, 0x72, 0x1e, 0x85, + 0xb6, 0xb8, 0xbd, 0xd2, 0xe4, 0x48, 0x8c, 0x2c, 0x48, 0xf9, 0xf5, 0x5b, 0x28, 0x66, 0x68, 0x4c, + 0xca, 0xef, 0xe9, 0xc2, 0x14, 0xa9, 0x40, 0x66, 0xe3, 0xc7, 0x7e, 0xf9, 0x1d, 0x79, 0x34, 0x8c, + 0xe3, 0x87, 0x74, 0xbe, 0x76, 0xcd, 0x21, 0xd1, 0xc8, 0x1b, 0x30, 0xce, 0x3e, 0x6d, 0xc9, 0x4b, + 0x0c, 0xb4, 0x2a, 0xb0, 0x8e, 0x81, 0x76, 0x1b, 0xc8, 0x91, 0xcc, 0x7f, 0x95, 0x4b, 0x77, 0xa0, + 0xd0, 0x02, 0x9e, 0x70, 0x6d, 0xbc, 0x0d, 0x63, 0xb5, 0x4e, 0xc7, 0x7f, 0x24, 0xa4, 0x84, 0x3c, + 0xa6, 0x89, 0xfb, 0x8f, 0xef, 0xb0, 0x0e, 0x43, 0xd1, 0x6e, 0x7f, 0x19, 0x80, 0x2c, 0x42, 0xa9, + 0xb6, 0xdd, 0x5c, 0x5e, 0x5e, 0x6a, 0xb5, 0x56, 0x84, 0x93, 0xf1, 0xcb, 0xb2, 0x7f, 0x3c, 0xcf, + 0xb5, 0xa3, 0xa8, 0x33, 0xc4, 0x07, 0x31, 0xa1, 0x23, 0xef, 0x02, 0x7c, 0xe0, 0x7b, 0xdd, 0x55, + 0x1a, 0xed, 0xf9, 0xae, 0x68, 0x3c, 0x53, 0x29, 0x26, 0x3f, 0xf2, 0xbd, 0xae, 0x7d, 0x80, 0x60, + 0x56, 0xf7, 0x04, 0xc9, 0x52, 0xfe, 0x67, 0x3d, 0x5d, 0xf7, 0x23, 0xd4, 0x61, 0xc6, 0x92, 0x9e, + 0xde, 0xf1, 0xa3, 0xf4, 0x1d, 0x8b, 0x44, 0x33, 0x7f, 0x35, 0x07, 0xd3, 0xdc, 0x52, 0xe5, 0x13, + 0xe6, 0x99, 0x5d, 0x8c, 0x6f, 0x6b, 0x8b, 0xf1, 0x92, 0xdc, 0x18, 0x94, 0xa6, 0x8d, 0xb4, 0x14, + 0xf7, 0x80, 0x0c, 0xd2, 0x10, 0x4b, 0x9e, 0xa7, 0x8c, 0xb2, 0x0a, 0x6f, 0x26, 0x77, 0xc7, 0x21, + 0x12, 0xd9, 0x28, 0x0a, 0x43, 0x4b, 0xe3, 0x61, 0xfe, 0x4a, 0x0e, 0xa6, 0x14, 0x7d, 0xf2, 0x99, + 0xed, 0xf8, 0x2f, 0x69, 0x1d, 0x2f, 0xef, 0x20, 0x94, 0x96, 0x8d, 0xd4, 0xef, 0x7d, 0x98, 0x1d, + 0x20, 0x49, 0xab, 0xe5, 0xc6, 0x28, 0x6a, 0xf9, 0xeb, 0x83, 0x97, 0xdb, 0xdc, 0x21, 0x39, 0xbe, + 0xdc, 0x56, 0x6f, 0xd3, 0xbf, 0x95, 0x83, 0x73, 0xe2, 0x57, 0xad, 0xef, 0x7a, 0xd1, 0xa2, 0xdf, + 0x7d, 0xe0, 0xed, 0x3e, 0xb3, 0x63, 0x51, 0xd3, 0xc6, 0xa2, 0xaa, 0x8f, 0x85, 0xd2, 0xc0, 0xe1, + 0x43, 0x62, 0xfe, 0x9b, 0x22, 0xcc, 0x0d, 0x23, 0x60, 0x66, 0xbf, 0x62, 0x55, 0xa1, 0xd9, 0x9f, + 0xb2, 0x58, 0xb9, 0x3d, 0x95, 0x38, 0x73, 0xe4, 0x46, 0x70, 0xe6, 0x58, 0x81, 0x0a, 0x7e, 0xaa, + 0x49, 0x43, 0xd6, 0x09, 0x61, 0xe2, 0x0d, 0x79, 0xf5, 0xf8, 0xa8, 0x7a, 0xc5, 0x61, 0x65, 0x76, + 0x28, 0x0a, 0xed, 0x7e, 0xe0, 0x29, 0x3c, 0x06, 0x28, 0xc9, 0xef, 0x19, 0x30, 0x8d, 0xc0, 0xc6, + 0x43, 0xda, 0x8d, 0x90, 0x59, 0x41, 0x5c, 0xd2, 0xc4, 0x41, 0x27, 0xcd, 0x28, 0xf0, 0xba, 0xbb, + 0x78, 0x90, 0x14, 0xd6, 0x77, 0x58, 0x2f, 0xfc, 0xd9, 0x51, 0xf5, 0x9d, 0x8f, 0x13, 0xc8, 0x22, + 0x58, 0x85, 0xcc, 0x90, 0xe7, 0x15, 0xa5, 0xf8, 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, 0x3f, 0x01, + 0x17, 0x1b, 0x5d, 0x67, 0xa7, 0x43, 0x17, 0xfd, 0x6e, 0xe4, 0x75, 0xfb, 0x7e, 0x3f, 0xac, 0x3b, + 0xed, 0xfd, 0x7e, 0x2f, 0x14, 0x87, 0x9d, 0xd8, 0xf2, 0x76, 0x5c, 0x68, 0xef, 0xf0, 0x52, 0x85, + 0xe5, 0x30, 0x06, 0xe4, 0x1e, 0xcc, 0xf2, 0xa2, 0x5a, 0x3f, 0xf2, 0x9b, 0x6d, 0xa7, 0xe3, 0x75, + 0x77, 0xf1, 0x0c, 0xb4, 0x58, 0xbf, 0xcc, 0x6c, 0x4b, 0xa7, 0x1f, 0xf9, 0x76, 0xc8, 0xe1, 0x0a, + 0xbf, 0x41, 0x22, 0xb2, 0x0c, 0x33, 0x16, 0x75, 0xdc, 0x55, 0xe7, 0xf1, 0xa2, 0xd3, 0x73, 0xda, + 0x5e, 0x74, 0x88, 0x96, 0x59, 0xbe, 0x5e, 0x3d, 0x3e, 0xaa, 0x3e, 0x17, 0x50, 0xc7, 0xb5, 0x0f, + 0x9c, 0xc7, 0x76, 0x5b, 0x14, 0x2a, 0xcc, 0xd2, 0x74, 0x31, 0x2b, 0xaf, 0x1b, 0xb3, 0x2a, 0xa5, + 0x59, 0x79, 0xdd, 0xe1, 0xac, 0x12, 0x3a, 0xc9, 0xaa, 0xe5, 0x04, 0xbb, 0x34, 0xe2, 0x87, 0x84, + 0x70, 0xd5, 0xb8, 0x66, 0x28, 0xac, 0x22, 0x2c, 0xb3, 0xf1, 0xc0, 0x30, 0xcd, 0x4a, 0xa1, 0x63, + 0x33, 0x6f, 0x3b, 0xf0, 0x22, 0xaa, 0xb6, 0x70, 0x12, 0xab, 0x85, 0xfd, 0x8f, 0xc7, 0xa4, 0xc3, + 0x9a, 0x38, 0x40, 0x99, 0x70, 0x53, 0x1a, 0x59, 0x1e, 0xe0, 0x96, 0xdd, 0xca, 0x01, 0xca, 0x98, + 0x9b, 0xda, 0xce, 0x29, 0x6c, 0xa7, 0xc2, 0x6d, 0x48, 0x43, 0x07, 0x28, 0xc9, 0x1a, 0xeb, 0xb4, + 0x88, 0x76, 0xd9, 0x8c, 0x16, 0x87, 0xa4, 0xd3, 0x58, 0xb5, 0x97, 0x84, 0x4d, 0x5d, 0x09, 0x64, + 0xb1, 0x9d, 0x71, 0x64, 0x9a, 0x26, 0xfe, 0xa0, 0x50, 0x1c, 0xab, 0x8c, 0x5b, 0x15, 0x3e, 0xe5, + 0x23, 0x36, 0x71, 0x50, 0x16, 0x9b, 0xbf, 0x95, 0x83, 0x4b, 0x52, 0x1c, 0xd3, 0xe8, 0x91, 0x1f, + 0xec, 0x7b, 0xdd, 0xdd, 0x67, 0x5c, 0xaa, 0xde, 0xd1, 0xa4, 0xea, 0x4b, 0xa9, 0x1d, 0x2e, 0xd5, + 0xca, 0x13, 0x44, 0xeb, 0x9f, 0x8e, 0xc1, 0xf3, 0x27, 0x52, 0x91, 0x0f, 0xd9, 0x2e, 0xe8, 0xd1, + 0x6e, 0xb4, 0xec, 0x76, 0x28, 0x33, 0xc3, 0xfc, 0x7e, 0x24, 0x0e, 0xb3, 0x5f, 0x3c, 0x3e, 0xaa, + 0x9e, 0xe5, 0xb1, 0x18, 0xb6, 0xe7, 0x76, 0xa8, 0x1d, 0xf1, 0x62, 0x6d, 0x98, 0x06, 0xa9, 0x19, + 0xcb, 0x38, 0x32, 0x6c, 0xb9, 0x1b, 0xd1, 0xe0, 0xa1, 0xc3, 0x5d, 0xd2, 0x05, 0xcb, 0x7d, 0x4a, + 0x7b, 0xb6, 0xc3, 0x4a, 0x6d, 0x4f, 0x14, 0xeb, 0x2c, 0x07, 0xa8, 0xc9, 0x1d, 0x85, 0xe5, 0x22, + 0x33, 0x0e, 0x56, 0x9d, 0xc7, 0x42, 0xe3, 0xc5, 0xf3, 0x55, 0x85, 0x25, 0xf7, 0x87, 0x3b, 0x70, + 0x1e, 0x5b, 0x83, 0x24, 0xe4, 0x1b, 0x70, 0x5e, 0x08, 0x6e, 0x26, 0xc4, 0x02, 0xbf, 0x23, 0x5b, + 0x5c, 0x40, 0x5e, 0xaf, 0x1e, 0x1f, 0x55, 0x2f, 0x0a, 0xb1, 0x6f, 0xb7, 0x39, 0x46, 0x66, 0xab, + 0xb3, 0xb9, 0x90, 0x16, 0xdb, 0xc8, 0x52, 0xdd, 0xb1, 0x4a, 0xc3, 0xd0, 0xd9, 0x95, 0xda, 0x31, + 0xbf, 0x51, 0x52, 0x3a, 0xd3, 0x3e, 0xe0, 0xe5, 0xd6, 0x50, 0x4a, 0x72, 0x0f, 0xa6, 0xb7, 0xe9, + 0x8e, 0x3a, 0x3e, 0xe3, 0xf1, 0x12, 0xaf, 0x3c, 0xa2, 0x3b, 0xc3, 0x07, 0x27, 0x45, 0x47, 0x3c, + 0x98, 0xdd, 0x08, 0xfc, 0xc7, 0x87, 0xcc, 0xd4, 0xa3, 0x5d, 0x1a, 0xa0, 0x23, 0xd6, 0x04, 0x1e, + 0x57, 0xcd, 0x25, 0x9a, 0xa5, 0x5e, 0x5e, 0xff, 0xdc, 0xf1, 0x51, 0xf5, 0xf9, 0x1e, 0x03, 0xdb, + 0x1d, 0x01, 0xb7, 0x53, 0x81, 0x59, 0x83, 0x5c, 0xc9, 0x4f, 0xc1, 0x8c, 0xe5, 0xf7, 0x23, 0xaf, + 0xbb, 0xdb, 0x8c, 0x02, 0x27, 0xa2, 0xbb, 0x5c, 0x90, 0x27, 0x1e, 0x5f, 0xa9, 0x52, 0x7e, 0x30, + 0x1d, 0x70, 0xa0, 0x1d, 0x0a, 0xa8, 0x26, 0x49, 0x75, 0x02, 0xf3, 0x37, 0x72, 0x30, 0x27, 0x86, + 0xc1, 0xa2, 0x6d, 0x3f, 0x70, 0x9f, 0xfd, 0x65, 0xdf, 0xd0, 0x96, 0xfd, 0x8b, 0xb1, 0x8f, 0x52, + 0x56, 0x23, 0x4f, 0x58, 0xf5, 0xff, 0xcc, 0x80, 0x2b, 0x27, 0x11, 0xb1, 0xde, 0x89, 0x7d, 0xf0, + 0x4a, 0x03, 0xbe, 0x76, 0x3d, 0x38, 0x8b, 0xe3, 0x89, 0x07, 0xc7, 0xe1, 0x3d, 0x3f, 0x8c, 0xf0, + 0xf4, 0x2e, 0xa7, 0x39, 0x12, 0xd4, 0x7d, 0xbf, 0x83, 0x72, 0xbe, 0xfe, 0x3a, 0x13, 0xe7, 0x7f, + 0x76, 0x54, 0x05, 0x06, 0x5a, 0xc7, 0xcb, 0x48, 0xb6, 0xe7, 0xf3, 0x19, 0x83, 0xe7, 0xd2, 0xa1, + 0x8d, 0xde, 0x1f, 0xfb, 0xf4, 0x30, 0xb4, 0xb2, 0x58, 0xe3, 0x09, 0x4d, 0xad, 0x1f, 0xed, 0x6d, + 0x04, 0xf4, 0x01, 0x0d, 0x68, 0xb7, 0x4d, 0x3f, 0x63, 0x27, 0x34, 0x7a, 0xe3, 0x46, 0x32, 0x4f, + 0xfe, 0xdf, 0x38, 0x9c, 0xcb, 0x22, 0x63, 0xfd, 0xa2, 0x68, 0xc4, 0xe9, 0x28, 0xde, 0xbf, 0x65, + 0x40, 0xb9, 0x49, 0xdb, 0x7e, 0xd7, 0xbd, 0xe3, 0xb4, 0x23, 0x5f, 0xba, 0x64, 0xd8, 0x5c, 0xb2, + 0x31, 0xb8, 0xfd, 0x00, 0x0b, 0xb4, 0x93, 0x81, 0x2f, 0x8f, 0xa6, 0x88, 0xb6, 0x7d, 0x74, 0x5a, + 0x8d, 0xd8, 0x9c, 0x4c, 0x3e, 0x81, 0xb7, 0x1a, 0xda, 0x47, 0x49, 0x1d, 0xa6, 0x16, 0xfd, 0x6e, + 0x97, 0xb2, 0x1f, 0x8a, 0x0b, 0xe6, 0x95, 0xe3, 0xa3, 0xea, 0x5c, 0x5b, 0x16, 0xa4, 0x4f, 0x08, + 0x74, 0x12, 0x72, 0x0b, 0xf2, 0x9b, 0x0b, 0x77, 0xc4, 0x18, 0x48, 0x67, 0xb5, 0xcd, 0x85, 0x3b, + 0x68, 0xeb, 0x32, 0xfd, 0x61, 0xaa, 0xbf, 0xf0, 0x40, 0x3d, 0x03, 0xdd, 0x5c, 0xb8, 0x43, 0xd6, + 0x61, 0xd6, 0xa2, 0x3f, 0xdd, 0xf7, 0x02, 0x2a, 0x16, 0xc0, 0xea, 0x9d, 0x1a, 0x8e, 0x45, 0x91, + 0xcb, 0xb1, 0x80, 0x17, 0x4a, 0xdd, 0xde, 0x3e, 0x78, 0xa0, 0x46, 0xae, 0x0d, 0xd2, 0x92, 0x9f, + 0x87, 0xf3, 0x4b, 0x5e, 0x28, 0xea, 0xcc, 0x0f, 0x1f, 0x5d, 0xbc, 0x87, 0x1c, 0x1f, 0xb2, 0x1c, + 0x7e, 0x2c, 0x73, 0x39, 0x7c, 0xce, 0x8d, 0x99, 0xd8, 0xfc, 0x64, 0xd3, 0x4d, 0xfb, 0xae, 0x66, + 0x7f, 0x87, 0x7c, 0x04, 0xd3, 0x78, 0xda, 0x83, 0xe7, 0xb1, 0xe8, 0xce, 0x3c, 0x31, 0xe4, 0xcb, + 0x5f, 0xc8, 0xfc, 0xf2, 0x65, 0x3c, 0x3c, 0xb2, 0xf1, 0x54, 0x17, 0x5d, 0x9f, 0x35, 0x1b, 0x41, + 0xe3, 0x4c, 0x3e, 0x80, 0x19, 0xb1, 0xe9, 0xac, 0x3f, 0x68, 0xed, 0xd1, 0x25, 0xe7, 0x50, 0x38, + 0x21, 0xa0, 0xfe, 0x27, 0x76, 0x2a, 0xdb, 0x7f, 0x60, 0x47, 0x7b, 0xd4, 0x76, 0x1d, 0x4d, 0x3c, + 0xa7, 0x08, 0xc9, 0xcf, 0xc2, 0xe4, 0x8a, 0x8f, 0x17, 0x4f, 0x28, 0x6a, 0x4a, 0xc8, 0xe7, 0xab, + 0x18, 0xb9, 0xca, 0xc1, 0xa9, 0x4d, 0xe4, 0x47, 0x47, 0xd5, 0xb7, 0x9f, 0x74, 0x16, 0x2a, 0x1f, + 0xb0, 0xd4, 0xaf, 0x91, 0x45, 0x28, 0x6e, 0xd3, 0x1d, 0xd6, 0xda, 0x74, 0xd4, 0x95, 0x04, 0x73, + 0x79, 0xf1, 0x48, 0xfc, 0x52, 0x6f, 0x75, 0x24, 0x86, 0xf9, 0xaf, 0x0d, 0x9c, 0x81, 0xe4, 0x3a, + 0x3a, 0x82, 0xc5, 0xde, 0xe0, 0x68, 0x59, 0x3a, 0xbd, 0x9e, 0xee, 0xcf, 0xcd, 0x51, 0x98, 0x19, + 0x7a, 0xc7, 0x69, 0xd3, 0x48, 0x9e, 0x57, 0x22, 0xf2, 0x03, 0x84, 0xa8, 0x66, 0x28, 0xc7, 0x21, + 0x5f, 0x81, 0x73, 0x4b, 0xf4, 0xa1, 0xd7, 0xa6, 0xb5, 0x28, 0xa2, 0x21, 0x6f, 0xed, 0x62, 0x8d, + 0x5f, 0xec, 0x95, 0xea, 0x2f, 0x1d, 0x1f, 0x55, 0xaf, 0xba, 0x58, 0x6e, 0x3b, 0x09, 0x82, 0xdd, + 0x76, 0x54, 0x5e, 0x99, 0x1c, 0xcc, 0xff, 0x65, 0x24, 0x3d, 0x40, 0x5e, 0x85, 0x82, 0xb5, 0x11, + 0xd7, 0x9f, 0xdf, 0xd9, 0xa5, 0xaa, 0x8f, 0x08, 0xe4, 0x6b, 0x70, 0x5e, 0xe1, 0x83, 0x93, 0x83, + 0xba, 0xac, 0x42, 0xbc, 0x31, 0x2f, 0xe3, 0x25, 0x8d, 0x52, 0x13, 0x87, 0x63, 0xa4, 0x6a, 0x94, + 0xcd, 0x83, 0x35, 0x56, 0x29, 0x58, 0xa2, 0x5d, 0x8f, 0xf3, 0x56, 0x1a, 0xab, 0xf2, 0x76, 0x11, + 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0x1f, 0x14, 0x8a, 0x85, 0xca, 0x98, 0xf9, 0x97, 0x86, 0x92, 0x02, + 0xe0, 0x19, 0xdd, 0x3d, 0x6e, 0x6b, 0xbb, 0xc7, 0x39, 0x41, 0x1a, 0xb7, 0x8a, 0x95, 0x65, 0xee, + 0xf8, 0x33, 0x30, 0xa5, 0x21, 0xa1, 0xcb, 0xeb, 0x66, 0x48, 0x03, 0x7e, 0x3e, 0xf8, 0xd9, 0x72, + 0x79, 0x8d, 0xdb, 0x35, 0x92, 0x27, 0xe3, 0x9f, 0x1b, 0x30, 0x93, 0xa2, 0x60, 0xbd, 0xc1, 0x40, + 0x6a, 0x6f, 0xf4, 0x43, 0x1a, 0x58, 0x08, 0xe5, 0x0e, 0x72, 0x2b, 0xba, 0x83, 0x5c, 0xc7, 0x62, + 0x30, 0xf2, 0x65, 0x18, 0xdb, 0x44, 0x6d, 0x5e, 0xf7, 0xb1, 0x88, 0xf9, 0x63, 0x21, 0x5f, 0x61, + 0x7d, 0xf6, 0xaf, 0x2a, 0x20, 0xb0, 0x8c, 0x34, 0x61, 0x62, 0x31, 0xa0, 0x18, 0xec, 0x5f, 0x18, + 0xfd, 0x32, 0xac, 0xcd, 0x49, 0xd2, 0x97, 0x61, 0x82, 0x93, 0xf9, 0xeb, 0x39, 0x20, 0x49, 0x1b, + 0x69, 0x3b, 0xa0, 0x51, 0xf8, 0xcc, 0x0e, 0xfa, 0xfb, 0xda, 0xa0, 0x3f, 0x3f, 0x30, 0xe8, 0xbc, + 0x79, 0x23, 0x8d, 0xfd, 0x1f, 0x19, 0x70, 0x21, 0x9b, 0x90, 0xbc, 0x08, 0xe3, 0xeb, 0xad, 0x0d, + 0xe9, 0xa6, 0x23, 0x9a, 0xe2, 0xf7, 0x50, 0x4b, 0xb5, 0x44, 0x11, 0x79, 0x03, 0xc6, 0x3f, 0xb4, + 0x16, 0xd9, 0xf6, 0xa5, 0x44, 0x9d, 0xfc, 0x74, 0x60, 0xb7, 0x75, 0xf3, 0x47, 0x20, 0xa9, 0x63, + 0x9b, 0x7f, 0x6a, 0x63, 0xfb, 0xad, 0x1c, 0xcc, 0xd4, 0xda, 0x6d, 0x1a, 0x86, 0x4c, 0x39, 0xa1, + 0x61, 0xf4, 0xcc, 0x0e, 0x6c, 0xb6, 0x03, 0x8e, 0xd6, 0xb6, 0x91, 0x46, 0xf5, 0x8f, 0x0d, 0x38, + 0x2f, 0xa9, 0x1e, 0x7a, 0xf4, 0x51, 0x6b, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x71, 0x47, 0x8d, 0x9f, + 0xc2, 0x5d, 0xda, 0xeb, 0x44, 0x34, 0x50, 0x0f, 0x8b, 0x1f, 0x20, 0x44, 0xdb, 0xa5, 0x11, 0x42, + 0xe6, 0x61, 0xa2, 0xd6, 0xeb, 0x05, 0xfe, 0x43, 0xbe, 0xec, 0xa7, 0xc4, 0xdd, 0x20, 0x07, 0x69, + 0x77, 0x89, 0x1c, 0xc4, 0xaa, 0xb1, 0x44, 0xbb, 0xdc, 0xbb, 0x78, 0x8a, 0x57, 0xc3, 0xa5, 0x5d, + 0x55, 0x5b, 0xc2, 0x72, 0xf3, 0x9b, 0x05, 0x28, 0xab, 0x0d, 0x21, 0x26, 0x8c, 0x73, 0x57, 0x11, + 0xf5, 0xca, 0xde, 0x41, 0x88, 0x25, 0x4a, 0x12, 0x0f, 0x9c, 0xdc, 0xa9, 0x1e, 0x38, 0xdb, 0x30, + 0xb5, 0x11, 0xf8, 0x3d, 0x3f, 0xa4, 0x2e, 0xcf, 0xd7, 0xc2, 0xa5, 0xd6, 0xd9, 0xd8, 0x2d, 0x95, + 0xf7, 0x39, 0x2b, 0xe2, 0xaa, 0x79, 0x4f, 0x60, 0xdb, 0xe9, 0x6c, 0x2e, 0x3a, 0x1f, 0x7e, 0xd8, + 0xee, 0x84, 0xc2, 0x75, 0x3f, 0x3e, 0x6c, 0x67, 0x10, 0xfd, 0xb0, 0x9d, 0x41, 0xd4, 0x65, 0x31, + 0xf6, 0xb4, 0x96, 0x05, 0xf9, 0x75, 0x03, 0x26, 0x6b, 0xdd, 0xae, 0xf0, 0xc0, 0x91, 0x41, 0xcf, + 0xe7, 0x93, 0x03, 0x77, 0xee, 0xa2, 0xc9, 0xcf, 0xdb, 0xbf, 0x2e, 0xce, 0xdb, 0xdf, 0xfe, 0x58, + 0xe7, 0xed, 0xad, 0xc0, 0xf1, 0xa2, 0x10, 0x2f, 0x56, 0x93, 0x0f, 0xaa, 0x6e, 0xb8, 0x4a, 0x3d, + 0xc8, 0xdb, 0x50, 0x89, 0xe7, 0xe3, 0x72, 0xd7, 0xa5, 0x8f, 0x29, 0x77, 0x58, 0x9a, 0xe2, 0x91, + 0x79, 0xda, 0x45, 0x42, 0x1a, 0xd1, 0xfc, 0x96, 0x01, 0x17, 0xd4, 0x09, 0xd1, 0xec, 0xef, 0x1c, + 0x78, 0x68, 0x8a, 0x90, 0x1b, 0x50, 0x12, 0xe3, 0x15, 0x2b, 0x72, 0x83, 0x49, 0x7e, 0x12, 0x14, + 0xd2, 0x60, 0x43, 0xc4, 0x78, 0x08, 0xbb, 0xfd, 0x6c, 0x6a, 0xb9, 0xb1, 0xa2, 0xfa, 0x9c, 0xe8, + 0xec, 0x4a, 0x80, 0xbf, 0xf5, 0xb1, 0x63, 0x10, 0xf3, 0x3d, 0x98, 0xd5, 0x6b, 0xd9, 0xa4, 0x18, + 0x0e, 0x26, 0x9b, 0x66, 0x64, 0x37, 0x4d, 0x96, 0x9b, 0xdb, 0x40, 0x06, 0xe8, 0x43, 0xbc, 0x34, + 0xa2, 0x91, 0xbc, 0xd4, 0x94, 0x47, 0x4f, 0x03, 0x88, 0x71, 0xba, 0xab, 0x49, 0xb5, 0xbb, 0x91, + 0xd4, 0xfc, 0xab, 0x12, 0x9c, 0xcd, 0x10, 0x1d, 0xa7, 0x6c, 0xed, 0x55, 0x7d, 0xf1, 0x94, 0xe2, + 0xdb, 0x79, 0xb9, 0x64, 0xde, 0x93, 0xa9, 0x8d, 0x4e, 0x58, 0x2a, 0x27, 0xe5, 0x3b, 0xfa, 0x34, + 0xb6, 0x77, 0xd5, 0x81, 0x66, 0xec, 0xa9, 0x39, 0xd0, 0xd4, 0x61, 0x4a, 0xb4, 0x4a, 0x2c, 0xe5, + 0xf1, 0xc4, 0x44, 0x0f, 0x78, 0x81, 0x3d, 0xb0, 0xa4, 0x75, 0x12, 0xce, 0x23, 0xf4, 0x3b, 0x0f, + 0xa9, 0xe0, 0x31, 0xa1, 0xf2, 0xc0, 0x82, 0x4c, 0x1e, 0x0a, 0x09, 0xf9, 0xa7, 0x06, 0x10, 0x01, + 0x51, 0xd7, 0x73, 0xf1, 0xa4, 0xf5, 0xec, 0x3e, 0x9d, 0xf5, 0xfc, 0xbc, 0xac, 0x63, 0xf6, 0xba, + 0xce, 0xa8, 0x16, 0xf9, 0xc7, 0x06, 0xcc, 0x72, 0x2f, 0x0e, 0xb5, 0xb2, 0xa5, 0x93, 0x2a, 0xdb, + 0x7e, 0x3a, 0x95, 0xbd, 0x12, 0xe2, 0x67, 0x87, 0xd4, 0x75, 0xb0, 0x52, 0xe4, 0x27, 0x00, 0xe2, + 0x15, 0x25, 0xbd, 0x05, 0xaf, 0x64, 0x48, 0x81, 0x18, 0x29, 0x09, 0x78, 0x8c, 0x62, 0x3a, 0xd5, + 0xbf, 0x26, 0xe1, 0x46, 0x7e, 0x1e, 0xce, 0xb1, 0xf5, 0x12, 0x43, 0x84, 0xcf, 0xd9, 0xdc, 0x24, + 0x7e, 0xe5, 0x8b, 0xc3, 0xb7, 0xf6, 0x1b, 0x59, 0x64, 0x3c, 0x66, 0x23, 0x09, 0x7f, 0x8f, 0x0e, + 0x54, 0x93, 0x2f, 0x8b, 0x02, 0x9d, 0x4b, 0xb1, 0xf6, 0xe1, 0x5c, 0x19, 0xbf, 0x99, 0x29, 0xdf, + 0x2e, 0xc9, 0xb5, 0xc0, 0xe5, 0x5b, 0xa8, 0x07, 0x5d, 0x20, 0x88, 0x7c, 0x08, 0xa4, 0xd9, 0xdf, + 0xdd, 0xa5, 0x61, 0x44, 0x5d, 0x0e, 0xa3, 0x41, 0x38, 0x37, 0x85, 0xf2, 0x01, 0x8f, 0x8c, 0x42, + 0x59, 0x6a, 0x07, 0xb2, 0x58, 0x9d, 0x24, 0x83, 0xc4, 0x97, 0x77, 0xe0, 0xd2, 0xd0, 0x66, 0x66, + 0x04, 0x54, 0xcc, 0xeb, 0x01, 0x15, 0x97, 0x86, 0x89, 0xc3, 0x50, 0x0d, 0xaa, 0xf8, 0x1d, 0x23, + 0x25, 0xff, 0x84, 0xb2, 0xc2, 0xb3, 0xc0, 0x0d, 0xdb, 0x20, 0x72, 0x18, 0x18, 0xcf, 0x25, 0x64, + 0x2e, 0x51, 0x92, 0x98, 0x84, 0x54, 0x25, 0x2c, 0xca, 0xca, 0x4f, 0x28, 0x0a, 0xcd, 0x7f, 0x61, + 0x00, 0xe1, 0x35, 0x5c, 0x74, 0x7a, 0xce, 0x8e, 0xd7, 0xf1, 0x22, 0x8f, 0x86, 0xe4, 0x3e, 0x54, + 0x04, 0x0b, 0x67, 0xa7, 0x43, 0x55, 0x5f, 0x29, 0x71, 0x99, 0x1a, 0x97, 0xd9, 0x69, 0xb5, 0x66, + 0x80, 0x70, 0xc8, 0xe0, 0xe5, 0x3e, 0xc1, 0xe0, 0x99, 0x3f, 0x34, 0xe0, 0xd2, 0x60, 0xb5, 0xc5, + 0x97, 0xe3, 0xce, 0x33, 0x4e, 0xe9, 0xbc, 0xac, 0x56, 0xe6, 0xf0, 0x18, 0xf2, 0xa9, 0xb5, 0x32, + 0x9f, 0x9c, 0x6a, 0x3e, 0x79, 0x2b, 0x7f, 0x39, 0x07, 0xe5, 0x8d, 0x4e, 0x7f, 0xd7, 0xeb, 0x2e, + 0x39, 0x91, 0xf3, 0xcc, 0x9a, 0x14, 0x6f, 0x69, 0x26, 0x45, 0xec, 0x1d, 0x15, 0x37, 0x6c, 0xb4, + 0x8c, 0x5c, 0x06, 0xcc, 0x24, 0x24, 0x7c, 0x95, 0xde, 0x83, 0x02, 0xfb, 0x21, 0x34, 0x94, 0xab, + 0x03, 0x8c, 0x11, 0xeb, 0x46, 0xfc, 0x9f, 0x50, 0xf2, 0xf5, 0x3c, 0x68, 0xc8, 0xe1, 0xf2, 0x8f, + 0xf1, 0x34, 0x46, 0x4f, 0x9e, 0x72, 0xf1, 0x9f, 0x1b, 0x50, 0x49, 0xb7, 0x84, 0xdc, 0x87, 0x09, + 0xc6, 0xc9, 0x8b, 0x53, 0x22, 0xbd, 0x34, 0xa4, 0xcd, 0x37, 0x04, 0x1a, 0xaf, 0x1e, 0x76, 0x3e, + 0xe5, 0x10, 0x4b, 0x72, 0xb8, 0x6c, 0x41, 0x59, 0xc5, 0xca, 0xa8, 0xdd, 0xeb, 0xba, 0x68, 0xba, + 0x90, 0xdd, 0x0f, 0x6a, 0xad, 0x7f, 0x5b, 0xab, 0xb5, 0x10, 0x4a, 0xa3, 0xe6, 0xb6, 0xc3, 0xf0, + 0x30, 0x9e, 0xc1, 0x43, 0x9d, 0x67, 0x32, 0xd9, 0x87, 0x1e, 0x1e, 0xc6, 0x61, 0xcc, 0x16, 0xe1, + 0xdf, 0x13, 0xf3, 0x0c, 0x6d, 0x91, 0x1e, 0x42, 0x54, 0x7d, 0x96, 0xe3, 0x98, 0x7f, 0x3f, 0x0f, + 0x17, 0x92, 0xea, 0xf1, 0x4c, 0x7f, 0x1b, 0x4e, 0xe0, 0x1c, 0x84, 0xa7, 0xac, 0x80, 0x6b, 0x03, + 0x55, 0xc3, 0xf0, 0x67, 0x59, 0x35, 0xa5, 0x42, 0x66, 0xaa, 0x42, 0x68, 0xc4, 0xf1, 0x0a, 0xc9, + 0x6a, 0x90, 0xfb, 0x90, 0x6f, 0xd2, 0x48, 0x04, 0x49, 0xbe, 0x32, 0xd0, 0xab, 0x6a, 0xbd, 0x6e, + 0x34, 0x69, 0xc4, 0x07, 0x91, 0xfb, 0x99, 0x53, 0xcd, 0xef, 0x9b, 0xa9, 0xe3, 0xdb, 0x30, 0xde, + 0x78, 0xdc, 0xa3, 0xed, 0x48, 0xc4, 0x46, 0xbe, 0x76, 0x32, 0x3f, 0x8e, 0xab, 0x44, 0x60, 0x52, + 0x04, 0xa8, 0x9d, 0xc5, 0x51, 0x2e, 0xdf, 0x86, 0xa2, 0xfc, 0xf8, 0x13, 0x45, 0x12, 0xbe, 0x05, + 0x93, 0xca, 0x47, 0x9e, 0x68, 0xd2, 0xff, 0x95, 0x01, 0xe3, 0x4c, 0xe8, 0x6d, 0xbd, 0xf9, 0x8c, + 0x4a, 0xa4, 0x5b, 0x9a, 0x44, 0x9a, 0x55, 0x42, 0x5e, 0x70, 0x5d, 0xbe, 0x79, 0x8a, 0x2c, 0x3a, + 0x32, 0x00, 0x12, 0x64, 0x72, 0x17, 0x26, 0xf8, 0x45, 0x8e, 0x4c, 0xa3, 0xa9, 0xc6, 0xd0, 0x88, + 0x92, 0x44, 0xcb, 0xf1, 0x7b, 0x69, 0xb5, 0x50, 0x52, 0x93, 0xa5, 0xc4, 0xcf, 0x58, 0x0d, 0xda, + 0x64, 0x6c, 0x16, 0xfd, 0x2e, 0x8f, 0xa9, 0x08, 0x95, 0x74, 0x53, 0xd9, 0x0e, 0xc7, 0x35, 0x71, + 0xb0, 0x91, 0x3f, 0x89, 0xc9, 0x05, 0xc1, 0x24, 0xfb, 0xcc, 0xe3, 0xdb, 0x93, 0x3c, 0x4a, 0x41, + 0x56, 0xec, 0x5d, 0x28, 0xdf, 0xf1, 0x83, 0x47, 0x4e, 0xe0, 0xd6, 0x76, 0xa9, 0xf0, 0x10, 0x2f, + 0xa2, 0x9b, 0xf7, 0xd4, 0x03, 0x0e, 0xb7, 0x1d, 0x56, 0xf0, 0xa3, 0xa3, 0x6a, 0xa1, 0xee, 0xfb, + 0x1d, 0x4b, 0x43, 0x27, 0xeb, 0x30, 0xb5, 0xea, 0x3c, 0x16, 0xf7, 0x75, 0xad, 0xd6, 0x8a, 0xf0, + 0x33, 0x79, 0xed, 0xf8, 0xa8, 0x7a, 0xe9, 0xc0, 0x79, 0x1c, 0xdf, 0xf3, 0x0d, 0x77, 0x85, 0xd6, + 0xe9, 0x89, 0x07, 0xd3, 0x1b, 0x7e, 0x10, 0x89, 0x8f, 0x30, 0x9d, 0x36, 0x3f, 0xe4, 0xba, 0x6d, + 0x3e, 0xf3, 0xba, 0xed, 0x12, 0x53, 0xe4, 0xed, 0x07, 0x31, 0xb9, 0x16, 0x5a, 0xa7, 0x31, 0x26, + 0xef, 0xc2, 0xec, 0x22, 0x0d, 0x22, 0xef, 0x81, 0xd7, 0x76, 0x22, 0x7a, 0xc7, 0x0f, 0x0e, 0x9c, + 0x48, 0x1c, 0xa8, 0xa0, 0x41, 0xdd, 0xa6, 0x9c, 0xd3, 0x81, 0x13, 0x59, 0x83, 0x98, 0xe4, 0x6b, + 0x59, 0x9e, 0x3b, 0x63, 0xd8, 0xfc, 0x37, 0x98, 0x52, 0x90, 0xe1, 0xb9, 0x33, 0xa4, 0x0b, 0x32, + 0x7c, 0x78, 0x76, 0x4f, 0xba, 0xf6, 0x2c, 0xd6, 0x6f, 0x8a, 0x2b, 0xd8, 0xd3, 0xaf, 0x35, 0xe3, + 0x71, 0x1b, 0x72, 0xbd, 0xb9, 0x00, 0xf9, 0xfa, 0xc6, 0x1d, 0x3c, 0x22, 0x11, 0xd7, 0x8c, 0xb4, + 0xbb, 0xe7, 0x74, 0xdb, 0xa8, 0xcb, 0x08, 0xdf, 0x05, 0x55, 0xe0, 0xd5, 0x37, 0xee, 0x10, 0x07, + 0xce, 0x6e, 0xd0, 0xe0, 0xc0, 0x8b, 0xbe, 0x72, 0xf3, 0xa6, 0x32, 0x50, 0x45, 0xac, 0xda, 0xbc, + 0xa8, 0x5a, 0xb5, 0x87, 0x28, 0xf6, 0xe3, 0x9b, 0x37, 0x33, 0x87, 0x23, 0xae, 0x58, 0x16, 0x2f, + 0xd2, 0x80, 0xe9, 0x55, 0xe7, 0xb1, 0xb8, 0x90, 0x8e, 0x6d, 0xbc, 0x3c, 0x7a, 0xc6, 0xe3, 0xc4, + 0x6a, 0x27, 0x45, 0xea, 0x10, 0xeb, 0x44, 0xe4, 0x1d, 0x98, 0x4c, 0xa6, 0x57, 0x88, 0x57, 0x91, + 0x79, 0xee, 0x12, 0xa9, 0x4c, 0x4e, 0xed, 0x2c, 0x49, 0x41, 0x27, 0x9b, 0xb1, 0x89, 0xce, 0x15, + 0x52, 0x74, 0x14, 0x2c, 0xd5, 0xe7, 0x55, 0x13, 0xdd, 0xc1, 0x12, 0xad, 0x59, 0x33, 0xb1, 0x8a, + 0xce, 0x3d, 0x65, 0x2c, 0x9d, 0x8b, 0x62, 0xf9, 0x6f, 0x04, 0xfe, 0x41, 0x2f, 0x42, 0x8f, 0xc1, + 0x94, 0xe5, 0xdf, 0xc3, 0x92, 0x0c, 0xcb, 0x9f, 0x93, 0x64, 0xdf, 0xb3, 0x4f, 0x7d, 0x82, 0x7b, + 0x76, 0x0a, 0x85, 0x15, 0xbf, 0xbd, 0x8f, 0x2e, 0x82, 0xa5, 0xfa, 0x87, 0x4c, 0x7e, 0x74, 0xfc, + 0xf6, 0xfe, 0xd3, 0xbb, 0x1f, 0x46, 0xf6, 0x64, 0x8d, 0xb5, 0x9d, 0x4d, 0x2b, 0xf1, 0xe9, 0xb9, + 0x19, 0xed, 0xa6, 0x4d, 0x2b, 0xe3, 0x8a, 0x0a, 0x9f, 0x85, 0xb2, 0x21, 0x96, 0x4e, 0x4e, 0x28, + 0x54, 0x96, 0x68, 0xb8, 0x1f, 0xf9, 0xbd, 0xc5, 0x8e, 0xd7, 0xdb, 0xf1, 0x9d, 0xc0, 0x9d, 0xab, + 0x0c, 0x11, 0x18, 0xaf, 0x66, 0x0a, 0x8c, 0x59, 0x97, 0xd3, 0xdb, 0x6d, 0xc9, 0xc0, 0x1a, 0x60, + 0x49, 0xbe, 0x06, 0xd3, 0x6c, 0xb5, 0x34, 0x1e, 0x47, 0xb4, 0xcb, 0xa7, 0xd2, 0x2c, 0x6e, 0xf5, + 0xe7, 0x94, 0x20, 0xc3, 0xb8, 0x90, 0x4f, 0x52, 0x94, 0x1e, 0x34, 0x26, 0x50, 0x27, 0xa9, 0xce, + 0xca, 0xfc, 0x89, 0x54, 0x9f, 0x90, 0x65, 0x98, 0x10, 0x35, 0x10, 0xbb, 0xce, 0x60, 0x5b, 0x9e, + 0xcf, 0x6c, 0xcb, 0x84, 0x68, 0x8b, 0x25, 0xe9, 0xcd, 0x7f, 0x6b, 0xc0, 0x94, 0xf6, 0x39, 0x72, + 0x5b, 0x71, 0x5f, 0x49, 0xdc, 0xce, 0x34, 0x9c, 0xcc, 0xf4, 0xf4, 0xb7, 0x85, 0xcf, 0x52, 0x6e, + 0x38, 0x5d, 0x66, 0xe6, 0x30, 0x19, 0xf4, 0x9f, 0x3f, 0x39, 0xe8, 0xbf, 0x30, 0x24, 0xe8, 0xff, + 0xdb, 0x53, 0x30, 0xad, 0x6f, 0x70, 0x4c, 0xe3, 0x5c, 0xf1, 0x77, 0xbd, 0xae, 0xb4, 0x5b, 0x79, + 0x1a, 0x0b, 0x84, 0x68, 0xb9, 0xde, 0x11, 0x42, 0x5e, 0x06, 0x88, 0xaf, 0x66, 0xa5, 0x69, 0x2a, + 0x32, 0xd3, 0x2b, 0x05, 0xe4, 0x27, 0x01, 0xd6, 0x7c, 0x97, 0xc6, 0x99, 0x50, 0x4e, 0x38, 0x50, + 0x7a, 0x55, 0x1c, 0x28, 0x89, 0x6c, 0xf2, 0xc7, 0x47, 0xd5, 0xf3, 0x5d, 0xdf, 0xa5, 0x83, 0x29, + 0x50, 0x14, 0x8e, 0xe4, 0x4b, 0x30, 0x66, 0xf5, 0x3b, 0x54, 0x26, 0xe6, 0x98, 0x94, 0x13, 0xbe, + 0xdf, 0x51, 0xb2, 0x4c, 0x06, 0xfd, 0xf4, 0x3d, 0x02, 0x03, 0x90, 0xf7, 0x01, 0xee, 0xf7, 0x77, + 0xe8, 0xdd, 0xc0, 0xef, 0xf7, 0x64, 0xe4, 0x2f, 0x9a, 0xb1, 0xfb, 0x71, 0x1a, 0x27, 0x7b, 0x17, + 0x0b, 0xd5, 0x8f, 0x27, 0x24, 0x64, 0x1d, 0x26, 0x84, 0xf8, 0x10, 0xe7, 0xf4, 0x2f, 0x64, 0x9d, + 0x10, 0x29, 0x3a, 0x84, 0xc8, 0x94, 0x81, 0x60, 0xfd, 0xd0, 0x86, 0x9b, 0xe1, 0xef, 0x40, 0x89, + 0xb1, 0x67, 0xa6, 0x76, 0x28, 0xf6, 0x0e, 0xf4, 0x1f, 0x54, 0x2a, 0xc4, 0xcc, 0x72, 0x2d, 0x5f, + 0x57, 0x4c, 0x40, 0xbe, 0x86, 0xb9, 0x6d, 0x44, 0x57, 0x9f, 0x78, 0xd0, 0xf8, 0xca, 0x40, 0x57, + 0x9f, 0x73, 0x7a, 0xbd, 0x8c, 0x64, 0x60, 0x31, 0x3f, 0xb2, 0x1b, 0xc7, 0xd8, 0xc4, 0xa9, 0x86, + 0x4f, 0xf8, 0xc0, 0xf5, 0x81, 0x0f, 0xcc, 0xc9, 0xb0, 0x91, 0xc1, 0x8c, 0x36, 0x1a, 0x5f, 0xd2, + 0x83, 0x4a, 0x92, 0x46, 0x4b, 0x7c, 0x0b, 0x4e, 0xfa, 0xd6, 0x1b, 0x03, 0xdf, 0x52, 0x07, 0x70, + 0xe0, 0x73, 0x03, 0xdc, 0x89, 0x9b, 0xa4, 0x85, 0x15, 0xdf, 0x9b, 0x3c, 0xe9, 0x7b, 0x2f, 0x0f, + 0x7c, 0xef, 0xac, 0xbb, 0x33, 0xf8, 0x9d, 0x14, 0x4f, 0xf2, 0x0e, 0x4c, 0x49, 0x08, 0xae, 0x0f, + 0x3c, 0xe0, 0x13, 0xfa, 0xbd, 0xbb, 0x83, 0x4e, 0x63, 0x7a, 0x3a, 0x17, 0x15, 0x59, 0xa5, 0xe6, + 0xb3, 0x63, 0x4a, 0xa3, 0x4e, 0xcf, 0x0a, 0x1d, 0x99, 0x7c, 0x15, 0x26, 0x97, 0x0f, 0x58, 0x43, + 0xfc, 0xae, 0x13, 0x51, 0xdc, 0x8c, 0x92, 0x43, 0x53, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0xc7, 0x63, + 0x52, 0xa4, 0x6e, 0xe6, 0x0a, 0x05, 0xeb, 0x3c, 0x7e, 0xfc, 0x22, 0xe6, 0x70, 0x28, 0xb6, 0x9e, + 0xe7, 0x33, 0x0e, 0x2e, 0x15, 0xf6, 0x28, 0xcb, 0xf9, 0xa9, 0x8e, 0x2d, 0x16, 0x84, 0xd6, 0x79, + 0x3a, 0x4f, 0xf2, 0x2e, 0x4c, 0x8a, 0x88, 0xc6, 0x9a, 0xb5, 0x16, 0xce, 0x55, 0xb0, 0xf1, 0x98, + 0x8b, 0x4d, 0x06, 0x3f, 0xda, 0x4e, 0x90, 0xba, 0xbd, 0x4a, 0xf0, 0xc9, 0x57, 0xe0, 0xdc, 0xb6, + 0xd7, 0x75, 0xfd, 0x47, 0xa1, 0x10, 0xe0, 0x42, 0xd0, 0xcd, 0x26, 0x3e, 0x3a, 0x8f, 0x78, 0xb9, + 0x2d, 0xb7, 0xad, 0x01, 0xc1, 0x97, 0xc9, 0x81, 0xfc, 0xdc, 0x00, 0x67, 0x3e, 0x83, 0xc8, 0x49, + 0x33, 0x68, 0x61, 0x60, 0x06, 0x0d, 0x7e, 0x3e, 0x3d, 0x9d, 0x32, 0x3f, 0x43, 0x7c, 0x20, 0xba, + 0xce, 0xf1, 0x81, 0xef, 0x75, 0xe7, 0xce, 0x6a, 0x0f, 0x79, 0xc4, 0x2e, 0xb3, 0x88, 0xb7, 0xe1, + 0x77, 0xbc, 0xf6, 0x61, 0xdd, 0x3c, 0x3e, 0xaa, 0xbe, 0x90, 0xd6, 0x66, 0x3e, 0xf2, 0xb5, 0xc3, + 0x85, 0x0c, 0xd6, 0xe4, 0xab, 0x50, 0x66, 0x7f, 0x63, 0xd5, 0xef, 0x9c, 0x76, 0xd5, 0xa5, 0x60, + 0x8a, 0xef, 0xe0, 0x18, 0x61, 0xc8, 0x65, 0x86, 0x56, 0xa8, 0xb1, 0x32, 0x7f, 0x68, 0xc0, 0xb9, + 0xac, 0xba, 0x9e, 0x92, 0xdf, 0xc6, 0x4c, 0x5d, 0x7a, 0xe3, 0xb9, 0x04, 0xbf, 0xf4, 0x8e, 0xaf, + 0xba, 0xab, 0x30, 0xc6, 0x6c, 0x65, 0xe9, 0x94, 0x85, 0xdb, 0x21, 0xb3, 0xa7, 0x43, 0x8b, 0xc3, + 0x19, 0x02, 0x3a, 0xd3, 0xe3, 0x7e, 0x39, 0xc6, 0x11, 0xd0, 0xe3, 0xde, 0xe2, 0x70, 0x86, 0xc0, + 0xb6, 0x5d, 0xb9, 0x4d, 0x20, 0x02, 0xdb, 0x8d, 0x43, 0x8b, 0xc3, 0xc9, 0x2b, 0x30, 0xb1, 0xde, + 0x5d, 0xa1, 0xce, 0x43, 0x2a, 0x6e, 0x9c, 0xf0, 0x1c, 0xc5, 0xef, 0xda, 0x1d, 0x06, 0xb3, 0x64, + 0xa1, 0xf9, 0x5d, 0x03, 0x66, 0x07, 0xba, 0xe9, 0xf4, 0x14, 0x3e, 0x27, 0x5f, 0xef, 0x8d, 0xd2, + 0x3e, 0x5e, 0xfd, 0x42, 0x76, 0xf5, 0xcd, 0xbf, 0xc8, 0xc3, 0xc5, 0x21, 0xbb, 0x56, 0x72, 0x35, + 0x6f, 0x9c, 0x7a, 0x35, 0xff, 0x75, 0xb6, 0x4b, 0x38, 0xde, 0x41, 0xd8, 0xf2, 0x93, 0x1a, 0x27, + 0xb7, 0x18, 0x58, 0x26, 0x73, 0x64, 0xc8, 0x7c, 0x0e, 0x97, 0xda, 0x48, 0x61, 0x47, 0xfe, 0xc0, + 0x99, 0xb1, 0xce, 0x6c, 0xe0, 0x72, 0x3c, 0xff, 0xd7, 0xe4, 0x72, 0x5c, 0xbf, 0x92, 0x2a, 0x3c, + 0xd5, 0x2b, 0xa9, 0xec, 0x43, 0xf2, 0xb1, 0x4f, 0x72, 0x15, 0xf0, 0xef, 0x53, 0xd7, 0xf1, 0x7f, + 0x1d, 0x87, 0xfa, 0x35, 0x18, 0xdb, 0xde, 0xa3, 0x81, 0xd4, 0x6f, 0xb1, 0x22, 0x8f, 0x18, 0x40, + 0xad, 0x08, 0x62, 0x98, 0x3f, 0x0b, 0x65, 0xf5, 0x63, 0xb8, 0x96, 0xd9, 0x6f, 0xb1, 0x98, 0xf8, + 0x5a, 0x66, 0x00, 0x8b, 0xc3, 0x4f, 0xcd, 0x88, 0x95, 0xf4, 0x42, 0xfe, 0xb4, 0x5e, 0x30, 0xff, + 0x9d, 0x01, 0x05, 0x4c, 0x08, 0xf0, 0x26, 0x94, 0xe4, 0x51, 0xa9, 0x1a, 0x24, 0x7f, 0x56, 0x9e, + 0xa4, 0x86, 0xba, 0x3f, 0x83, 0x00, 0xb2, 0x4f, 0x6d, 0xd1, 0x60, 0x47, 0x73, 0x7b, 0x79, 0xc8, + 0x00, 0xea, 0xa7, 0x10, 0xe3, 0x09, 0xba, 0x04, 0x5d, 0x7b, 0x84, 0x7d, 0xcf, 0x17, 0x3c, 0x77, + 0xed, 0x19, 0xb0, 0xeb, 0x25, 0x96, 0xf9, 0x9b, 0x06, 0x9c, 0xcf, 0xd4, 0x03, 0xd8, 0x57, 0xb9, + 0xc2, 0xa1, 0xcc, 0x88, 0xb4, 0xb6, 0xc1, 0x31, 0x9e, 0xc4, 0x85, 0xe7, 0x09, 0x86, 0xf7, 0x73, + 0x50, 0x8a, 0xed, 0x33, 0x72, 0x4e, 0x0e, 0x1d, 0x9e, 0xa7, 0x49, 0x63, 0xe6, 0xaf, 0x0c, 0x18, + 0x67, 0x55, 0x78, 0x66, 0xa3, 0x2b, 0xb2, 0x4f, 0x57, 0x59, 0x93, 0x46, 0x8a, 0xa9, 0xf8, 0xbd, + 0x71, 0x80, 0x04, 0x99, 0xec, 0xc0, 0xf4, 0xfa, 0xf2, 0xd2, 0xe2, 0xb2, 0x4b, 0xbb, 0x11, 0xde, + 0xf2, 0xa5, 0xa2, 0xec, 0x99, 0x61, 0x19, 0x74, 0x9d, 0x8e, 0x40, 0x38, 0x4c, 0x96, 0xa7, 0xef, + 0xb9, 0x6d, 0xdb, 0x8b, 0xe9, 0x54, 0x85, 0x4c, 0xe7, 0xc8, 0xbe, 0xd1, 0xac, 0xad, 0xae, 0x28, + 0xdf, 0xc8, 0x8d, 0xf8, 0x8d, 0xd0, 0x39, 0xe8, 0x0c, 0xf9, 0x86, 0xce, 0x91, 0xec, 0x41, 0xe5, + 0x2e, 0xca, 0x6e, 0xe5, 0x2b, 0xf9, 0x93, 0xbf, 0xf2, 0xa2, 0xf8, 0xca, 0x73, 0x5c, 0xe8, 0x67, + 0x7f, 0x67, 0x80, 0x6b, 0x32, 0x73, 0x0b, 0xa7, 0xce, 0xdc, 0xbf, 0x6d, 0xc0, 0x38, 0xdf, 0x1c, + 0xe2, 0xb7, 0x2c, 0x32, 0xb7, 0x9f, 0xed, 0xa7, 0xb3, 0xfd, 0x54, 0x22, 0xfc, 0x4f, 0x35, 0xc0, + 0x79, 0x19, 0x59, 0x4a, 0x3d, 0x8c, 0x21, 0x8f, 0xd0, 0x51, 0x31, 0xe5, 0x25, 0x89, 0x23, 0x14, + 0x7f, 0x13, 0x43, 0xe5, 0xc2, 0x31, 0xd4, 0x67, 0xfa, 0x26, 0x3e, 0xe1, 0x33, 0x7d, 0x2b, 0x50, + 0x12, 0x9e, 0x3d, 0xf5, 0x43, 0x61, 0x7e, 0xca, 0x03, 0x96, 0x18, 0xae, 0x24, 0x9f, 0xe6, 0x20, + 0x7b, 0x47, 0x4b, 0x1d, 0x17, 0x23, 0x92, 0x75, 0x28, 0x25, 0xa1, 0x21, 0x25, 0xed, 0x1e, 0x34, + 0x86, 0x0b, 0xd7, 0x57, 0x1e, 0x7d, 0x98, 0x19, 0x09, 0x92, 0xf0, 0x30, 0xbf, 0x69, 0x40, 0x25, + 0x3d, 0x5f, 0xc8, 0x3b, 0x30, 0x19, 0x47, 0xe7, 0xc4, 0xfe, 0x05, 0x78, 0x90, 0x99, 0x84, 0xf3, + 0x68, 0x9e, 0x06, 0x2a, 0x3a, 0x59, 0x80, 0x22, 0x5b, 0x76, 0x4a, 0xee, 0x60, 0x94, 0x27, 0x7d, + 0x01, 0x53, 0xef, 0xf5, 0x24, 0x9e, 0xb2, 0x6a, 0xff, 0x63, 0x1e, 0x26, 0x95, 0xc1, 0x22, 0xaf, + 0x41, 0x71, 0x39, 0x5c, 0xf1, 0xdb, 0xfb, 0xd4, 0x15, 0xd7, 0x05, 0xf8, 0x0a, 0xa3, 0x17, 0xda, + 0x1d, 0x04, 0x5a, 0x71, 0x31, 0xa9, 0xc3, 0x14, 0xff, 0x4f, 0x46, 0x61, 0xe6, 0x92, 0xa3, 0x4e, + 0x8e, 0x2c, 0xe3, 0x2f, 0xd5, 0x1d, 0x56, 0x23, 0x21, 0xdf, 0x00, 0xe0, 0x00, 0x36, 0xbe, 0x23, + 0x38, 0xf6, 0xca, 0x05, 0x7c, 0x5e, 0x7c, 0x20, 0xf2, 0xd4, 0x16, 0xe2, 0x54, 0x50, 0x18, 0xe2, + 0x0b, 0x70, 0x7e, 0x7b, 0x7f, 0xf4, 0x37, 0x20, 0x93, 0x17, 0xe0, 0xfc, 0xf6, 0xbe, 0x9d, 0xed, + 0xe5, 0xa5, 0xb2, 0x24, 0xdf, 0x32, 0xe0, 0xb2, 0x45, 0xdb, 0xfe, 0x43, 0x1a, 0x1c, 0xd6, 0x22, + 0xc4, 0x52, 0xbf, 0x78, 0xba, 0x4b, 0xd9, 0x2d, 0xf1, 0xc5, 0x57, 0x03, 0xc1, 0x05, 0xc3, 0x51, + 0x0e, 0x7a, 0x91, 0x7d, 0x42, 0x15, 0x4e, 0xf8, 0xa4, 0xf9, 0xa7, 0x86, 0xb2, 0x04, 0xc8, 0x1a, + 0x94, 0xe2, 0xc9, 0x22, 0x0e, 0x1c, 0x63, 0xe5, 0x48, 0xc2, 0x2d, 0xfa, 0xa0, 0xfe, 0x9c, 0x38, + 0xd9, 0x3f, 0x1b, 0x4f, 0x39, 0x6d, 0x45, 0x48, 0x20, 0xf9, 0x32, 0x14, 0x70, 0xa8, 0x4e, 0x4f, + 0x36, 0x25, 0xb7, 0x9a, 0x02, 0x1b, 0x23, 0xac, 0x35, 0x52, 0x92, 0x2f, 0x08, 0x2f, 0x8f, 0xbc, + 0x96, 0xc6, 0x95, 0x81, 0x58, 0x3d, 0xe2, 0x3d, 0x26, 0x71, 0x2c, 0x54, 0x66, 0xeb, 0xdf, 0xcd, + 0x41, 0x25, 0xbd, 0xf0, 0xc8, 0xfb, 0x50, 0xde, 0x70, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0xf7, 0x9c, + 0x70, 0x4f, 0xa4, 0x86, 0x44, 0x9b, 0xaf, 0x27, 0xe0, 0xf6, 0x9e, 0xa3, 0xa5, 0x10, 0xd3, 0x08, + 0xd8, 0x86, 0xdc, 0x12, 0xfe, 0xea, 0xca, 0x02, 0x8a, 0xfc, 0xa8, 0x97, 0x4a, 0x0d, 0x29, 0xd1, + 0xc8, 0x9b, 0x90, 0xe7, 0xb1, 0x6f, 0x6a, 0x5e, 0xa1, 0xd5, 0x3b, 0x35, 0x1e, 0x2e, 0xc4, 0x2f, + 0x93, 0xf5, 0x53, 0x79, 0x86, 0x4f, 0x56, 0x94, 0xc8, 0xa9, 0x71, 0x2d, 0xbf, 0x8a, 0x04, 0xc7, + 0x8d, 0x3b, 0x3d, 0x84, 0xea, 0x83, 0x42, 0x31, 0x5f, 0x29, 0x88, 0xf8, 0x9c, 0x3f, 0xc8, 0x43, + 0x29, 0xfe, 0x3e, 0x21, 0x80, 0xfa, 0x86, 0xb8, 0x15, 0xc6, 0xff, 0xc9, 0x25, 0x28, 0x4a, 0x15, + 0x43, 0xdc, 0x0c, 0x4f, 0x84, 0x42, 0xbd, 0x98, 0x03, 0xa9, 0x4b, 0x70, 0xf5, 0xc2, 0x92, 0x3f, + 0xc9, 0x4d, 0x88, 0x15, 0x85, 0x61, 0x1a, 0x45, 0x81, 0x0d, 0x98, 0x15, 0xa3, 0x91, 0x69, 0xc8, + 0x79, 0xdc, 0x17, 0xb9, 0x64, 0xe5, 0x3c, 0x97, 0xbc, 0x0f, 0x45, 0xc7, 0x75, 0xa9, 0x6b, 0x3b, + 0xd1, 0x08, 0xef, 0x71, 0x16, 0x19, 0x37, 0x2e, 0xd1, 0x91, 0xaa, 0x16, 0x91, 0x1a, 0x94, 0xf0, + 0x39, 0xc6, 0x7e, 0x38, 0xd2, 0x1b, 0x8e, 0x09, 0x87, 0x22, 0x23, 0xdb, 0x0c, 0xa9, 0x4b, 0x5e, + 0x85, 0x02, 0x1b, 0x4d, 0xb1, 0x1f, 0xc4, 0xd9, 0xe2, 0xd6, 0x5b, 0x1b, 0xbc, 0xc3, 0xee, 0x9d, + 0xb1, 0x10, 0x81, 0xbc, 0x04, 0xf9, 0xfe, 0xc2, 0x03, 0x21, 0xe9, 0x2b, 0x49, 0x58, 0x64, 0x8c, + 0xc6, 0x8a, 0xc9, 0x2d, 0x28, 0x3e, 0xd2, 0x03, 0xe0, 0xce, 0xa7, 0x86, 0x31, 0xc6, 0x8f, 0x11, + 0xeb, 0x45, 0x18, 0xe7, 0xe1, 0x66, 0xe6, 0x0b, 0x00, 0xc9, 0xa7, 0x07, 0x2f, 0xf0, 0xcd, 0x6f, + 0x40, 0x29, 0xfe, 0x24, 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xda, 0x7b, 0x4e, 0xd7, 0x15, 0xcf, 0x90, + 0x94, 0xad, 0xd2, 0x3e, 0x3d, 0xbc, 0x87, 0x00, 0x72, 0x11, 0x26, 0x7a, 0x6c, 0x54, 0x65, 0x62, + 0x53, 0x6b, 0xbc, 0xd7, 0xdf, 0x61, 0x33, 0x74, 0x0e, 0x26, 0xf0, 0xe8, 0x40, 0x2c, 0xb4, 0x29, + 0x4b, 0xfe, 0x34, 0x7f, 0x27, 0x87, 0x21, 0xef, 0x4a, 0x3d, 0xc9, 0x8b, 0x30, 0xd5, 0x0e, 0x28, + 0x6e, 0x47, 0x0e, 0x53, 0x8b, 0xc4, 0x77, 0xca, 0x09, 0x70, 0xd9, 0x25, 0xaf, 0xc0, 0x4c, 0x92, + 0x69, 0xd5, 0x6e, 0xef, 0x88, 0xf0, 0xd7, 0xb2, 0x35, 0xd5, 0x93, 0xa9, 0x56, 0x17, 0x77, 0xd0, + 0x87, 0xbe, 0xa2, 0x86, 0x9a, 0x45, 0x32, 0x6b, 0x6a, 0xc9, 0x9a, 0x51, 0xe0, 0x78, 0xed, 0x70, + 0x01, 0xc6, 0x1d, 0x67, 0xb7, 0xef, 0x71, 0x7f, 0xde, 0xb2, 0x25, 0x7e, 0x91, 0xcf, 0xc3, 0x6c, + 0xe8, 0xed, 0x76, 0x9d, 0xa8, 0x1f, 0x88, 0x9c, 0x03, 0x34, 0xc0, 0x29, 0x35, 0x65, 0x55, 0xe2, + 0x82, 0x45, 0x0e, 0x27, 0x6f, 0x00, 0x51, 0xbf, 0xe7, 0xef, 0x7c, 0x44, 0xdb, 0x7c, 0xaa, 0x95, + 0xad, 0x59, 0xa5, 0x64, 0x1d, 0x0b, 0xc8, 0xe7, 0xa0, 0x1c, 0xd0, 0x10, 0x55, 0x32, 0xec, 0x36, + 0xcc, 0xa4, 0x62, 0x4d, 0x4a, 0xd8, 0x7d, 0x7a, 0x68, 0xd6, 0x61, 0x76, 0x60, 0x3d, 0x92, 0x37, + 0xb8, 0x76, 0x2f, 0xf6, 0xe7, 0x32, 0x37, 0x66, 0x98, 0x90, 0x4a, 0xbd, 0xe0, 0xcb, 0x91, 0xcc, + 0x2e, 0x94, 0x55, 0xf9, 0x7a, 0x4a, 0x60, 0xf1, 0x05, 0x74, 0x2c, 0xe4, 0xc2, 0x67, 0xfc, 0xf8, + 0xa8, 0x9a, 0xf3, 0x5c, 0x74, 0x27, 0xbc, 0x06, 0x45, 0xa9, 0x25, 0xa8, 0xcf, 0x70, 0x08, 0x85, + 0xf2, 0xd0, 0x8a, 0x4b, 0xcd, 0x57, 0x61, 0x42, 0x88, 0xd0, 0x93, 0x8f, 0x71, 0xcc, 0x5f, 0xcc, + 0xc1, 0x8c, 0x45, 0xd9, 0x02, 0x17, 0x0f, 0x5c, 0x7c, 0xc6, 0x72, 0xce, 0x6a, 0x6d, 0x3b, 0x21, + 0x8e, 0xff, 0x7b, 0x06, 0x9c, 0xcd, 0xc0, 0xfd, 0x58, 0x49, 0xaa, 0x6e, 0x43, 0x69, 0xc9, 0x73, + 0x3a, 0x35, 0xd7, 0x8d, 0x1d, 0x24, 0x51, 0x1b, 0x74, 0xd9, 0x72, 0x72, 0x18, 0x54, 0xdd, 0x4c, + 0x63, 0x54, 0x72, 0x5d, 0x4c, 0x8a, 0x24, 0x8d, 0x9e, 0xcc, 0x6a, 0x0b, 0xbc, 0x4e, 0x49, 0x4e, + 0x5b, 0x0c, 0x43, 0xe3, 0xc0, 0xe4, 0x0e, 0xfc, 0x99, 0x1d, 0xba, 0xec, 0x30, 0xb4, 0x74, 0xf3, + 0x46, 0x32, 0x3b, 0xbf, 0x99, 0x83, 0x0b, 0xd9, 0x84, 0x1f, 0x37, 0xdf, 0x18, 0x26, 0x51, 0x50, + 0x12, 0x07, 0x63, 0xbe, 0x31, 0x9e, 0x71, 0x01, 0xf1, 0x13, 0x04, 0xf2, 0x00, 0xa6, 0x56, 0x9c, + 0x30, 0xba, 0x47, 0x9d, 0x20, 0xda, 0xa1, 0x4e, 0x34, 0x82, 0x06, 0x1b, 0xbf, 0x93, 0x8b, 0x9b, + 0xda, 0x9e, 0xa4, 0x4c, 0xbf, 0x93, 0xab, 0xb1, 0x8d, 0x27, 0x4a, 0x61, 0x84, 0x89, 0xf2, 0xd3, + 0x30, 0xd3, 0xa4, 0x07, 0x4e, 0x6f, 0xcf, 0x0f, 0xa8, 0x38, 0x79, 0xbe, 0x01, 0x53, 0x31, 0x28, + 0x73, 0xb6, 0xe8, 0xc5, 0x1a, 0xbe, 0xd2, 0x11, 0x89, 0x28, 0xd1, 0x8b, 0xcd, 0xdf, 0xca, 0xc1, + 0xc5, 0x5a, 0x5b, 0x1c, 0xd3, 0x8b, 0x02, 0x79, 0x9b, 0xf8, 0x29, 0x7f, 0x9b, 0xcc, 0x43, 0x69, + 0xd5, 0x79, 0x8c, 0x0f, 0xbe, 0x87, 0x22, 0x6b, 0x0d, 0x57, 0xbf, 0x9c, 0xc7, 0x76, 0x7c, 0xec, + 0x65, 0x25, 0x38, 0x4f, 0xf3, 0x4d, 0x78, 0x13, 0xc6, 0xef, 0xf9, 0x1d, 0x57, 0x6c, 0x4e, 0xe2, + 0xd4, 0x7f, 0x0f, 0x21, 0x96, 0x28, 0x31, 0x7f, 0x68, 0xc0, 0x74, 0x5c, 0x63, 0xac, 0xc2, 0xa7, + 0xde, 0x25, 0xa9, 0xd7, 0xf1, 0x4b, 0x23, 0xbc, 0x8e, 0x3f, 0xf6, 0xc9, 0x7a, 0xc2, 0xfc, 0x27, + 0x78, 0xa1, 0xa0, 0xb6, 0x92, 0xed, 0x44, 0x4a, 0x45, 0x8c, 0x11, 0x2b, 0x92, 0x7b, 0x6a, 0x43, + 0x92, 0x1f, 0x3a, 0x24, 0xbf, 0x94, 0x83, 0xc9, 0xb8, 0xb2, 0x9f, 0xb1, 0xf8, 0xed, 0xb8, 0x5d, + 0x23, 0x79, 0x67, 0x37, 0x15, 0x59, 0x21, 0x9c, 0xa0, 0xbf, 0x0c, 0xe3, 0x62, 0x31, 0x19, 0xa9, + 0x5b, 0xb5, 0xd4, 0xe8, 0x26, 0x6f, 0x9d, 0xe2, 0x80, 0x86, 0x96, 0xa0, 0x43, 0xf7, 0xf7, 0x6d, + 0xba, 0x23, 0xee, 0x97, 0x9e, 0xd9, 0x3d, 0x2a, 0xdb, 0xfd, 0x3d, 0x69, 0xd8, 0x48, 0xbb, 0xd3, + 0x3f, 0x2c, 0x40, 0x25, 0x4d, 0x72, 0x7a, 0x84, 0xfc, 0x46, 0x7f, 0x47, 0xbc, 0x53, 0x80, 0x11, + 0xf2, 0xbd, 0xfe, 0x8e, 0xc5, 0x60, 0xe4, 0x15, 0x28, 0x6c, 0x04, 0xde, 0x43, 0x6c, 0xb5, 0x78, + 0xa6, 0xa1, 0x17, 0x78, 0x0f, 0x55, 0x3f, 0x50, 0x56, 0x8e, 0x06, 0xed, 0x4a, 0x53, 0x79, 0x66, + 0x9a, 0x1b, 0xb4, 0x9d, 0x30, 0x9d, 0x16, 0x45, 0xa2, 0xb1, 0xad, 0xb2, 0x4e, 0x9d, 0x40, 0x44, + 0x73, 0x0b, 0x71, 0x86, 0x5b, 0xe5, 0x0e, 0x82, 0x79, 0xce, 0x53, 0x4b, 0x45, 0x22, 0x1d, 0x20, + 0xca, 0x4f, 0xb9, 0x80, 0x4f, 0xb7, 0xf1, 0xe4, 0xf3, 0x42, 0xe7, 0x54, 0xd6, 0xb6, 0xba, 0x9a, + 0x33, 0xf8, 0x3e, 0xcd, 0x33, 0xc2, 0x0d, 0x28, 0xe1, 0x91, 0x17, 0x1e, 0x64, 0x14, 0x4f, 0x65, + 0x26, 0x7d, 0x6e, 0x01, 0x6f, 0xe3, 0xed, 0xf8, 0x38, 0x23, 0x61, 0x42, 0xde, 0x83, 0x49, 0xd5, + 0x51, 0x94, 0xbb, 0x33, 0x5e, 0xe1, 0x11, 0x42, 0x43, 0xd2, 0x87, 0xa9, 0x04, 0xe6, 0x17, 0xd4, + 0x59, 0x22, 0x36, 0xed, 0x13, 0x67, 0x89, 0xf9, 0x1b, 0xa8, 0xc6, 0x1f, 0xf8, 0x11, 0x15, 0xda, + 0xcb, 0x33, 0x2b, 0xc7, 0x92, 0x23, 0xe4, 0x31, 0xcd, 0x23, 0x44, 0x6b, 0xdd, 0x13, 0x3c, 0xb0, + 0xfc, 0xfb, 0x06, 0x9c, 0xcf, 0xa4, 0x25, 0x37, 0x00, 0x12, 0x1d, 0x51, 0xf4, 0x12, 0x4f, 0x26, + 0x1b, 0x43, 0x2d, 0x05, 0x83, 0x7c, 0x3d, 0xad, 0xdd, 0x9d, 0xbe, 0x39, 0xc9, 0x27, 0x17, 0xa6, + 0x75, 0xed, 0x2e, 0x43, 0xa7, 0x33, 0xbf, 0x97, 0x87, 0xd9, 0x81, 0xa7, 0xfa, 0x4e, 0xb9, 0x83, + 0xdf, 0x4f, 0x3d, 0x04, 0xc5, 0xaf, 0x3b, 0xae, 0x0f, 0x7b, 0x28, 0x30, 0xe3, 0x59, 0x28, 0x3c, + 0x16, 0x13, 0x79, 0x8c, 0x4f, 0x79, 0x1d, 0x2a, 0xcc, 0x7e, 0x42, 0xec, 0xf3, 0x43, 0xbf, 0xf6, + 0x14, 0x9e, 0x12, 0xfb, 0x6b, 0xfc, 0xd2, 0xd2, 0x6f, 0xe4, 0xe0, 0xec, 0x40, 0x9b, 0x9f, 0xd9, + 0x55, 0xf7, 0x65, 0x6d, 0x77, 0x7b, 0x61, 0xd8, 0x98, 0x8e, 0xa4, 0x45, 0xfc, 0x0f, 0x03, 0x2e, + 0x0e, 0xa1, 0x24, 0x87, 0xe9, 0x49, 0xc4, 0xb5, 0x8a, 0x9b, 0x27, 0x7f, 0xf0, 0xa9, 0x4c, 0xa5, + 0x4f, 0x6d, 0x26, 0xfc, 0x62, 0x0e, 0x60, 0x9b, 0xee, 0x3c, 0xdb, 0xe9, 0x7f, 0xb2, 0xdf, 0xc2, + 0x97, 0xcd, 0x1a, 0x69, 0xdc, 0xd7, 0xf1, 0x20, 0x71, 0xf4, 0xdc, 0x3f, 0xf1, 0xb3, 0x12, 0xb9, + 0xec, 0x67, 0x25, 0xcc, 0x1d, 0x38, 0x77, 0x97, 0x46, 0xc9, 0x4e, 0x28, 0x6d, 0xc8, 0x93, 0xd9, + 0xbe, 0x0e, 0x25, 0x81, 0xaf, 0xa7, 0x08, 0x97, 0x0e, 0x65, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, + 0x8b, 0x4b, 0xb4, 0x43, 0x23, 0xfa, 0xe9, 0x7e, 0xa6, 0x09, 0x84, 0x37, 0x85, 0xbf, 0x36, 0x30, + 0xd2, 0x17, 0x4e, 0xed, 0x9f, 0x2d, 0x38, 0x1f, 0xd7, 0xfd, 0x69, 0xf2, 0x9d, 0x67, 0xba, 0x84, + 0x88, 0xb5, 0x4b, 0x38, 0x9e, 0x70, 0x88, 0xf8, 0x18, 0x2e, 0x4b, 0x82, 0x6d, 0x2f, 0xbe, 0x89, + 0x19, 0x89, 0x96, 0xbc, 0x03, 0x93, 0x0a, 0x8d, 0x08, 0xdc, 0xc5, 0xdb, 0xce, 0x47, 0x5e, 0xb4, + 0x67, 0x87, 0x1c, 0xae, 0xde, 0x76, 0x2a, 0xe8, 0xe6, 0xd7, 0xe0, 0xb9, 0xd8, 0x6f, 0x25, 0xe3, + 0xd3, 0x29, 0xe6, 0xc6, 0x93, 0x31, 0x5f, 0x4b, 0x9a, 0xb5, 0xdc, 0x8d, 0xfd, 0xc7, 0x25, 0x6f, + 0xa2, 0x36, 0x4b, 0x34, 0xe6, 0x8a, 0x92, 0x16, 0x4d, 0xec, 0x45, 0x09, 0xc0, 0x7c, 0x5b, 0xa9, + 0x6c, 0x06, 0x43, 0x8d, 0xd8, 0x48, 0x13, 0xff, 0x62, 0x0e, 0x66, 0xd6, 0x97, 0x97, 0x16, 0xe3, + 0x63, 0xe4, 0xcf, 0x58, 0x6e, 0x22, 0xad, 0x6d, 0xc3, 0xe5, 0x8d, 0xb9, 0x09, 0x67, 0x53, 0xdd, + 0x80, 0x8f, 0xa9, 0xbc, 0xc7, 0xfd, 0x4b, 0x62, 0xb0, 0xdc, 0x59, 0x2e, 0x64, 0xb1, 0xdf, 0xba, + 0x65, 0xa5, 0xb0, 0xcd, 0xef, 0x8d, 0xa7, 0xf8, 0x0a, 0x11, 0xf6, 0x3a, 0x94, 0x96, 0xc3, 0xb0, + 0x4f, 0x83, 0x4d, 0x6b, 0x45, 0xd5, 0x11, 0x3d, 0x04, 0xda, 0xfd, 0xa0, 0x63, 0x25, 0x08, 0xe4, + 0x35, 0x28, 0x8a, 0xf8, 0x2e, 0x29, 0x13, 0xf0, 0xba, 0x3c, 0x0e, 0x0f, 0xb3, 0xe2, 0x62, 0xf2, + 0x26, 0x94, 0xf9, 0xff, 0x7c, 0xb6, 0x89, 0x0e, 0xc7, 0xb3, 0x2a, 0x81, 0xce, 0x67, 0xa7, 0xa5, + 0xa1, 0x31, 0xcb, 0x4c, 0xbe, 0xd6, 0xc8, 0x6a, 0x54, 0x48, 0x2c, 0x33, 0xf9, 0xb0, 0x23, 0xd6, + 0x49, 0x45, 0x22, 0xd7, 0x21, 0x5f, 0x5b, 0xb4, 0xd4, 0xac, 0xc8, 0x4e, 0x3b, 0xe0, 0x59, 0xc5, + 0xb5, 0x07, 0x91, 0x6a, 0x8b, 0x16, 0x59, 0x80, 0x22, 0x3e, 0x78, 0xe1, 0xd2, 0x40, 0xf8, 0x8c, + 0xe2, 0xac, 0xe9, 0x09, 0x98, 0x7a, 0xf3, 0x28, 0xf1, 0xc8, 0x3c, 0x4c, 0x2c, 0x79, 0x61, 0xaf, + 0xe3, 0x1c, 0x8a, 0xa4, 0x24, 0x78, 0x19, 0xe2, 0x72, 0x90, 0x3a, 0xcf, 0x04, 0x16, 0x79, 0x0d, + 0xc6, 0x9a, 0x6d, 0xbf, 0xc7, 0xac, 0xad, 0xd8, 0xb5, 0x25, 0x64, 0x00, 0x2d, 0xb3, 0x01, 0x03, + 0x60, 0xc8, 0x31, 0x8f, 0x9c, 0x2a, 0x29, 0x21, 0xc7, 0xe9, 0x88, 0x29, 0x81, 0x33, 0xe8, 0xff, + 0x07, 0x4f, 0xd3, 0xff, 0x6f, 0x07, 0x2e, 0xde, 0x45, 0x55, 0xbf, 0x49, 0x03, 0xcc, 0x03, 0xc9, + 0x1f, 0xcf, 0xd9, 0xb4, 0x96, 0x45, 0xb4, 0xd8, 0xb5, 0xe3, 0xa3, 0xea, 0x4b, 0xdc, 0x1a, 0xb0, + 0x43, 0x8e, 0x23, 0xdf, 0xdd, 0x49, 0xbd, 0x18, 0x30, 0x8c, 0x11, 0xf9, 0x0a, 0x9c, 0xcb, 0x2a, + 0x12, 0x71, 0x63, 0xe8, 0x15, 0x9e, 0xfd, 0x01, 0xd5, 0x2d, 0x3b, 0x8b, 0x03, 0x59, 0x81, 0x0a, + 0x87, 0xd7, 0xdc, 0x03, 0xaf, 0xdb, 0x38, 0x70, 0xbc, 0x0e, 0x46, 0x91, 0x89, 0x50, 0x40, 0xc1, + 0xd5, 0x61, 0x85, 0x36, 0x65, 0xa5, 0x9a, 0x77, 0x52, 0x8a, 0x12, 0xc5, 0x51, 0xb3, 0xb6, 0xba, + 0x92, 0xac, 0xa9, 0xcf, 0xd6, 0xbd, 0x91, 0xd6, 0xb6, 0x13, 0xee, 0x8d, 0x36, 0xe1, 0x6c, 0xaa, + 0x1b, 0xa4, 0x38, 0xd2, 0xc0, 0x69, 0x71, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x1a, 0x4f, + 0xf1, 0x15, 0x67, 0x45, 0x26, 0x8c, 0x73, 0x69, 0xa3, 0x66, 0x2d, 0xe3, 0xb2, 0xc8, 0x12, 0x25, + 0xe4, 0x12, 0xe4, 0x9b, 0xcd, 0x75, 0x35, 0xa7, 0x62, 0x18, 0xfa, 0x16, 0x83, 0xb1, 0x11, 0xc2, + 0x63, 0x20, 0x25, 0x40, 0xab, 0x4d, 0x83, 0x48, 0x3c, 0xe7, 0xf9, 0x72, 0xb2, 0x8e, 0x0b, 0x49, + 0x7f, 0x8b, 0x75, 0x9c, 0xac, 0xde, 0x45, 0x98, 0xab, 0x85, 0x21, 0x0d, 0x22, 0x9e, 0x94, 0x3d, + 0xec, 0x1f, 0xd0, 0x40, 0xcc, 0x35, 0x21, 0x63, 0xf8, 0x63, 0xe0, 0xed, 0xd0, 0x1a, 0x8a, 0x48, + 0xae, 0x41, 0xb1, 0xd6, 0x77, 0x3d, 0xda, 0x6d, 0x6b, 0xbe, 0xe9, 0x8e, 0x80, 0x59, 0x71, 0x29, + 0xf9, 0x10, 0xce, 0x0b, 0x22, 0x29, 0x70, 0x44, 0x0f, 0x70, 0x59, 0xc3, 0x2d, 0x58, 0xb1, 0x16, + 0xa4, 0x98, 0xb2, 0x45, 0x97, 0x64, 0x53, 0x92, 0x1a, 0x54, 0x1a, 0x78, 0x4f, 0x2a, 0x1f, 0xf5, + 0xf5, 0x03, 0x91, 0x7c, 0x17, 0x25, 0x17, 0xbf, 0x43, 0xb5, 0xdd, 0xb8, 0xd0, 0x1a, 0x40, 0x27, + 0xf7, 0xe1, 0x6c, 0x1a, 0xc6, 0xe4, 0x71, 0x29, 0x79, 0x74, 0x6b, 0x80, 0x0b, 0x0a, 0xe6, 0x2c, + 0x2a, 0xb2, 0x03, 0xb3, 0xb5, 0x28, 0x0a, 0xbc, 0x9d, 0x7e, 0x44, 0x53, 0xa2, 0x4b, 0x1e, 0x34, + 0xc6, 0xe5, 0x52, 0x7c, 0x3d, 0x27, 0x26, 0xe3, 0x59, 0x27, 0xa6, 0x8c, 0x45, 0x98, 0x35, 0xc8, + 0x8e, 0xb8, 0xf1, 0xbb, 0x7d, 0xe2, 0x6d, 0x3b, 0x11, 0x50, 0x24, 0x0f, 0x74, 0x6b, 0xe1, 0xe1, + 0xc1, 0x01, 0x8d, 0x02, 0xbc, 0xb9, 0xc7, 0xb7, 0xef, 0x4c, 0xe1, 0x03, 0x74, 0x59, 0x79, 0xae, + 0x12, 0xdf, 0x37, 0xd4, 0xdc, 0x23, 0x35, 0x9e, 0xda, 0xf6, 0x51, 0x1e, 0x71, 0xfb, 0xe8, 0xc0, + 0x6c, 0xa3, 0xdb, 0x0e, 0x0e, 0x31, 0xb2, 0x51, 0x56, 0x6e, 0xea, 0x94, 0xca, 0xc9, 0x87, 0x2d, + 0xae, 0x38, 0x72, 0x86, 0x65, 0x55, 0x6f, 0x90, 0xb1, 0xf9, 0x37, 0xa0, 0x92, 0xee, 0xcb, 0x4f, + 0xf8, 0x58, 0xf1, 0x93, 0xb8, 0x66, 0xb3, 0x91, 0x4e, 0xb7, 0x85, 0xcc, 0x6b, 0x2f, 0xd2, 0x1a, + 0x49, 0x54, 0xba, 0xf2, 0x76, 0xac, 0xf6, 0x0e, 0xad, 0x5c, 0xc6, 0xb9, 0xac, 0x65, 0x6c, 0xfe, + 0x72, 0x0e, 0x66, 0xb9, 0x37, 0xe9, 0xb3, 0xaf, 0x2b, 0xbe, 0xa7, 0x09, 0x67, 0x79, 0x16, 0x98, + 0x6a, 0xdd, 0x09, 0xda, 0xe2, 0x37, 0xe0, 0xfc, 0x40, 0x57, 0xa0, 0x80, 0x5e, 0x92, 0x7e, 0xbc, + 0x03, 0x22, 0x7a, 0x2e, 0xfb, 0x23, 0x5b, 0xb7, 0xac, 0x01, 0x0a, 0xf3, 0x1f, 0xe5, 0x06, 0xf8, + 0x0b, 0xbd, 0x51, 0xd5, 0x04, 0x8d, 0x27, 0xd3, 0x04, 0x73, 0x1f, 0x4b, 0x13, 0xcc, 0x8f, 0xa2, + 0x09, 0x7e, 0x08, 0x53, 0x2d, 0xea, 0x30, 0x8d, 0x46, 0x04, 0x9b, 0x15, 0xb4, 0xd7, 0x62, 0x59, + 0x99, 0x94, 0x2f, 0x71, 0xa0, 0x6a, 0xc4, 0x08, 0x98, 0x68, 0xe1, 0xd1, 0x67, 0x96, 0xce, 0x41, + 0xdd, 0x34, 0xc6, 0x86, 0x6f, 0x1a, 0x66, 0x08, 0xb3, 0xcd, 0xe6, 0xfa, 0x92, 0xe7, 0xec, 0x76, + 0xfd, 0x30, 0xf2, 0xda, 0xcb, 0xdd, 0x07, 0x3e, 0x9b, 0x1c, 0xec, 0xaf, 0x12, 0xa3, 0x4c, 0xe2, + 0x27, 0x3f, 0xd7, 0x65, 0x89, 0xf0, 0x38, 0xed, 0x3e, 0xf0, 0xd1, 0x79, 0xc8, 0x8a, 0x49, 0xf4, + 0x85, 0x59, 0xce, 0x08, 0x28, 0xfe, 0x66, 0x0e, 0x26, 0x95, 0x36, 0x91, 0x2f, 0x42, 0x79, 0x3d, + 0xd8, 0x75, 0xba, 0xde, 0xcf, 0x38, 0xca, 0x99, 0x2f, 0xf6, 0x99, 0xaf, 0xc0, 0x2d, 0x0d, 0x0b, + 0x7d, 0x75, 0xa8, 0x73, 0xa0, 0xae, 0x36, 0xd6, 0x27, 0x16, 0x42, 0x95, 0x08, 0xe5, 0xfc, 0x08, + 0x11, 0xca, 0x7a, 0x78, 0x6f, 0xe1, 0xc9, 0xc3, 0x7b, 0xb5, 0x68, 0xdc, 0xb1, 0x27, 0x8c, 0xc6, + 0x35, 0x7f, 0x35, 0x07, 0x15, 0xf1, 0x98, 0xab, 0x3c, 0xb1, 0xfc, 0x6c, 0x3d, 0xfe, 0xa0, 0x37, + 0xee, 0x84, 0x3b, 0xb9, 0xc2, 0x6f, 0xfe, 0x6e, 0x15, 0x9f, 0xe6, 0x4c, 0x77, 0x87, 0x7c, 0x9a, + 0x53, 0x87, 0xa7, 0xc3, 0x15, 0xd2, 0x54, 0x56, 0x1a, 0xdf, 0xfc, 0x93, 0x5c, 0x9a, 0xb7, 0x50, + 0xe1, 0x5e, 0x86, 0x09, 0xfe, 0x16, 0x97, 0xf4, 0xa8, 0x16, 0x09, 0xa3, 0x10, 0x64, 0xc9, 0xb2, + 0x27, 0x09, 0x5c, 0x39, 0xed, 0x7d, 0x56, 0x72, 0x1b, 0xca, 0xe8, 0xa4, 0x52, 0x73, 0xdd, 0x80, + 0x86, 0xa1, 0xd0, 0xee, 0xf0, 0xc2, 0xf0, 0x11, 0xdd, 0xb1, 0xb9, 0x33, 0x8b, 0xe3, 0xba, 0x81, + 0xa5, 0xe1, 0x91, 0x45, 0x38, 0xa7, 0xf9, 0x44, 0x49, 0xfa, 0xb1, 0x64, 0x8b, 0x8a, 0xb0, 0x80, + 0x13, 0x67, 0x22, 0x3f, 0xbd, 0xb7, 0xa9, 0xcd, 0xff, 0x6d, 0xb0, 0xb5, 0xd6, 0xde, 0xff, 0x8c, + 0x85, 0xd4, 0xb0, 0x26, 0x9d, 0x60, 0x61, 0xfc, 0x07, 0x83, 0x3b, 0xc5, 0x8b, 0xe9, 0xf3, 0x16, + 0x8c, 0xf3, 0x97, 0xbf, 0x84, 0xfb, 0xb6, 0xca, 0x85, 0x17, 0x24, 0x97, 0x62, 0xfc, 0xfd, 0x30, + 0x4b, 0x10, 0x30, 0x3b, 0x5d, 0xf7, 0xcd, 0x47, 0x6d, 0x77, 0xd0, 0x29, 0x5f, 0x62, 0xa9, 0xc9, + 0x50, 0x47, 0x4b, 0xb2, 0x6d, 0x9c, 0x9e, 0x0c, 0xd5, 0xfc, 0xbf, 0x39, 0xde, 0x1e, 0x51, 0xa9, + 0x51, 0xb3, 0xfc, 0xbd, 0x02, 0x05, 0x7c, 0x63, 0x56, 0x49, 0xa5, 0x98, 0x7a, 0x5f, 0x16, 0xcb, + 0xd9, 0xba, 0x41, 0x59, 0xab, 0x46, 0x71, 0xa1, 0x38, 0x56, 0xd7, 0x0d, 0x62, 0x60, 0x0a, 0x6b, + 0xdf, 0xa5, 0xea, 0x72, 0xe8, 0xea, 0xd9, 0xc6, 0xb1, 0x9c, 0xdc, 0x56, 0x9c, 0xa9, 0xd5, 0x53, + 0x94, 0x83, 0x07, 0x8e, 0xcd, 0x9d, 0x78, 0x55, 0x69, 0x9b, 0xf8, 0x5d, 0x37, 0x60, 0x5a, 0x0f, + 0x90, 0x16, 0x96, 0x0e, 0xc6, 0x99, 0xa7, 0x82, 0xab, 0x55, 0x9d, 0x5a, 0x27, 0x22, 0x75, 0x98, + 0xd2, 0xa2, 0x60, 0xd5, 0xcc, 0xaf, 0x3c, 0x25, 0x8d, 0x3d, 0x98, 0xbe, 0x41, 0x27, 0x51, 0x4e, + 0xe9, 0xbf, 0x00, 0x15, 0xb1, 0x32, 0xe3, 0x80, 0x3a, 0xd4, 0x27, 0x97, 0x97, 0x2c, 0x75, 0x35, + 0xb5, 0x3d, 0x37, 0xb0, 0x10, 0x6a, 0x7e, 0xd7, 0x80, 0x4b, 0xe2, 0x45, 0x33, 0x8b, 0x86, 0x4c, + 0x71, 0xc5, 0x28, 0x3c, 0x9c, 0x8f, 0x5f, 0x24, 0xef, 0xc8, 0x6c, 0x57, 0xba, 0x80, 0x4c, 0x7f, + 0xa3, 0x3e, 0x25, 0x26, 0xe5, 0x18, 0xe6, 0xbb, 0x92, 0x59, 0xae, 0xde, 0x12, 0x59, 0xae, 0x72, + 0x27, 0x13, 0xc7, 0xeb, 0xc2, 0xa5, 0x5d, 0x99, 0xdd, 0xea, 0x3b, 0x39, 0x38, 0x9f, 0x51, 0xad, + 0xad, 0x2f, 0x3e, 0xa3, 0xc2, 0xa1, 0xae, 0x09, 0x07, 0x99, 0x06, 0x71, 0x68, 0xc7, 0x67, 0xca, + 0x8a, 0xdf, 0x36, 0xe0, 0xa2, 0x3e, 0x7b, 0x84, 0x01, 0xbc, 0x75, 0x8b, 0xbc, 0x0d, 0xe3, 0xf7, + 0xa8, 0xe3, 0x52, 0x19, 0xf7, 0x11, 0xa7, 0x14, 0x13, 0x47, 0xd2, 0xbc, 0x90, 0xb3, 0xfd, 0x13, + 0xbe, 0x94, 0xcf, 0x58, 0x82, 0x84, 0x2c, 0x89, 0xca, 0xf1, 0x3b, 0x31, 0x53, 0x5e, 0x0f, 0x65, + 0x7d, 0xea, 0x04, 0x6d, 0xfc, 0xf7, 0x0d, 0x78, 0xee, 0x04, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, + 0x81, 0xc3, 0x8d, 0x05, 0xa1, 0xe4, 0x3d, 0x98, 0x69, 0x89, 0xf0, 0x34, 0x39, 0x1c, 0x4a, 0x4a, + 0x79, 0x19, 0xb9, 0x66, 0xcb, 0x71, 0x49, 0x23, 0x93, 0x6b, 0x50, 0xbc, 0xe7, 0x87, 0x51, 0x37, + 0xc9, 0x50, 0x83, 0x47, 0x0e, 0x7b, 0x02, 0x66, 0xc5, 0xa5, 0x4c, 0x2d, 0xd0, 0xab, 0x29, 0x7c, + 0x30, 0x5e, 0x84, 0x71, 0x86, 0x13, 0xab, 0xf4, 0x38, 0x0f, 0xf0, 0xbd, 0x2d, 0xcf, 0xb5, 0x44, + 0x51, 0x6c, 0x4c, 0xe6, 0x32, 0xaf, 0x4a, 0xbe, 0x69, 0x40, 0x45, 0xe7, 0xfd, 0x49, 0x87, 0xe6, + 0x5d, 0x6d, 0x68, 0x9e, 0xcb, 0x1e, 0x9a, 0xe1, 0x63, 0x32, 0x90, 0x2c, 0x62, 0xa4, 0xb1, 0x30, + 0x61, 0x7c, 0xc9, 0x3f, 0x70, 0xbc, 0xae, 0x9a, 0xe0, 0xc0, 0x45, 0x88, 0x25, 0x4a, 0x94, 0xde, + 0xca, 0x0f, 0xed, 0x2d, 0xf3, 0xdb, 0x05, 0xb8, 0x64, 0xd1, 0x5d, 0x8f, 0x29, 0x48, 0x9b, 0xa1, + 0xd7, 0xdd, 0xd5, 0x2e, 0xb2, 0xcc, 0x54, 0x87, 0x0b, 0xf7, 0x3d, 0x06, 0x89, 0xfb, 0xfb, 0x35, + 0x28, 0x32, 0x29, 0xad, 0xf4, 0x39, 0x1a, 0x0c, 0x98, 0xa6, 0x87, 0x8f, 0xab, 0x2c, 0x26, 0xd7, + 0xc5, 0x1e, 0xa2, 0x38, 0x58, 0xb3, 0x3d, 0x24, 0xf5, 0x5c, 0x38, 0xdf, 0x47, 0x62, 0xa5, 0xaa, + 0x30, 0x44, 0xa9, 0x5a, 0x85, 0x73, 0x35, 0x97, 0xcb, 0x27, 0xa7, 0xb3, 0x11, 0x78, 0xdd, 0xb6, + 0xd7, 0x73, 0x3a, 0x52, 0x29, 0xe7, 0x8f, 0xa7, 0xc7, 0xe5, 0x76, 0x2f, 0x46, 0xb0, 0x32, 0xc9, + 0x58, 0x33, 0x96, 0xd6, 0x9a, 0x3c, 0x0b, 0xcb, 0x38, 0xb2, 0xc0, 0x66, 0xb8, 0xdd, 0x90, 0xa7, + 0x61, 0xb1, 0xe2, 0x62, 0x54, 0xe7, 0x30, 0xc6, 0xa2, 0xb5, 0xd2, 0xbc, 0x2f, 0x62, 0x16, 0xa4, + 0xff, 0x17, 0x0f, 0xc9, 0x88, 0x3a, 0x21, 0x1e, 0x1a, 0x68, 0x78, 0x09, 0x5d, 0xb3, 0x79, 0x8f, + 0xd1, 0x15, 0x07, 0xe8, 0xc2, 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0x64, 0x1e, 0x80, 0x7b, 0xd0, 0xe0, + 0x84, 0x28, 0x25, 0xca, 0x5f, 0x80, 0x50, 0xae, 0xfc, 0x29, 0x28, 0xe4, 0x1d, 0x38, 0xdb, 0x58, + 0x5c, 0x90, 0xc1, 0x08, 0x4b, 0x7e, 0xbb, 0x7f, 0x40, 0xbb, 0x11, 0x06, 0xc7, 0x94, 0xf9, 0x18, + 0xd2, 0xf6, 0x02, 0x9b, 0x05, 0x59, 0x68, 0x22, 0x24, 0x81, 0x07, 0xb4, 0x2d, 0xfa, 0x2e, 0x0d, + 0xb7, 0x6e, 0x7e, 0xc6, 0x42, 0x12, 0x94, 0xb6, 0xe1, 0x6a, 0xbb, 0x99, 0xb9, 0x32, 0xff, 0x1e, + 0x86, 0x24, 0x0c, 0xe0, 0x92, 0x1f, 0x87, 0x31, 0xfc, 0x29, 0x76, 0xdc, 0xb3, 0x19, 0x6c, 0x93, + 0xdd, 0xb6, 0xcd, 0x13, 0x6a, 0x20, 0x01, 0x59, 0x4e, 0x32, 0xe6, 0x3f, 0x81, 0x63, 0xad, 0x88, + 0x8a, 0xd5, 0x9f, 0x4a, 0x71, 0xa1, 0xac, 0x7e, 0x90, 0xcd, 0x91, 0x7b, 0x4e, 0xb8, 0x47, 0xdd, + 0x45, 0xf9, 0xd8, 0x61, 0x99, 0xcf, 0x91, 0x3d, 0x84, 0xe2, 0x33, 0x2e, 0x96, 0x82, 0xc2, 0xa4, + 0xc3, 0x72, 0xb8, 0x19, 0x8a, 0xaa, 0x08, 0x2b, 0xc8, 0x43, 0xeb, 0xd5, 0xb5, 0x44, 0x11, 0x4a, + 0x4b, 0x99, 0x30, 0x32, 0x70, 0xda, 0xfb, 0x34, 0xd8, 0xba, 0xf9, 0x69, 0x48, 0x4b, 0xfd, 0x1b, + 0x27, 0x8c, 0xc9, 0xaf, 0x15, 0xe3, 0x7c, 0x30, 0x1a, 0x32, 0xd3, 0x11, 0x13, 0x77, 0x00, 0x23, + 0xd1, 0x11, 0x13, 0x77, 0x00, 0x55, 0x47, 0x8c, 0x51, 0xe3, 0x74, 0xbd, 0xb9, 0x53, 0xd2, 0xf5, + 0x0e, 0xc9, 0x10, 0x2e, 0x3d, 0x49, 0x3f, 0x43, 0x8f, 0x25, 0x7c, 0x09, 0xca, 0xb5, 0x28, 0x72, + 0xda, 0x7b, 0xd4, 0xc5, 0xb4, 0xd0, 0xca, 0x2d, 0xa4, 0x23, 0xe0, 0xaa, 0x8f, 0x9a, 0x8a, 0xab, + 0x3c, 0x96, 0x32, 0x31, 0xc2, 0x63, 0x29, 0xf3, 0x30, 0xb1, 0xdc, 0x7d, 0xe8, 0xb1, 0x3e, 0x29, + 0x26, 0x19, 0x29, 0x3c, 0x0e, 0xd2, 0x5f, 0xd8, 0x40, 0x10, 0x79, 0x4b, 0xd1, 0x20, 0x4a, 0x89, + 0x2a, 0x2f, 0x9e, 0x69, 0x96, 0x8a, 0x84, 0x7a, 0xc8, 0x2d, 0xd1, 0xc9, 0x6d, 0x98, 0x90, 0xd6, + 0x33, 0x24, 0xea, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x04, 0x43, 0x58, 0xcf, 0xef, 0xe8, 0x41, + 0x2b, 0x93, 0x4a, 0x30, 0xb8, 0x12, 0xb4, 0xa2, 0x05, 0x83, 0x2b, 0xe1, 0x2b, 0xb1, 0x31, 0x54, + 0x3e, 0xd5, 0x18, 0xda, 0x82, 0xf2, 0x86, 0x13, 0x44, 0x1e, 0xdb, 0x8e, 0xba, 0x11, 0xcf, 0xe5, + 0x95, 0xd8, 0xea, 0x4a, 0x51, 0xfd, 0x05, 0x19, 0x14, 0xdd, 0x53, 0xf0, 0xf5, 0x68, 0xda, 0x04, + 0x4e, 0xd6, 0x32, 0xdc, 0x1a, 0x45, 0xe6, 0x49, 0xbc, 0x77, 0x54, 0x0e, 0xae, 0x44, 0x8b, 0xd4, + 0xf3, 0xfb, 0x41, 0x8f, 0xc8, 0x5b, 0x7c, 0x0c, 0xd0, 0x66, 0x9c, 0x41, 0x36, 0x98, 0xd2, 0x04, + 0xf5, 0x8a, 0x94, 0xe1, 0x18, 0x23, 0x92, 0xaf, 0x43, 0x99, 0xfd, 0x8f, 0x89, 0x8d, 0x3c, 0xca, + 0x73, 0x75, 0x25, 0x6e, 0x6e, 0xfa, 0x82, 0xe6, 0xd9, 0x8f, 0x9a, 0x34, 0xe2, 0x0b, 0x18, 0x19, + 0xa7, 0x0f, 0x5e, 0x34, 0x6e, 0xe6, 0x0f, 0x0d, 0xb8, 0x38, 0x84, 0xc7, 0xc8, 0xcf, 0x24, 0xcd, + 0x27, 0x1b, 0x92, 0x62, 0x9b, 0x8b, 0x0d, 0x49, 0x9d, 0x18, 0x72, 0x6b, 0xca, 0xce, 0xb2, 0x95, + 0xff, 0xd4, 0xb2, 0x6c, 0x99, 0x47, 0x06, 0x4c, 0x2a, 0x23, 0xfb, 0x14, 0x5f, 0x3f, 0x78, 0x45, + 0xa4, 0x9b, 0xcc, 0x27, 0x78, 0xa9, 0x47, 0x8f, 0x79, 0x7a, 0xc9, 0x6f, 0x00, 0xac, 0x38, 0x61, + 0x54, 0x6b, 0x47, 0xde, 0x43, 0x3a, 0x82, 0x18, 0x4b, 0xb2, 0x03, 0x38, 0x98, 0xbd, 0x95, 0x91, + 0x0d, 0x64, 0x07, 0x88, 0x19, 0x9a, 0x6b, 0x30, 0xde, 0xf4, 0x83, 0xa8, 0x7e, 0xc8, 0xf7, 0xa6, + 0x25, 0x1a, 0xb6, 0xd5, 0x13, 0x3a, 0x0f, 0x6d, 0xf5, 0xb6, 0x25, 0x8a, 0x98, 0x82, 0x78, 0xc7, + 0xa3, 0x1d, 0x57, 0xbd, 0x16, 0x7a, 0xc0, 0x00, 0x16, 0x87, 0x5f, 0x7f, 0x1f, 0x66, 0x64, 0xc6, + 0xbb, 0xd6, 0x4a, 0x13, 0x5b, 0x30, 0x03, 0x93, 0x5b, 0x0d, 0x6b, 0xf9, 0xce, 0x57, 0xed, 0x3b, + 0x9b, 0x2b, 0x2b, 0x95, 0x33, 0x64, 0x0a, 0x4a, 0x02, 0xb0, 0x58, 0xab, 0x18, 0xa4, 0x0c, 0xc5, + 0xe5, 0xb5, 0x66, 0x63, 0x71, 0xd3, 0x6a, 0x54, 0x72, 0xd7, 0x5f, 0x86, 0xe9, 0xe4, 0xd2, 0x07, + 0x4f, 0xbc, 0x27, 0x20, 0x6f, 0xd5, 0xb6, 0x2b, 0x67, 0x08, 0xc0, 0xf8, 0xc6, 0xfd, 0xc5, 0xe6, + 0xcd, 0x9b, 0x15, 0xe3, 0xfa, 0x17, 0x32, 0x5e, 0x9a, 0x66, 0x9c, 0x9a, 0xb4, 0xe7, 0x04, 0x4e, + 0x44, 0xf9, 0x67, 0x56, 0xfb, 0x9d, 0xc8, 0xeb, 0x75, 0xe8, 0xe3, 0x8a, 0x71, 0xfd, 0xad, 0x81, + 0x07, 0xa3, 0xc9, 0x79, 0x98, 0xdd, 0x5c, 0xab, 0xad, 0xd6, 0x97, 0xef, 0x6e, 0xae, 0x6f, 0x36, + 0xed, 0xd5, 0x5a, 0x6b, 0xf1, 0x5e, 0xe5, 0x0c, 0xab, 0xf0, 0xea, 0x7a, 0xb3, 0x65, 0x5b, 0x8d, + 0xc5, 0xc6, 0x5a, 0xab, 0x62, 0x5c, 0xff, 0x15, 0x03, 0xa6, 0xf5, 0x27, 0xf8, 0xc8, 0x55, 0xb8, + 0xb2, 0xd9, 0x6c, 0x58, 0x76, 0x6b, 0xfd, 0x7e, 0x63, 0xcd, 0xde, 0x6c, 0xd6, 0xee, 0x36, 0xec, + 0xcd, 0xb5, 0xe6, 0x46, 0x63, 0x71, 0xf9, 0xce, 0x72, 0x63, 0xa9, 0x72, 0x86, 0x54, 0xe1, 0x39, + 0x05, 0xc3, 0x6a, 0x2c, 0xae, 0x6f, 0x35, 0x2c, 0x7b, 0xa3, 0xd6, 0x6c, 0x6e, 0xaf, 0x5b, 0x4b, + 0x15, 0x83, 0x5c, 0x86, 0x0b, 0x19, 0x08, 0xab, 0x77, 0x6a, 0x95, 0xdc, 0x40, 0xd9, 0x5a, 0x63, + 0xbb, 0xb6, 0x62, 0xd7, 0xd7, 0x5b, 0x95, 0xfc, 0xf5, 0xf7, 0x99, 0x16, 0x92, 0xbc, 0x91, 0x41, + 0x8a, 0x50, 0x58, 0x5b, 0x5f, 0x6b, 0x54, 0xce, 0x90, 0x49, 0x98, 0xd8, 0x68, 0xac, 0x2d, 0x2d, + 0xaf, 0xdd, 0xe5, 0xdd, 0x5a, 0xdb, 0xd8, 0xb0, 0xd6, 0xb7, 0x1a, 0x4b, 0x95, 0x1c, 0xeb, 0xbb, + 0xa5, 0xc6, 0x1a, 0xab, 0x59, 0xfe, 0xba, 0xc9, 0xf3, 0x42, 0x6b, 0x69, 0x4d, 0x59, 0x6f, 0x35, + 0xbe, 0xd2, 0x6a, 0xac, 0x35, 0x97, 0xd7, 0xd7, 0x2a, 0x67, 0xae, 0x5f, 0x49, 0xe1, 0xc8, 0x91, + 0x68, 0x36, 0xef, 0x55, 0xce, 0x5c, 0xff, 0x3b, 0x39, 0x98, 0x54, 0x6e, 0x2b, 0xd8, 0x87, 0x37, + 0xd7, 0xee, 0xaf, 0xad, 0x6f, 0xaf, 0x55, 0xce, 0x90, 0x12, 0x8c, 0x35, 0x2c, 0x6b, 0xdd, 0xaa, + 0x18, 0x0c, 0xde, 0xdc, 0x5c, 0x5c, 0x6c, 0x34, 0x9b, 0x95, 0x1c, 0xb9, 0x00, 0x64, 0xd1, 0x6a, + 0xd4, 0x5a, 0x0d, 0x1b, 0x9b, 0xb6, 0x51, 0xb3, 0x6a, 0xab, 0xcd, 0x4a, 0x9e, 0x5c, 0x81, 0xb9, + 0x66, 0x6d, 0x75, 0xc5, 0xae, 0xb5, 0x5a, 0xd6, 0x72, 0x7d, 0xb3, 0xd5, 0x68, 0xda, 0xad, 0x75, + 0xdb, 0x5a, 0x5f, 0x69, 0x34, 0x2b, 0x05, 0xf2, 0x32, 0x7c, 0x6e, 0x58, 0xa9, 0xbd, 0x5d, 0xb3, + 0xd6, 0x96, 0xd7, 0xee, 0x36, 0x2b, 0x63, 0xe4, 0x22, 0x77, 0x1d, 0xb0, 0x6b, 0xcd, 0x66, 0xc3, + 0x6a, 0x2d, 0xaf, 0xaf, 0xd9, 0xcb, 0x6b, 0x77, 0xd6, 0x2b, 0xe3, 0xe4, 0x79, 0xb8, 0xa4, 0xd3, + 0xdb, 0xcd, 0x56, 0xad, 0xd5, 0x58, 0x6d, 0xac, 0xb5, 0x9a, 0x95, 0x09, 0x36, 0x4a, 0x58, 0xdc, + 0xb2, 0x6a, 0xcb, 0xad, 0xa6, 0x7d, 0xc7, 0x5a, 0x5f, 0x4d, 0x78, 0x34, 0x2b, 0x45, 0x36, 0xd0, + 0x88, 0xb0, 0xb8, 0xbe, 0xb6, 0xd6, 0x58, 0x6c, 0xad, 0x5b, 0x1c, 0xd5, 0x5e, 0xad, 0x6d, 0x6c, + 0xb0, 0x8e, 0x2e, 0x5d, 0xff, 0x3a, 0x94, 0x55, 0x8d, 0x04, 0xab, 0xa2, 0xfc, 0xde, 0xa0, 0x5d, + 0xd7, 0xeb, 0xee, 0x56, 0xce, 0xa4, 0x0b, 0xac, 0x7e, 0xb7, 0xcb, 0x0a, 0x70, 0x26, 0xa8, 0x05, + 0x2d, 0x1a, 0x1c, 0x78, 0x5d, 0xa6, 0x6c, 0x54, 0x72, 0xf5, 0xca, 0xf7, 0xff, 0xfc, 0x85, 0x33, + 0xdf, 0xff, 0xc1, 0x0b, 0xc6, 0x9f, 0xfc, 0xe0, 0x05, 0xe3, 0xbf, 0xfd, 0xe0, 0x05, 0x63, 0x67, + 0x1c, 0x57, 0xfd, 0xad, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xad, 0x58, 0x81, 0xf1, 0xb6, + 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -18938,6 +19059,45 @@ func (m *GithubConnectorSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SSODiagnosticInfo) 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 *SSODiagnosticInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSODiagnosticInfo) 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 len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if m.InfoType != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.InfoType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *TeamMapping) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -24532,6 +24692,25 @@ func (m *GithubConnectorSpecV3) Size() (n int) { return n } +func (m *SSODiagnosticInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.InfoType != 0 { + n += 1 + sovTypes(uint64(m.InfoType)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *TeamMapping) Size() (n int) { if m == nil { return 0 @@ -53093,6 +53272,110 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } return nil } +func (m *SSODiagnosticInfo) 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 ErrIntOverflowTypes + } + 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: SSODiagnosticInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSODiagnosticInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InfoType", wireType) + } + m.InfoType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InfoType |= SSOInfoType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *TeamMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/types/types.proto b/api/types/types.proto index c123c47bd1585..864b0f50bf423 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -2609,6 +2609,39 @@ message GithubConnectorSpecV3 { string Display = 5 [ (gogoproto.jsontag) = "display" ]; } +// SSOInfoType represents the SSO diagnostic info type. +enum SSOInfoType { + // Unknown info type. + UNKNOWN = 0; + // Error info type, used for reporting errors. + ERROR = 1; + // Success info type, used for marking successful flows. + SUCCESS = 2; + // Create user params, contains info about attempted user creation parameters. + CREATE_USER_PARAMS = 3; + // [SAML] Attributes to roles mapping. + SAML_ATTRIBUTES_TO_ROLES = 4; + // [SAML] Attributes to roles warnings. + SAML_ATTRIBUTES_TO_ROLES_WARNINGS = 5; + // [SAML] Assertion info. + SAML_ASSERTION_INFO = 6; + // [SAML] Attribute statements. + SAML_ATTRIBUTE_STATEMENTS = 7; + // [SAML] Traits calculated from assertions. + SAML_TRAITS_FROM_ASSERTIONS = 8; + // [SAML] Assertion-to-trait mapping as specified in the connector. + SAML_CONNECTOR_TRAIT_MAPPING = 9; +} + +// SSODiagnosticInfo is a single SSO diagnostic info entry. +message SSODiagnosticInfo { + // SSO Diagnostic info type. + SSOInfoType InfoType = 1 [ (gogoproto.jsontag) = "info_type" ]; + // Value is arbitrary string encoding of particular value. The meaning depends on particular SSO + // diagnostic info type. + bytes Value = 2 [ (gogoproto.jsontag) = "value" ]; +} + // TeamMapping represents a single team membership mapping. message TeamMapping { // Organization is a Github organization a user belongs to. From c78abc11bcba73e063b9a359c80d2e5fe5d8a7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:52:24 +0200 Subject: [PATCH 10/50] Make SSO diag info shared for all auth types. --- lib/auth/apiserver.go | 8 +++-- lib/auth/auth_with_roles.go | 22 ++++++++++++-- lib/auth/clt.go | 12 ++++---- lib/services/identity.go | 8 ++--- lib/services/local/users.go | 58 ++++++++++++++++++++++++++++--------- 5 files changed, 78 insertions(+), 30 deletions(-) diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index beb18388fbf2b..8011f0de52ca1 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -213,7 +213,6 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.POST("/:version/saml/requests/create", srv.withAuth(srv.createSAMLAuthRequest)) srv.POST("/:version/saml/requests/validate", srv.withAuth(srv.validateSAMLResponse)) srv.GET("/:version/saml/requests/get/:id", srv.withAuth(srv.getSAMLAuthRequest)) - srv.GET("/:version/saml/requests/diag/:id", srv.withAuth(srv.getSAMLDiagnosticInfo)) // Github connector srv.POST("/:version/github/connectors", srv.withAuth(srv.createGithubConnector)) @@ -224,6 +223,9 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.POST("/:version/github/requests/create", srv.withAuth(srv.createGithubAuthRequest)) srv.POST("/:version/github/requests/validate", srv.withAuth(srv.validateGithubAuthCallback)) + // SSO diag info + srv.GET("/:version/sso/diag/:auth/:id", srv.withAuth(srv.getSSODiagnosticInfo)) + // Provisioning tokens- Moved to grpc // DELETE IN 8.0 srv.GET("/:version/tokens", srv.withAuth(srv.getTokens)) @@ -1440,8 +1442,8 @@ func (s *APIServer) getSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r *h return request, nil } -func (s *APIServer) getSAMLDiagnosticInfo(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - info, err := auth.GetSAMLDiagnosticInfo(r.Context(), p.ByName("id")) +func (s *APIServer) getSSODiagnosticInfo(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { + info, err := auth.GetSSODiagnosticInfo(r.Context(), p.ByName("auth"), p.ByName("id")) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 9cfcd12aa4895..7e666d5418144 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2358,12 +2358,28 @@ func (a *ServerWithRoles) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return a.authServer.GetSAMLAuthRequest(id) } -func (a *ServerWithRoles) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { - if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { +func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { + var resource string + + switch authKind { + case types.KindSAML: + resource = types.KindSAMLRequest + break + case types.KindGithub: + resource = types.KindGithubRequest + break + case types.KindOIDC: + resource = types.KindOIDCRequest + break + default: + return nil, trace.BadParameter("unsupported authKind %q", authKind) + } + + if err := a.action(apidefaults.Namespace, resource, types.VerbRead); err != nil { return nil, trace.Wrap(err) } - return a.authServer.GetSAMLDiagnosticInfo(ctx, authRequestID) + return a.authServer.GetSSODiagnosticInfo(ctx, authKind, authRequestID) } // DeleteSAMLConnector deletes a SAML connector by name. diff --git a/lib/auth/clt.go b/lib/auth/clt.go index de4a9b05ab8c4..6df3800e36fdb 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1175,13 +1175,13 @@ func (c *Client) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error return response, nil } -// GetSAMLDiagnosticInfo returns SAML diagnostic info records. -func (c *Client) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { - out, err := c.Get(ctx, c.Endpoint("saml", "requests", "diag", authRequestID), url.Values{}) +// GetSSODiagnosticInfo returns SSO diagnostic info records. +func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { + out, err := c.Get(ctx, c.Endpoint("sso", "diag", authKind, authRequestID), url.Values{}) if err != nil { return nil, trace.Wrap(err) } - var response map[string]types.SsoDiagInfoEntry + var response []types.SSODiagnosticInfo if err := json.Unmarshal(out.Bytes(), &response); err != nil { return nil, trace.Wrap(err) } @@ -1782,8 +1782,8 @@ type IdentityService interface { // GetSAMLAuthRequest returns SAML auth request if found GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) - // GetSAMLDiagnosticInfo returns SAML diagnostic info records. - GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) + // GetSSODiagnosticInfo returns SSO diagnostic info records. + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/services/identity.go b/lib/services/identity.go index ea3ee8d66ff01..988d23525bfa6 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -205,11 +205,11 @@ type Identity interface { // GetSAMLAuthRequest returns SAML auth request if found GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) - // TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. - TraceSAMLDiagnosticInfo(ctx context.Context, authRequestID string, key string, value interface{}, extraInfo ...interface{}) error + // CreateSSODiagnosticInfo creates new SSO diagnostic info record. + CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error - // GetSAMLDiagnosticInfo returns SAML diagnostic info records. - GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) + // GetSSODiagnosticInfo returns SSO diagnostic info records. + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/services/local/users.go b/lib/services/local/users.go index f48f93787303e..52eee4e3b324f 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1215,22 +1215,36 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque return &req, nil } -// TraceSAMLDiagnosticInfo creates new SAML diagnostic info record. -func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authRequestID string, key string, value interface{}, extraInfo ...interface{}) error { +// CreateSSODiagnosticInfo creates new SAML diagnostic info record. +func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error { if authRequestID == "" { return trace.BadParameter("missing parameter authRequestID") } - jsonValue, err := json.Marshal(types.SsoDiagInfoEntry{ - Key: key, - Value: value, - ExtraInfo: extraInfo, - }) + + var prefix string + + switch authKind { + case types.KindSAML: + prefix = samlPrefix + break + case types.KindGithub: + prefix = githubPrefix + break + case types.KindOIDC: + prefix = oidcPrefix + break + + default: + return trace.BadParameter("unsupported authKind %q", authKind) + } + + jsonValue, err := json.Marshal(entry) if err != nil { return trace.Wrap(err) } item := backend.Item{ - Key: backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestID, uuid.New().String()), + Key: backend.Key(webPrefix, connectorsPrefix, prefix, requestsTracePrefix, authRequestID, uuid.New().String()), Value: jsonValue, Expires: backend.Expiry(s.Clock(), time.Minute*15), } @@ -1241,25 +1255,41 @@ func (s *IdentityService) TraceSAMLDiagnosticInfo(ctx context.Context, authReque return nil } -// GetSAMLDiagnosticInfo returns SAML diagnostic info records. -func (s *IdentityService) GetSAMLDiagnosticInfo(ctx context.Context, authRequestID string) (map[string]types.SsoDiagInfoEntry, error) { +// GetSSODiagnosticInfo returns SSO diagnostic info records. +func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { if authRequestID == "" { return nil, trace.BadParameter("missing parameter id") } + var prefix string + + switch authKind { + case types.KindSAML: + prefix = samlPrefix + break + case types.KindGithub: + prefix = githubPrefix + break + case types.KindOIDC: + prefix = oidcPrefix + break + + default: + return nil, trace.BadParameter("unsupported authKind %q", authKind) + } - startKey := backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsTracePrefix, authRequestID) + startKey := backend.Key(webPrefix, connectorsPrefix, prefix, requestsTracePrefix, authRequestID) result, err := s.GetRange(ctx, startKey, backend.RangeEnd(startKey), backend.NoLimit) if err != nil { return nil, trace.Wrap(err) } - out := make(map[string]types.SsoDiagInfoEntry) + var out []types.SSODiagnosticInfo for _, item := range result.Items { - var req types.SsoDiagInfoEntry + var req types.SSODiagnosticInfo if err := json.Unmarshal(item.Value, &req); err != nil { return nil, trace.Wrap(err) } - out[req.Key] = req + out = append(out, req) } return out, nil From 354eda934a988ecd597201f06c34a91188259fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:54:08 +0200 Subject: [PATCH 11/50] Rename function for clarity. --- lib/web/apiserver.go | 2 +- lib/web/saml.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 69a85648fa761..b8f74d2d7f060 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1331,7 +1331,7 @@ func ConstructSSHResponse(response AuthParams) (*url.URL, error) { return u, nil } -func returnErrorToClient(clientRedirectURL string, errReply error) (*url.URL, error) { +func redirectURLWithError(clientRedirectURL string, errReply error) (*url.URL, error) { u, err := url.Parse(clientRedirectURL) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/web/saml.go b/lib/web/saml.go index a867ff65a2fa7..a5d7a0337873c 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -109,7 +109,7 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil { if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(requestID); errGet == nil { - if url, errEnc := returnErrorToClient(request.ClientRedirectURL, err); errEnc == nil { + if url, errEnc := redirectURLWithError(request.ClientRedirectURL, err); errEnc == nil { return url.String() } } From af11fd595609ba2c5c515af99359be013f6dc177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:54:28 +0200 Subject: [PATCH 12/50] Error handling fixes. --- lib/client/redirect.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/client/redirect.go b/lib/client/redirect.go index 1e6d954063300..abe99dfed41e0 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -162,7 +162,7 @@ func (rd *Redirector) Start() error { response, err := rd.IssueSSOLoginConsoleRequest(req) if err != nil { - return err + return trace.Wrap(err) } // notice late binding of the redirect URL here, it is referenced @@ -225,7 +225,7 @@ func (rd *Redirector) callback(w http.ResponseWriter, r *http.Request) (*auth.SS if r.URL.Query().Has("err") { err := r.URL.Query().Get("err") - return nil, trace.Errorf("sso flow failed, error: %v", err) + return nil, trace.Errorf("received error: %v", err) } // Decrypt ciphertext to get login response. From e4c585fc803742b6f5df9d742ba35e0edec43f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:55:15 +0200 Subject: [PATCH 13/50] Use custom marshalling for createUserParams type. --- lib/auth/github.go | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/lib/auth/github.go b/lib/auth/github.go index cb271b954eac3..be67eacc24c30 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -334,26 +334,30 @@ type createUserParams struct { sessionTTL time.Duration } -func (params createUserParams) toMap() map[string]interface{} { - result := map[string]interface{}{} - - result["connectorName"] = params.connectorName - result["username"] = params.username - result["roles"] = params.roles - result["traits"] = params.traits - result["sessionTTL"] = params.sessionTTL - - if len(params.logins) > 0 { - result["logins"] = params.logins - } - if len(params.kubeGroups) > 0 { - result["kubeGroups"] = params.kubeGroups - } - if len(params.kubeUsers) > 0 { - result["kubeUsers"] = params.kubeUsers +func (cup createUserParams) MarshalJSON() ([]byte, error) { + j, err := json.Marshal(struct { + ConnectorName string `json:"connector_name"` + Username string `json:"username"` + Logins []string `json:"logins"` + KubeGroups []string `json:"kube_groups,omitempty"` + KubeUsers []string `json:"kube_users,omitempty"` + Roles []string `json:"roles"` + Traits map[string][]string `json:"traits"` + SessionTTL time.Duration `json:"session_ttl"` + }{ + ConnectorName: cup.connectorName, + Username: cup.username, + Logins: cup.logins, + KubeGroups: cup.kubeGroups, + KubeUsers: cup.kubeUsers, + Roles: cup.roles, + Traits: cup.traits, + SessionTTL: cup.sessionTTL, + }) + if err != nil { + return nil, err } - - return result + return j, nil } func (a *Server) calculateGithubUser(connector types.GithubConnector, claims *types.GithubClaims, request *services.GithubAuthRequest) (*createUserParams, error) { From f14961cb918cedc7bf176116576242692453dfeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 14:55:57 +0200 Subject: [PATCH 14/50] Refactoring to match updated API, cleanups. --- lib/auth/saml.go | 188 ++++++++++++++++++++++++++--------------------- 1 file changed, 105 insertions(+), 83 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 254c7da3ac799..b9abcda49cb7d 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -24,8 +24,6 @@ import ( "fmt" "io" - "github.com/google/go-cmp/cmp" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" @@ -37,6 +35,7 @@ import ( "github.com/gravitational/teleport/lib/utils" "github.com/beevik/etree" + "github.com/google/go-cmp/cmp" "github.com/gravitational/trace" saml2 "github.com/russellhaering/gosaml2" ) @@ -125,38 +124,35 @@ func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. } func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLAuthRequest) (types.SAMLConnector, *saml2.SAMLServiceProvider, error) { - var connector types.SAMLConnector - var provider *saml2.SAMLServiceProvider - var err error - if req.SSOTestFlow { // stateless test flow - connector, err = types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) + connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) if err != nil { return nil, nil, err } // validate, set defaults for connector - err := services.ValidateSAMLConnector(connector) + err = services.ValidateSAMLConnector(connector) if err != nil { return nil, nil, err } // we don't want to cache the provider. construct it directly instead of using a.getSAMLProvider() - provider, err = services.GetSAMLServiceProvider(connector, a.clock) - if err != nil { - return nil, nil, trace.Wrap(err) - } - } else { - // regular execution flow - connector, err = a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) - if err != nil { - return nil, nil, trace.Wrap(err) - } - provider, err = a.getSAMLProvider(connector) + provider, err := services.GetSAMLServiceProvider(connector, a.clock) if err != nil { return nil, nil, trace.Wrap(err) } + return connector, provider, nil + } + + // regular execution flow + connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true) + if err != nil { + return nil, nil, trace.Wrap(err) + } + provider, err := a.getSAMLProvider(connector) + if err != nil { + return nil, nil, trace.Wrap(err) } return connector, provider, nil @@ -192,17 +188,36 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo p.traits = services.SAMLAssertionsToTraits(assertionInfo) - _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLTraitsFromAssertions, p.traits) - _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLConnectorTraitMapping, connector.GetTraitMappings()) + diagInfo := func(infoType types.SSOInfoType, value interface{}) { + entry, err := types.NewSSODiagnosticInfo(infoType, value) + if err != nil { + log.WithError(err).Warn("Failed to serialize SSO diag info.") + } + + err = a.Identity.CreateSSODiagnosticInfo(context.Background(), types.KindSAML, request.ID, *entry) + if err != nil { + log.WithError(err).Warn("Failed to create SSO diag info.") + } + } + + diagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) + diagInfo(types.SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING, connector.GetTraitMappings()) var warnings []string warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits) if len(p.roles) == 0 { + type warn struct { + Message string `json:"message"` + Warnings []string `json:"warnings,omitempty"` + } + if len(warnings) != 0 { - _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLAttributesToRolesWarnings, "No roles mapped for the user", warnings) + diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{ + Message: "No roles mapped for the user", + Warnings: warnings}) log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) } else { - _ = a.Identity.TraceSAMLDiagnosticInfo(context.Background(), request.ID, DiagInfoSAMLAttributesToRolesWarnings, "No roles mapped for the user. The mappings may contain typos.") + diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{Message: "No roles mapped for the user. The mappings may contain typos."}) } return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName()) } @@ -360,10 +375,12 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e Method: events.LoginMethodSAML, } - re, request, err := a.validateSAMLResponse(samlResponse) + auxInfo := validateSAMLAuxInfo{} - if re != nil && re.attributeStatements != nil { - attributes, err := apievents.EncodeMapStrings(re.attributeStatements) + auth, err := a.validateSAMLResponse(samlResponse, &auxInfo) + + if auxInfo.attributeStatements != nil { + attributes, err := apievents.EncodeMapStrings(auxInfo.attributeStatements) if err != nil { event.Status.UserMessage = fmt.Sprintf("Failed to encode identity attributes: %v", err.Error()) log.WithError(err).Debug("Failed to encode identity attributes.") @@ -372,13 +389,10 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } } - testFlow := request != nil && request.SSOTestFlow - if err != nil { - if testFlow { + event.Code = events.UserSSOLoginFailureCode + if auxInfo.ssoTestFlow { event.Code = events.UserSSOTestFlowLoginFailureCode - } else { - event.Code = events.UserSSOLoginFailureCode } event.Status.Success = false event.Status.Error = trace.Unwrap(err).Error() @@ -390,11 +404,10 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e } event.Status.Success = true - event.User = re.auth.Username - if testFlow { + event.User = auth.Username + event.Code = events.UserSSOLoginCode + if auxInfo.ssoTestFlow { event.Code = events.UserSSOTestFlowLoginCode - } else { - event.Code = events.UserSSOLoginCode } if err := a.emitter.EmitAuditEvent(a.closeCtx, event); err != nil { @@ -404,48 +417,55 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e if err != nil { return nil, err } - return &re.auth, nil + return auth, nil } -type samlAuthResponse struct { - auth SAMLAuthResponse +type validateSAMLAuxInfo struct { attributeStatements map[string][]string + ssoTestFlow bool } -const ( - DiagInfoError = "common.error" - DiagInfoResult = "common.result" - DiagInfoCreateUserParams = "common.createUserParams" - DiagInfoSAMLAttributesToRoles = "SAML.attributesToRoles" - DiagInfoSAMLAttributesToRolesWarnings = "SAML.attributesToRolesWarnings" - DiagInfoSAMLAssertionInfo = "SAML.assertionInfo" - DiagInfoSAMLAttributeStatements = "SAML.attributeStatements" - DiagInfoSAMLTraitsFromAssertions = "SAML.traits" - DiagInfoSAMLConnectorTraitMapping = "SAML.connector_traits" -) - -func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, *services.SAMLAuthRequest, error) { +func (a *Server) validateSAMLResponse(samlResponse string, auxInfo *validateSAMLAuxInfo) (*SAMLAuthResponse, error) { ctx := context.TODO() requestID, err := ParseSAMLInResponseTo(samlResponse) if err != nil { - return nil, nil, trace.Wrap(err) + return nil, trace.Wrap(err) } - traceErr := func(msg string, errInfo error) { - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoError, msg, errInfo.Error()) + diagInfo := func(infoType types.SSOInfoType, value interface{}) { + entry, err := types.NewSSODiagnosticInfo(infoType, value) + if err != nil { + log.WithError(err).Warn("Failed to serialize SSO diag info.") + } + + err = a.Identity.CreateSSODiagnosticInfo(context.Background(), types.KindSAML, requestID, *entry) + if err != nil { + log.WithError(err).Warn("Failed to create SSO diag info.") + } + } + + traceErr := func(msg string, errDetails error) { + type errInfo struct { + Message string `json:"message"` + Error string `json:"error"` + } + + diagInfo(types.SSOInfoType_ERROR, errInfo{Message: msg, Error: errDetails.Error()}) } request, err := a.Identity.GetSAMLAuthRequest(requestID) if err != nil { traceErr("Failed to get SAML Auth Request", err) - return nil, request, trace.Wrap(err) + return nil, trace.Wrap(err) } + auxInfo.ssoTestFlow = request.SSOTestFlow + connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { traceErr("Failed to get SAML connector and provider", err) - return nil, request, err + return nil, err } assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse) @@ -453,46 +473,48 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * errV := trace.AccessDenied( "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err) traceErr("Failed to retrieve assertion info. This may indicate IdP configuration error.", errV) - return nil, request, errV + return nil, errV } - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAssertionInfo, assertionInfo) + diagInfo(types.SSOInfoType_SAML_ASSERTION_INFO, assertionInfo) if assertionInfo.WarningInfo.InvalidTime { err = trace.AccessDenied("invalid time in SAML assertion info") traceErr("SAML assertion info contained warning: invalid time.", err) - return nil, request, err + return nil, err } if assertionInfo.WarningInfo.NotInAudience { err = trace.AccessDenied("no audience in SAML assertion info") traceErr("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.", err) - return nil, request, err + return nil, err } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) - re := &samlAuthResponse{ - attributeStatements: make(map[string][]string), - } + + attributeStatements := map[string][]string{} + for key, val := range assertionInfo.Values { var vals []string for _, vv := range val.Values { vals = append(vals, vv.Value) } log.Debugf("SAML assertion: %q: %q.", key, vals) - re.attributeStatements[key] = vals + attributeStatements[key] = vals } - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAttributeStatements, re.attributeStatements) + auxInfo.attributeStatements = attributeStatements + + diagInfo(types.SSOInfoType_SAML_ATTRIBUTE_STATEMENTS, attributeStatements) log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoSAMLAttributesToRoles, connector.GetAttributesToRoles()) + diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES, connector.GetAttributesToRoles()) if len(connector.GetAttributesToRoles()) == 0 { err = trace.BadParameter("no attributes to roles mapping, check connector documentation") traceErr("Attributes-to-roles mapping is empty, SSO user will never have any roles.", err) - return re, request, err + return nil, err } log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles())) @@ -502,19 +524,19 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * params, err := a.calculateSAMLUser(connector, *assertionInfo, request) if err != nil { traceErr("Failed to calculate user attributes.", err) - return re, request, trace.Wrap(err) + return nil, trace.Wrap(err) } - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoCreateUserParams, params.toMap()) + diagInfo(types.SSOInfoType_CREATE_USER_PARAMS, params) user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { traceErr("Failed to create user from provided parameters.", err) - return re, request, trace.Wrap(err) + return nil, trace.Wrap(err) } // Auth was successful, return session, certificate, etc. to caller. - re.auth = SAMLAuthResponse{ + auth := &SAMLAuthResponse{ Req: *request, Identity: types.ExternalIdentity{ ConnectorID: params.connectorName, @@ -525,8 +547,8 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * // In test flow skip signing and creating web sessions. if request.SSOTestFlow { - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoResult, "success") - return re, request, nil + diagInfo(types.SSOInfoType_SUCCESS, "test flow") + return auth, nil } // If the request is coming from a browser, create a web session. @@ -541,10 +563,10 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * if err != nil { traceErr("Failed to create web session.", err) - return re, request, trace.Wrap(err) + return nil, trace.Wrap(err) } - re.auth.Session = session + auth.Session = session } // If a public key was provided, sign it and return a certificate. @@ -552,15 +574,15 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster) if err != nil { traceErr("Failed to create session certificate.", err) - return nil, request, trace.Wrap(err) + return nil, trace.Wrap(err) } clusterName, err := a.GetClusterName() if err != nil { traceErr("Failed to obtain cluster name.", err) - return nil, request, trace.Wrap(err) + return nil, trace.Wrap(err) } - re.auth.Cert = sshCert - re.auth.TLSCert = tlsCert + auth.Cert = sshCert + auth.TLSCert = tlsCert // Return the host CA for this cluster only. authority, err := a.GetCertAuthority(ctx, types.CertAuthID{ @@ -569,11 +591,11 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, * }, false) if err != nil { traceErr("Failed to obtain cluster's host CA.", err) - return nil, request, trace.Wrap(err) + return nil, trace.Wrap(err) } - re.auth.HostSigners = append(re.auth.HostSigners, authority) + auth.HostSigners = append(auth.HostSigners, authority) } - _ = a.Identity.TraceSAMLDiagnosticInfo(ctx, requestID, DiagInfoResult, "success") - return re, request, nil + diagInfo(types.SSOInfoType_SUCCESS, "full flow") + return auth, nil } From bfeca4ce4c5cdd97e73468999ab7ed1c9fe2a5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 15:19:45 +0200 Subject: [PATCH 15/50] Lint. --- api/types/sso_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/types/sso_test.go b/api/types/sso_test.go index a1f53bb9ad46b..58fe019d7f420 100644 --- a/api/types/sso_test.go +++ b/api/types/sso_test.go @@ -1,8 +1,9 @@ package types import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) func TestSSODiagnosticInfo_GetValue(t *testing.T) { From fd76564c5ffe62716daaee040e676c5367f36618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:04:34 +0200 Subject: [PATCH 16/50] Add negative test case. --- api/types/sso_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/types/sso_test.go b/api/types/sso_test.go index 58fe019d7f420..01c3a772a04f0 100644 --- a/api/types/sso_test.go +++ b/api/types/sso_test.go @@ -42,6 +42,12 @@ func TestSSODiagnosticInfo_GetValue(t *testing.T) { want: map[string]interface{}{"Message": "oh!", "Error": "no..."}, wantErr: false, }, + { + name: "bad JSON", + info: &SSODiagnosticInfo{}, + want: nil, + wantErr: true, + }, } for _, tt := range tests { From d6d2c4a4ecd6b2adedb5c101f653e5159a5fd348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:17:46 +0200 Subject: [PATCH 17/50] Add missing argument - post-merge cleanup. --- lib/teleterm/clusters/cluster_auth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/teleterm/clusters/cluster_auth.go b/lib/teleterm/clusters/cluster_auth.go index 3c766d2bcfa67..9815b26872a98 100644 --- a/lib/teleterm/clusters/cluster_auth.go +++ b/lib/teleterm/clusters/cluster_auth.go @@ -136,7 +136,7 @@ func (c *Cluster) SSOLogin(ctx context.Context, providerType, providerName strin Protocol: providerType, BindAddr: c.clusterClient.BindAddr, Browser: c.clusterClient.Browser, - }) + }, nil) if err != nil { return trace.Wrap(err) } From 890fd8fa124cc5f0a75d524241f2f53b4568ab9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:19:34 +0200 Subject: [PATCH 18/50] Extend several methods with ctx param. --- lib/auth/apiserver.go | 4 ++-- lib/auth/auth_with_roles.go | 8 ++++---- lib/auth/clt.go | 12 ++++++------ lib/auth/saml.go | 10 ++++------ lib/services/identity.go | 2 +- lib/services/local/users.go | 4 ++-- lib/web/apiserver_test.go | 2 +- lib/web/saml.go | 4 ++-- 8 files changed, 22 insertions(+), 24 deletions(-) diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index 8011f0de52ca1..5754ccbb86b31 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -1435,7 +1435,7 @@ func (s *APIServer) createSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r } func (s *APIServer) getSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - request, err := auth.GetSAMLAuthRequest(p.ByName("id")) + request, err := auth.GetSAMLAuthRequest(r.Context(), p.ByName("id")) if err != nil { return nil, trace.Wrap(err) } @@ -1480,7 +1480,7 @@ func (s *APIServer) validateSAMLResponse(auth ClientI, w http.ResponseWriter, r if err := httplib.ReadJSON(r, &req); err != nil { return nil, trace.Wrap(err) } - response, err := auth.ValidateSAMLResponse(req.Response) + response, err := auth.ValidateSAMLResponse(r.Context(), req.Response) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 7e666d5418144..92c48e9441ede 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2345,17 +2345,17 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (* return samlReq, nil } -func (a *ServerWithRoles) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) { +func (a *ServerWithRoles) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) { // auth callback is it's own authz, no need to check extra permissions - return a.authServer.ValidateSAMLResponse(re) + return a.authServer.ValidateSAMLResponse(ctx, re) } -func (a *ServerWithRoles) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { +func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) } - return a.authServer.GetSAMLAuthRequest(id) + return a.authServer.GetSAMLAuthRequest(ctx, id) } func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 6df3800e36fdb..ebea885807683 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1163,8 +1163,8 @@ func (c *Client) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. } // GetSAMLAuthRequest gets SAML AuthnRequest -func (c *Client) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { - out, err := c.Get(context.Background(), c.Endpoint("saml", "requests", "get", id), url.Values{}) +func (c *Client) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { + out, err := c.Get(ctx, c.Endpoint("saml", "requests", "get", id), url.Values{}) if err != nil { return nil, trace.Wrap(err) } @@ -1189,8 +1189,8 @@ func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, auth } // ValidateSAMLResponse validates response returned by SAML identity provider -func (c *Client) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) { - out, err := c.PostJSON(context.TODO(), c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{ +func (c *Client) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) { + out, err := c.PostJSON(ctx, c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{ Response: re, }) if err != nil { @@ -1777,10 +1777,10 @@ type IdentityService interface { CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error) // ValidateSAMLResponse validates SAML auth response - ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) + ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) // GetSAMLAuthRequest returns SAML auth request if found - GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) + GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) // GetSSODiagnosticInfo returns SSO diagnostic info records. GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index b9abcda49cb7d..68aa60dab96d7 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -367,7 +367,7 @@ type SAMLAuthResponse struct { } // ValidateSAMLResponse consumes attribute statements from SAML identity provider -func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, error) { +func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) (*SAMLAuthResponse, error) { event := &apievents.UserLogin{ Metadata: apievents.Metadata{ Type: events.UserLoginEvent, @@ -377,7 +377,7 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e auxInfo := validateSAMLAuxInfo{} - auth, err := a.validateSAMLResponse(samlResponse, &auxInfo) + auth, err := a.validateSAMLResponse(ctx, samlResponse, &auxInfo) if auxInfo.attributeStatements != nil { attributes, err := apievents.EncodeMapStrings(auxInfo.attributeStatements) @@ -425,9 +425,7 @@ type validateSAMLAuxInfo struct { ssoTestFlow bool } -func (a *Server) validateSAMLResponse(samlResponse string, auxInfo *validateSAMLAuxInfo) (*SAMLAuthResponse, error) { - ctx := context.TODO() - +func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, auxInfo *validateSAMLAuxInfo) (*SAMLAuthResponse, error) { requestID, err := ParseSAMLInResponseTo(samlResponse) if err != nil { return nil, trace.Wrap(err) @@ -454,7 +452,7 @@ func (a *Server) validateSAMLResponse(samlResponse string, auxInfo *validateSAML diagInfo(types.SSOInfoType_ERROR, errInfo{Message: msg, Error: errDetails.Error()}) } - request, err := a.Identity.GetSAMLAuthRequest(requestID) + request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID) if err != nil { traceErr("Failed to get SAML Auth Request", err) return nil, trace.Wrap(err) diff --git a/lib/services/identity.go b/lib/services/identity.go index 988d23525bfa6..66f513ddcda02 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -203,7 +203,7 @@ type Identity interface { CreateSAMLAuthRequest(req SAMLAuthRequest, ttl time.Duration) error // GetSAMLAuthRequest returns SAML auth request if found - GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error) + GetSAMLAuthRequest(ctx context.Context, id string) (*SAMLAuthRequest, error) // CreateSSODiagnosticInfo creates new SSO diagnostic info record. CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 52eee4e3b324f..600b95f2be9d1 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1200,11 +1200,11 @@ func (s *IdentityService) CreateSAMLAuthRequest(req services.SAMLAuthRequest, tt } // GetSAMLAuthRequest returns SAML auth request if found -func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) { +func (s *IdentityService) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { if id == "" { return nil, trace.BadParameter("missing parameter id") } - item, err := s.Get(context.TODO(), backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id)) + item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id)) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 7c8089b67054c..7d1abeaa5550a 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -566,7 +566,7 @@ func (s *WebSuite) TestSAMLSuccess(c *C) { id := doc.Root().SelectAttr("ID") c.Assert(id, NotNil) - authRequest, err := s.server.Auth().GetSAMLAuthRequest(id.Value) + authRequest, err := s.server.Auth().GetSAMLAuthRequest(context.Background(), id.Value) c.Assert(err, IsNil) // now swap the request id to the hardcoded one in fixtures diff --git a/lib/web/saml.go b/lib/web/saml.go index a5d7a0337873c..8abea976bfe61 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -98,7 +98,7 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P return client.LoginFailedRedirectURL } - response, err := h.cfg.ProxyClient.ValidateSAMLResponse(samlResponse) + response, err := h.cfg.ProxyClient.ValidateSAMLResponse(r.Context(), samlResponse) if err != nil { logger.WithError(err).Error("Error while processing callback.") @@ -108,7 +108,7 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P // // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil { - if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(requestID); errGet == nil { + if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(r.Context(), requestID); errGet == nil { if url, errEnc := redirectURLWithError(request.ClientRedirectURL, err); errEnc == nil { return url.String() } From a931d9cd80e8f55ba0b7fd1778100599ff93ba7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:29:31 +0200 Subject: [PATCH 19/50] Add missing trace.Wrap() calls --- lib/auth/github.go | 2 +- lib/auth/saml.go | 16 ++++++++-------- lib/services/saml.go | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/auth/github.go b/lib/auth/github.go index be67eacc24c30..cb6ca2060f7c1 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -355,7 +355,7 @@ func (cup createUserParams) MarshalJSON() ([]byte, error) { SessionTTL: cup.sessionTTL, }) if err != nil { - return nil, err + return nil, trace.Wrap(err) } return j, nil } diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 68aa60dab96d7..e0013b2d19d35 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -415,7 +415,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) } if err != nil { - return nil, err + return nil, trace.Wrap(err) } return auth, nil } @@ -463,15 +463,15 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { traceErr("Failed to get SAML connector and provider", err) - return nil, err + return nil, trace.Wrap(err) } assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse) if err != nil { - errV := trace.AccessDenied( + err = trace.AccessDenied( "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err) - traceErr("Failed to retrieve assertion info. This may indicate IdP configuration error.", errV) - return nil, errV + traceErr("Failed to retrieve assertion info. This may indicate IdP configuration error.", err) + return nil, trace.Wrap(err) } diagInfo(types.SSOInfoType_SAML_ASSERTION_INFO, assertionInfo) @@ -479,13 +479,13 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, if assertionInfo.WarningInfo.InvalidTime { err = trace.AccessDenied("invalid time in SAML assertion info") traceErr("SAML assertion info contained warning: invalid time.", err) - return nil, err + return nil, trace.Wrap(err) } if assertionInfo.WarningInfo.NotInAudience { err = trace.AccessDenied("no audience in SAML assertion info") traceErr("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.", err) - return nil, err + return nil, trace.Wrap(err) } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) @@ -512,7 +512,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, if len(connector.GetAttributesToRoles()) == 0 { err = trace.BadParameter("no attributes to roles mapping, check connector documentation") traceErr("Attributes-to-roles mapping is empty, SSO user will never have any roles.", err) - return nil, err + return nil, trace.Wrap(err) } log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles())) diff --git a/lib/services/saml.go b/lib/services/saml.go index ef17d22bd38e8..9174a13d23c05 100644 --- a/lib/services/saml.go +++ b/lib/services/saml.go @@ -162,7 +162,7 @@ func CheckSAMLEntityDescriptor(entityDescriptor string) ([]*x509.Certificate, er func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) { roots, errEd := CheckSAMLEntityDescriptor(sc.GetEntityDescriptor()) if errEd != nil { - return nil, errEd + return nil, trace.Wrap(errEd) } certStore := dsig.MemoryX509CertificateStore{Roots: roots} From dd69d7180b438dfe6120cf47df99988bb390f108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:33:48 +0200 Subject: [PATCH 20/50] Use existing ctx for CreateSSODiagnosticInfo call --- lib/auth/saml.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index e0013b2d19d35..3574f31406a21 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -178,7 +178,7 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } -func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { +func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { var err error p := createUserParams{ @@ -194,7 +194,7 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo log.WithError(err).Warn("Failed to serialize SSO diag info.") } - err = a.Identity.CreateSSODiagnosticInfo(context.Background(), types.KindSAML, request.ID, *entry) + err = a.Identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, request.ID, *entry) if err != nil { log.WithError(err).Warn("Failed to create SSO diag info.") } @@ -437,7 +437,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, log.WithError(err).Warn("Failed to serialize SSO diag info.") } - err = a.Identity.CreateSSODiagnosticInfo(context.Background(), types.KindSAML, requestID, *entry) + err = a.Identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, requestID, *entry) if err != nil { log.WithError(err).Warn("Failed to create SSO diag info.") } @@ -519,7 +519,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, // Calculate (figure out name, roles, traits, session TTL) of user and // create the user in the backend. - params, err := a.calculateSAMLUser(connector, *assertionInfo, request) + params, err := a.calculateSAMLUser(ctx, connector, *assertionInfo, request) if err != nil { traceErr("Failed to calculate user attributes.", err) return nil, trace.Wrap(err) From d9d2fb3c10b0bfbe4286399cdcc472549c7960a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 16:37:30 +0200 Subject: [PATCH 21/50] Use var. --- lib/auth/saml.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 3574f31406a21..960f0d5f1681b 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -375,7 +375,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) Method: events.LoginMethodSAML, } - auxInfo := validateSAMLAuxInfo{} + var auxInfo validateSAMLAuxInfo auth, err := a.validateSAMLResponse(ctx, samlResponse, &auxInfo) From 31ed9751c6d99510dbfadab40a8a77dc576aebd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 17:03:38 +0200 Subject: [PATCH 22/50] Linter. --- lib/auth/auth_with_roles.go | 3 --- lib/services/local/users.go | 8 -------- 2 files changed, 11 deletions(-) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 92c48e9441ede..364e3b16ead59 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2364,13 +2364,10 @@ func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind str switch authKind { case types.KindSAML: resource = types.KindSAMLRequest - break case types.KindGithub: resource = types.KindGithubRequest - break case types.KindOIDC: resource = types.KindOIDCRequest - break default: return nil, trace.BadParameter("unsupported authKind %q", authKind) } diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 600b95f2be9d1..4b6be5be4d8e7 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1226,14 +1226,10 @@ func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind switch authKind { case types.KindSAML: prefix = samlPrefix - break case types.KindGithub: prefix = githubPrefix - break case types.KindOIDC: prefix = oidcPrefix - break - default: return trace.BadParameter("unsupported authKind %q", authKind) } @@ -1265,14 +1261,10 @@ func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind str switch authKind { case types.KindSAML: prefix = samlPrefix - break case types.KindGithub: prefix = githubPrefix - break case types.KindOIDC: prefix = oidcPrefix - break - default: return nil, trace.BadParameter("unsupported authKind %q", authKind) } From 3251f47f564c13dffafa77b2685487609eea5f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 5 Apr 2022 17:10:28 +0200 Subject: [PATCH 23/50] Add missing license. --- api/types/sso_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/api/types/sso_test.go b/api/types/sso_test.go index 01c3a772a04f0..f632ffd6981d6 100644 --- a/api/types/sso_test.go +++ b/api/types/sso_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 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 types import ( From 9fff9d61d582e0374d1f131cb557ff481fb4b49b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Wed, 6 Apr 2022 10:06:38 +0200 Subject: [PATCH 24/50] Replace GetValue with GetValueTyped. --- api/types/sso.go | 14 ++-------- api/types/sso_test.go | 62 +------------------------------------------ 2 files changed, 3 insertions(+), 73 deletions(-) diff --git a/api/types/sso.go b/api/types/sso.go index d195da2d6e9a3..d718c8cb9a1d9 100644 --- a/api/types/sso.go +++ b/api/types/sso.go @@ -32,17 +32,7 @@ func NewSSODiagnosticInfo(infoType SSOInfoType, value interface{}) (*SSODiagnost return &SSODiagnosticInfo{InfoType: infoType, Value: out}, nil } -// GetValue deserializes embedded JSON of SSODiagnosticInfo.Value with no assumption about underlying type. -func (m *SSODiagnosticInfo) GetValue() (interface{}, error) { - var value interface{} - err := json.Unmarshal(m.Value, &value) - if err != nil { - return nil, trace.Wrap(err) - } - return value, nil -} - -// GetValueTyped deserializes embedded JSON of SSODiagnosticInfo.Value given typed pointer. -func (m *SSODiagnosticInfo) GetValueTyped(value interface{}) error { +// GetValue deserializes embedded JSON of SSODiagnosticInfo.Value given typed pointer. +func (m *SSODiagnosticInfo) GetValue(value interface{}) error { return trace.Wrap(json.Unmarshal(m.Value, &value)) } diff --git a/api/types/sso_test.go b/api/types/sso_test.go index f632ffd6981d6..efa21f46eeb71 100644 --- a/api/types/sso_test.go +++ b/api/types/sso_test.go @@ -29,66 +29,6 @@ func TestSSODiagnosticInfo_GetValue(t *testing.T) { return info } - type errInfo struct { - Message string - Error string - } - - tests := []struct { - name string - info *SSODiagnosticInfo - want interface{} - wantErr bool - }{ - { - name: "string", - info: mkInfo("foo"), - want: "foo", - wantErr: false, - }, - { - name: "int to float", - info: mkInfo(123), - want: 123.0, - wantErr: false, - }, - { - name: "struct", - info: mkInfo(errInfo{Message: "oh!", Error: "no..."}), - want: map[string]interface{}{"Message": "oh!", "Error": "no..."}, - wantErr: false, - }, - { - name: "bad JSON", - info: &SSODiagnosticInfo{}, - want: nil, - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.info.GetValue() - if tt.wantErr { - require.Error(t, err) - require.Nil(t, result) - } else { - require.NoError(t, err) - if err == nil { - require.Equal(t, tt.want, result) - } - } - }) - } -} - -func TestSSODiagnosticInfo_GetValueTyped(t *testing.T) { - mkInfo := func(value interface{}) *SSODiagnosticInfo { - info, err := NewSSODiagnosticInfo(SSOInfoType_UNKNOWN, value) - require.NoError(t, err) - return info - } - ptrStr := func(v string) *string { return &v } ptrInt := func(v int) *int { return &v } @@ -136,7 +76,7 @@ func TestSSODiagnosticInfo_GetValueTyped(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := tt.info.GetValueTyped(tt.arg) + err := tt.info.GetValue(tt.arg) if tt.wantErr { require.Error(t, err) } else { From 19c4c326dfb73dee2cf4adef94af1b11728c612f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 7 Apr 2022 16:19:21 +0200 Subject: [PATCH 25/50] SSOInfoType: space out constants per type. --- api/types/types.proto | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/api/types/types.proto b/api/types/types.proto index 864b0f50bf423..b21ec33254398 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -2613,24 +2613,26 @@ message GithubConnectorSpecV3 { enum SSOInfoType { // Unknown info type. UNKNOWN = 0; + // Error info type, used for reporting errors. ERROR = 1; // Success info type, used for marking successful flows. SUCCESS = 2; // Create user params, contains info about attempted user creation parameters. CREATE_USER_PARAMS = 3; + // [SAML] Attributes to roles mapping. - SAML_ATTRIBUTES_TO_ROLES = 4; + SAML_ATTRIBUTES_TO_ROLES = 101; // [SAML] Attributes to roles warnings. - SAML_ATTRIBUTES_TO_ROLES_WARNINGS = 5; + SAML_ATTRIBUTES_TO_ROLES_WARNINGS = 102; // [SAML] Assertion info. - SAML_ASSERTION_INFO = 6; + SAML_ASSERTION_INFO = 103; // [SAML] Attribute statements. - SAML_ATTRIBUTE_STATEMENTS = 7; + SAML_ATTRIBUTE_STATEMENTS = 104; // [SAML] Traits calculated from assertions. - SAML_TRAITS_FROM_ASSERTIONS = 8; + SAML_TRAITS_FROM_ASSERTIONS = 105; // [SAML] Assertion-to-trait mapping as specified in the connector. - SAML_CONNECTOR_TRAIT_MAPPING = 9; + SAML_CONNECTOR_TRAIT_MAPPING = 106; } // SSODiagnosticInfo is a single SSO diagnostic info entry. From 9eb4ffaf95a01d5945106c5bac9f2578117fb413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 7 Apr 2022 16:26:21 +0200 Subject: [PATCH 26/50] Share SSO DiagInfo logic. --- lib/auth/saml.go | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 960f0d5f1681b..f85e553d02c00 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -178,6 +178,18 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } +func (a *Server) ssoDiagInfo(ctx context.Context, authKind string, id string, infoType types.SSOInfoType, value interface{}) { + entry, err := types.NewSSODiagnosticInfo(infoType, value) + if err != nil { + log.WithError(err).Warn("Failed to serialize SSO diag info.") + } + + err = a.Identity.CreateSSODiagnosticInfo(ctx, authKind, id, *entry) + if err != nil { + log.WithError(err).Warn("Failed to create SSO diag info.") + } +} + func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { var err error @@ -189,15 +201,7 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn p.traits = services.SAMLAssertionsToTraits(assertionInfo) diagInfo := func(infoType types.SSOInfoType, value interface{}) { - entry, err := types.NewSSODiagnosticInfo(infoType, value) - if err != nil { - log.WithError(err).Warn("Failed to serialize SSO diag info.") - } - - err = a.Identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, request.ID, *entry) - if err != nil { - log.WithError(err).Warn("Failed to create SSO diag info.") - } + a.ssoDiagInfo(ctx, types.KindSAML, request.ID, infoType, value) } diagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) @@ -432,15 +436,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, } diagInfo := func(infoType types.SSOInfoType, value interface{}) { - entry, err := types.NewSSODiagnosticInfo(infoType, value) - if err != nil { - log.WithError(err).Warn("Failed to serialize SSO diag info.") - } - - err = a.Identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, requestID, *entry) - if err != nil { - log.WithError(err).Warn("Failed to create SSO diag info.") - } + a.ssoDiagInfo(ctx, types.KindSAML, requestID, infoType, value) } traceErr := func(msg string, errDetails error) { From 2ed6ad434a8263c53dff3bf60eae5c9ed10fd7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 7 Apr 2022 16:59:52 +0200 Subject: [PATCH 27/50] Fix error redirect for web login --- lib/web/saml.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/saml.go b/lib/web/saml.go index 8abea976bfe61..74a857c642913 100644 --- a/lib/web/saml.go +++ b/lib/web/saml.go @@ -108,7 +108,7 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P // // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout. if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil { - if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(r.Context(), requestID); errGet == nil { + if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(r.Context(), requestID); errGet == nil && !request.CreateWebSession { if url, errEnc := redirectURLWithError(request.ClientRedirectURL, err); errEnc == nil { return url.String() } From 3c67fe4f3563d66df7346c47be16cf5695214791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 09:43:33 +0200 Subject: [PATCH 28/50] Apply suggestions from code review Co-authored-by: Roman Tkachenko --- lib/auth/clt.go | 2 +- lib/auth/saml.go | 4 ++-- lib/services/saml.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/auth/clt.go b/lib/auth/clt.go index ebea885807683..457315fdd003c 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1780,7 +1780,7 @@ type IdentityService interface { ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) // GetSAMLAuthRequest returns SAML auth request if found - GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) + GetSAMLAuthRequest(ctx context.Context, authRequestID string) (*services.SAMLAuthRequest, error) // GetSSODiagnosticInfo returns SSO diagnostic info records. GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index f85e553d02c00..9ec0bf37f1851 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -128,13 +128,13 @@ func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLA // stateless test flow connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) if err != nil { - return nil, nil, err + return nil, nil, trace.Wrap(err) } // validate, set defaults for connector err = services.ValidateSAMLConnector(connector) if err != nil { - return nil, nil, err + return nil, nil, trace.Wrap(err) } // we don't want to cache the provider. construct it directly instead of using a.getSAMLProvider() diff --git a/lib/services/saml.go b/lib/services/saml.go index 9174a13d23c05..b3d2f94fe6b72 100644 --- a/lib/services/saml.go +++ b/lib/services/saml.go @@ -96,7 +96,7 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { } if len(sc.GetAttributesToRoles()) == 0 { - return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never give any roles.") + return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never give any roles") } log.Debugf("[SAML] SSO: %v", sc.GetSSO()) From 149e694bbc7ec5cc1736fb10b41e7e276bd1c451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 10:27:51 +0200 Subject: [PATCH 29/50] Comments for exported methods. --- lib/auth/auth_with_roles.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 4df386dfb6900..ab3a0ca1743a4 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2346,11 +2346,13 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (* return samlReq, nil } +// ValidateSAMLResponse validates SAML auth response. func (a *ServerWithRoles) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) { // auth callback is it's own authz, no need to check extra permissions return a.authServer.ValidateSAMLResponse(ctx, re) } +// GetSAMLAuthRequest returns SAML auth request if found. func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) { if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) @@ -2359,6 +2361,7 @@ func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*s return a.authServer.GetSAMLAuthRequest(ctx, id) } +// GetSSODiagnosticInfo returns SSO diagnostic info records. func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { var resource string From f0503dbbae9cbb592c3d347ae51b54c0b2f95235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 11:26:22 +0200 Subject: [PATCH 30/50] Make Redirector customizable with RedirectorConfig --- lib/client/redirect.go | 52 ++++++++++++++++++++++++------------------ lib/client/weblogin.go | 4 ++-- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/lib/client/redirect.go b/lib/client/redirect.go index abe99dfed41e0..5a9ac86c589ca 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -75,14 +75,18 @@ type Redirector struct { context context.Context // cancel broadcasts cancel cancel context.CancelFunc - // issueSSOLoginConsoleRequest if not nil will be used as custom implementation of IssueSSOLoginConsoleRequest function. - issueSSOLoginConsoleRequest IssueSSOLoginConsoleRequest + // RedirectorConfig allows customization of Redirector + RedirectorConfig } -type IssueSSOLoginConsoleRequest func(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) +// RedirectorConfig allows customization of Redirector +type RedirectorConfig struct { + // SSOLoginConsoleRequestFn allows customizing issuance of SSOLoginConsoleReq. Optional. + SSOLoginConsoleRequestFn func(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) +} // NewRedirector returns new local web server redirector -func NewRedirector(ctx context.Context, login SSHLoginSSO, issueLogin IssueSSOLoginConsoleRequest) (*Redirector, error) { +func NewRedirector(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*Redirector, error) { clt, proxyURL, err := initClient(login.ProxyAddr, login.Insecure, login.Pool) if err != nil { return nil, trace.Wrap(err) @@ -95,19 +99,26 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO, issueLogin IssueSSOLo return nil, trace.Wrap(err) } - context, cancel := context.WithCancel(ctx) + ctxCancel, cancel := context.WithCancel(ctx) rd := &Redirector{ - context: context, - cancel: cancel, - proxyClient: clt, - proxyURL: proxyURL, - SSHLoginSSO: login, - mux: http.NewServeMux(), - key: key, - shortPath: "/" + uuid.New().String(), - responseC: make(chan *auth.SSHLoginResponse, 1), - errorC: make(chan error, 1), - issueSSOLoginConsoleRequest: issueLogin, + context: ctxCancel, + cancel: cancel, + proxyClient: clt, + proxyURL: proxyURL, + SSHLoginSSO: login, + mux: http.NewServeMux(), + key: key, + shortPath: "/" + uuid.New().String(), + responseC: make(chan *auth.SSHLoginResponse, 1), + errorC: make(chan error, 1), + } + + if config != nil { + rd.RedirectorConfig = *config + } + + if rd.SSOLoginConsoleRequestFn == nil { + rd.SSOLoginConsoleRequestFn = rd.issueSSOLoginConsoleRequest } // callback is a callback URL communicated to the Teleport proxy, @@ -160,7 +171,7 @@ func (rd *Redirector) Start() error { KubernetesCluster: rd.KubernetesCluster, } - response, err := rd.IssueSSOLoginConsoleRequest(req) + response, err := rd.SSOLoginConsoleRequestFn(req) if err != nil { return trace.Wrap(err) } @@ -173,11 +184,8 @@ func (rd *Redirector) Start() error { return nil } -func (rd *Redirector) IssueSSOLoginConsoleRequest(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) { - if rd.issueSSOLoginConsoleRequest != nil { - return rd.issueSSOLoginConsoleRequest(req) - } - +// issueSSOLoginConsoleRequest is default implementation, but may be overridden via RedirectorConfig.IssueSSOLoginConsoleRequest. +func (rd *Redirector) issueSSOLoginConsoleRequest(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) { out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), req) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/client/weblogin.go b/lib/client/weblogin.go index bcc1b32ab662b..91fa16650982a 100644 --- a/lib/client/weblogin.go +++ b/lib/client/weblogin.go @@ -262,8 +262,8 @@ func initClient(proxyAddr string, insecure bool, pool *x509.CertPool) (*WebClien } // SSHAgentSSOLogin is used by tsh to fetch user credentials using OpenID Connect (OIDC) or SAML. -func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO, issueLogin IssueSSOLoginConsoleRequest) (*auth.SSHLoginResponse, error) { - rd, err := NewRedirector(ctx, login, issueLogin) +func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*auth.SSHLoginResponse, error) { + rd, err := NewRedirector(ctx, login, config) if err != nil { return nil, trace.Wrap(err) } From f186eae0e965450fbcedc8a0ab46617b4d803f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 11:29:59 +0200 Subject: [PATCH 31/50] Better error message. --- lib/client/redirect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/client/redirect.go b/lib/client/redirect.go index 5a9ac86c589ca..bb68150ac16ac 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -233,7 +233,7 @@ func (rd *Redirector) callback(w http.ResponseWriter, r *http.Request) (*auth.SS if r.URL.Query().Has("err") { err := r.URL.Query().Get("err") - return nil, trace.Errorf("received error: %v", err) + return nil, trace.Errorf("identity provider callback failed with error: %v", err) } // Decrypt ciphertext to get login response. From f30218c0930051f14e88b1a952b8bfbf5b6bce2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 11:45:06 +0200 Subject: [PATCH 32/50] Better name for function. --- lib/auth/saml.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 9ec0bf37f1851..80226e6a9ce0b 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -178,7 +178,7 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } -func (a *Server) ssoDiagInfo(ctx context.Context, authKind string, id string, infoType types.SSOInfoType, value interface{}) { +func (a *Server) createSSODiagInfo(ctx context.Context, authKind string, id string, infoType types.SSOInfoType, value interface{}) { entry, err := types.NewSSODiagnosticInfo(infoType, value) if err != nil { log.WithError(err).Warn("Failed to serialize SSO diag info.") @@ -201,7 +201,7 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn p.traits = services.SAMLAssertionsToTraits(assertionInfo) diagInfo := func(infoType types.SSOInfoType, value interface{}) { - a.ssoDiagInfo(ctx, types.KindSAML, request.ID, infoType, value) + a.createSSODiagInfo(ctx, types.KindSAML, request.ID, infoType, value) } diagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) @@ -436,7 +436,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, } diagInfo := func(infoType types.SSOInfoType, value interface{}) { - a.ssoDiagInfo(ctx, types.KindSAML, requestID, infoType, value) + a.createSSODiagInfo(ctx, types.KindSAML, requestID, infoType, value) } traceErr := func(msg string, errDetails error) { From e478da1c5ac88a1dbe5f21b4af20772dc980da82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 13:56:12 +0200 Subject: [PATCH 33/50] Applying feedback from code review. - store SSO diag info only for SSO test flow - use `trace.AddUserMessage` for error messages - simplify error capture: log in single place, simplified structure - rename helper function --- lib/auth/saml.go | 83 +++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 50 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 80226e6a9ce0b..79cff556fa3c2 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -201,7 +201,9 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn p.traits = services.SAMLAssertionsToTraits(assertionInfo) diagInfo := func(infoType types.SSOInfoType, value interface{}) { - a.createSSODiagInfo(ctx, types.KindSAML, request.ID, infoType, value) + if request.SSOTestFlow { + a.createSSODiagInfo(ctx, types.KindSAML, request.ID, infoType, value) + } } diagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) @@ -394,6 +396,10 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) } if err != nil { + if auxInfo.ssoTestFlow { + a.createSSODiagInfo(ctx, types.KindSAML, auxInfo.requestID, types.SSOInfoType_ERROR, trace.UserMessage(err)) + } + event.Code = events.UserSSOLoginFailureCode if auxInfo.ssoTestFlow { event.Code = events.UserSSOTestFlowLoginFailureCode @@ -427,6 +433,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) type validateSAMLAuxInfo struct { attributeStatements map[string][]string ssoTestFlow bool + requestID string } func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, auxInfo *validateSAMLAuxInfo) (*SAMLAuthResponse, error) { @@ -434,54 +441,38 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, if err != nil { return nil, trace.Wrap(err) } - - diagInfo := func(infoType types.SSOInfoType, value interface{}) { - a.createSSODiagInfo(ctx, types.KindSAML, requestID, infoType, value) - } - - traceErr := func(msg string, errDetails error) { - type errInfo struct { - Message string `json:"message"` - Error string `json:"error"` - } - - diagInfo(types.SSOInfoType_ERROR, errInfo{Message: msg, Error: errDetails.Error()}) - } + auxInfo.requestID = requestID request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID) if err != nil { - traceErr("Failed to get SAML Auth Request", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to get SAML Auth Request") } - auxInfo.ssoTestFlow = request.SSOTestFlow + writeDiagInfo := func(infoType types.SSOInfoType, value interface{}) { + if request.SSOTestFlow { + a.createSSODiagInfo(ctx, types.KindSAML, requestID, infoType, value) + } + } + connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { - traceErr("Failed to get SAML connector and provider", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to get SAML connector and provider") } assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse) if err != nil { - err = trace.AccessDenied( - "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err) - traceErr("Failed to retrieve assertion info. This may indicate IdP configuration error.", err) - return nil, trace.Wrap(err) + return nil, trace.AccessDenied("received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err).AddUserMessage("Failed to retrieve assertion info. This may indicate IdP configuration error.") } - diagInfo(types.SSOInfoType_SAML_ASSERTION_INFO, assertionInfo) + writeDiagInfo(types.SSOInfoType_SAML_ASSERTION_INFO, assertionInfo) if assertionInfo.WarningInfo.InvalidTime { - err = trace.AccessDenied("invalid time in SAML assertion info") - traceErr("SAML assertion info contained warning: invalid time.", err) - return nil, trace.Wrap(err) + return nil, trace.AccessDenied("invalid time in SAML assertion info").AddUserMessage("SAML assertion info contained warning: invalid time.") } if assertionInfo.WarningInfo.NotInAudience { - err = trace.AccessDenied("no audience in SAML assertion info") - traceErr("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.", err) - return nil, trace.Wrap(err) + return nil, trace.AccessDenied("no audience in SAML assertion info").AddUserMessage("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.") } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) @@ -499,16 +490,14 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, auxInfo.attributeStatements = attributeStatements - diagInfo(types.SSOInfoType_SAML_ATTRIBUTE_STATEMENTS, attributeStatements) + writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTE_STATEMENTS, attributeStatements) log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) - diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES, connector.GetAttributesToRoles()) + writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES, connector.GetAttributesToRoles()) if len(connector.GetAttributesToRoles()) == 0 { - err = trace.BadParameter("no attributes to roles mapping, check connector documentation") - traceErr("Attributes-to-roles mapping is empty, SSO user will never have any roles.", err) - return nil, trace.Wrap(err) + return nil, trace.BadParameter("no attributes to roles mapping, check connector documentation").AddUserMessage("Attributes-to-roles mapping is empty, SSO user will never have any roles.") } log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles())) @@ -517,16 +506,14 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, // create the user in the backend. params, err := a.calculateSAMLUser(ctx, connector, *assertionInfo, request) if err != nil { - traceErr("Failed to calculate user attributes.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err, "Failed to calculate user attributes.") } - diagInfo(types.SSOInfoType_CREATE_USER_PARAMS, params) + writeDiagInfo(types.SSOInfoType_CREATE_USER_PARAMS, params) user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { - traceErr("Failed to create user from provided parameters.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to create user from provided parameters.") } // Auth was successful, return session, certificate, etc. to caller. @@ -541,7 +528,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, // In test flow skip signing and creating web sessions. if request.SSOTestFlow { - diagInfo(types.SSOInfoType_SUCCESS, "test flow") + writeDiagInfo(types.SSOInfoType_SUCCESS, "test flow") return auth, nil } @@ -556,8 +543,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, }) if err != nil { - traceErr("Failed to create web session.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to create web session.") } auth.Session = session @@ -567,13 +553,11 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, if len(request.PublicKey) != 0 { sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster) if err != nil { - traceErr("Failed to create session certificate.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to create session certificate.") } clusterName, err := a.GetClusterName() if err != nil { - traceErr("Failed to obtain cluster name.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to obtain cluster name.") } auth.Cert = sshCert auth.TLSCert = tlsCert @@ -584,12 +568,11 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, DomainName: clusterName.GetClusterName(), }, false) if err != nil { - traceErr("Failed to obtain cluster's host CA.", err) - return nil, trace.Wrap(err) + return nil, trace.Wrap(err).AddUserMessage("Failed to obtain cluster's host CA.") } auth.HostSigners = append(auth.HostSigners, authority) } - diagInfo(types.SSOInfoType_SUCCESS, "full flow") + writeDiagInfo(types.SSOInfoType_SUCCESS, "full flow") return auth, nil } From f680243056a0d0d5392c3f26eae7d1f86300a52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 12 Apr 2022 14:08:33 +0200 Subject: [PATCH 34/50] Rename helper function. --- lib/auth/saml.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 79cff556fa3c2..c098458bf18dd 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -200,14 +200,14 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn p.traits = services.SAMLAssertionsToTraits(assertionInfo) - diagInfo := func(infoType types.SSOInfoType, value interface{}) { + writeDiagInfo := func(infoType types.SSOInfoType, value interface{}) { if request.SSOTestFlow { a.createSSODiagInfo(ctx, types.KindSAML, request.ID, infoType, value) } } - diagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) - diagInfo(types.SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING, connector.GetTraitMappings()) + writeDiagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) + writeDiagInfo(types.SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING, connector.GetTraitMappings()) var warnings []string warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits) @@ -218,12 +218,12 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn } if len(warnings) != 0 { - diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{ + writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{ Message: "No roles mapped for the user", Warnings: warnings}) log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) } else { - diagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{Message: "No roles mapped for the user. The mappings may contain typos."}) + writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{Message: "No roles mapped for the user. The mappings may contain typos."}) } return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName()) } From 706203f499ddfaec4b4878ed65cde16eb8140c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 21 Apr 2022 14:10:47 +0200 Subject: [PATCH 35/50] Use strongly typed proto messages. --- .../{sso.go => assertion_info_wrapper.go} | 32 +- api/types/assertion_info_wrapper_test.go | 80 + api/types/sso_test.go | 90 - api/types/traits.go | 11 - api/types/types.pb.go | 4094 +++++++++++------ api/types/types.proto | 117 +- 6 files changed, 2901 insertions(+), 1523 deletions(-) rename api/types/{sso.go => assertion_info_wrapper.go} (52%) create mode 100644 api/types/assertion_info_wrapper_test.go delete mode 100644 api/types/sso_test.go diff --git a/api/types/sso.go b/api/types/assertion_info_wrapper.go similarity index 52% rename from api/types/sso.go rename to api/types/assertion_info_wrapper.go index d718c8cb9a1d9..35aa7e398af1d 100644 --- a/api/types/sso.go +++ b/api/types/assertion_info_wrapper.go @@ -20,19 +20,35 @@ import ( "encoding/json" "github.com/gravitational/trace" + + "github.com/russellhaering/gosaml2" ) -// NewSSODiagnosticInfo creates new SSODiagnosticInfo object using arbitrary value, which is serialized using JSON. -func NewSSODiagnosticInfo(infoType SSOInfoType, value interface{}) (*SSODiagnosticInfo, error) { - out, err := json.Marshal(value) +type AssertionInfoWrapper saml2.AssertionInfo + +func (a *AssertionInfoWrapper) Size() int { + bytes, err := json.Marshal(a) if err != nil { - return nil, trace.Wrap(err) + return 0 } + return len(bytes) +} - return &SSODiagnosticInfo{InfoType: infoType, Value: out}, nil +func (a *AssertionInfoWrapper) Unmarshal(bytes []byte) error { + return trace.Wrap(json.Unmarshal(bytes, a)) } -// GetValue deserializes embedded JSON of SSODiagnosticInfo.Value given typed pointer. -func (m *SSODiagnosticInfo) GetValue(value interface{}) error { - return trace.Wrap(json.Unmarshal(m.Value, &value)) +func (a *AssertionInfoWrapper) MarshalTo(bytes []byte) (int, error) { + out, err := json.Marshal(a) + if err != nil { + return 0, trace.Wrap(err) + } + + if len(out) > cap(bytes) { + return 0, trace.BadParameter("capacity too low: %v, need %v", cap(bytes), len(out)) + } + + copy(bytes, out) + + return len(out), nil } diff --git a/api/types/assertion_info_wrapper_test.go b/api/types/assertion_info_wrapper_test.go new file mode 100644 index 0000000000000..d4328499cd678 --- /dev/null +++ b/api/types/assertion_info_wrapper_test.go @@ -0,0 +1,80 @@ +/* +Copyright 2022 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 types + +import ( + "encoding/xml" + saml2 "github.com/russellhaering/gosaml2" + samltypes "github.com/russellhaering/gosaml2/types" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestAssertionInfoWrapper_RoundTrip(t *testing.T) { + tests := []struct { + name string + src AssertionInfoWrapper + }{ + {name: "empty", src: AssertionInfoWrapper{}}, + {name: "full", src: (AssertionInfoWrapper)(saml2.AssertionInfo{ + NameID: "zz", + Values: map[string]samltypes.Attribute{ + "foo": { + XMLName: xml.Name{ + Space: "ddd", + Local: "aaa", + }, + FriendlyName: "aaa", + Name: "aaa", + NameFormat: "", + Values: nil, + }, + }, + WarningInfo: &saml2.WarningInfo{ + OneTimeUse: true, + ProxyRestriction: &saml2.ProxyRestriction{ + Count: 1, + Audience: []string{"foo"}, + }, + NotInAudience: true, + InvalidTime: true, + }, + SessionIndex: "aaa", + AuthnInstant: new(time.Time), + SessionNotOnOrAfter: new(time.Time), + Assertions: []samltypes.Assertion{ + {XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}}, + }, + ResponseSignatureValidated: true, + })}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := make([]byte, tt.src.Size()) + count, err := tt.src.MarshalTo(buf) + require.NoError(t, err) + require.Equal(t, tt.src.Size(), count) + + dst := &AssertionInfoWrapper{} + err = dst.Unmarshal(buf) + require.NoError(t, err) + require.Equal(t, &tt.src, dst) + }) + } +} diff --git a/api/types/sso_test.go b/api/types/sso_test.go deleted file mode 100644 index efa21f46eeb71..0000000000000 --- a/api/types/sso_test.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2022 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 types - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestSSODiagnosticInfo_GetValue(t *testing.T) { - mkInfo := func(value interface{}) *SSODiagnosticInfo { - info, err := NewSSODiagnosticInfo(SSOInfoType_UNKNOWN, value) - require.NoError(t, err) - return info - } - - ptrStr := func(v string) *string { return &v } - ptrInt := func(v int) *int { return &v } - - type errInfo struct { - Message string - Error string - } - - tests := []struct { - name string - info *SSODiagnosticInfo - arg interface{} - want interface{} - wantErr bool - }{ - { - name: "string ok", - info: mkInfo("foo"), - arg: new(string), - want: ptrStr("foo"), - wantErr: false, - }, - { - name: "int ok", - info: mkInfo(123), - arg: new(int), - want: ptrInt(123), - wantErr: false, - }, - { - name: "bad pointer type", - info: mkInfo(123), - arg: new(string), - want: nil, - wantErr: true, - }, - { - name: "custom struct", - info: mkInfo(errInfo{Message: "oh!", Error: "err"}), - arg: new(errInfo), - want: &errInfo{Message: "oh!", Error: "err"}, - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.info.GetValue(tt.arg) - if tt.wantErr { - require.Error(t, err) - } else { - require.NoError(t, err) - if err == nil { - require.Equal(t, tt.want, tt.arg) - } - } - }) - } -} diff --git a/api/types/traits.go b/api/types/traits.go index e6700728ebd4f..388d054dd38a9 100644 --- a/api/types/traits.go +++ b/api/types/traits.go @@ -16,16 +16,5 @@ limitations under the License. package types -// TraitMapping is a mapping that maps a trait to one or -// more teleport roles. -type TraitMapping struct { - // Trait is a teleport trait name - Trait string `json:"trait"` - // Value is trait value to match - Value string `json:"value"` - // Roles is a list of static teleport roles to map to - Roles []string `json:"roles,omitempty"` -} - // TraitMappingSet is a set of trait mappings type TraitMappingSet []TraitMapping diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 13ec9e708d9bb..0cffbb038de97 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -276,66 +276,6 @@ func (CertExtensionType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_d938547f84707355, []int{7} } -// SSOInfoType represents the SSO diagnostic info type. -type SSOInfoType int32 - -const ( - // Unknown info type. - SSOInfoType_UNKNOWN SSOInfoType = 0 - // Error info type, used for reporting errors. - SSOInfoType_ERROR SSOInfoType = 1 - // Success info type, used for marking successful flows. - SSOInfoType_SUCCESS SSOInfoType = 2 - // Create user params, contains info about attempted user creation parameters. - SSOInfoType_CREATE_USER_PARAMS SSOInfoType = 3 - // [SAML] Attributes to roles mapping. - SSOInfoType_SAML_ATTRIBUTES_TO_ROLES SSOInfoType = 4 - // [SAML] Attributes to roles warnings. - SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS SSOInfoType = 5 - // [SAML] Assertion info. - SSOInfoType_SAML_ASSERTION_INFO SSOInfoType = 6 - // [SAML] Attribute statements. - SSOInfoType_SAML_ATTRIBUTE_STATEMENTS SSOInfoType = 7 - // [SAML] Traits calculated from assertions. - SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS SSOInfoType = 8 - // [SAML] Assertion-to-trait mapping as specified in the connector. - SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING SSOInfoType = 9 -) - -var SSOInfoType_name = map[int32]string{ - 0: "UNKNOWN", - 1: "ERROR", - 2: "SUCCESS", - 3: "CREATE_USER_PARAMS", - 4: "SAML_ATTRIBUTES_TO_ROLES", - 5: "SAML_ATTRIBUTES_TO_ROLES_WARNINGS", - 6: "SAML_ASSERTION_INFO", - 7: "SAML_ATTRIBUTE_STATEMENTS", - 8: "SAML_TRAITS_FROM_ASSERTIONS", - 9: "SAML_CONNECTOR_TRAIT_MAPPING", -} - -var SSOInfoType_value = map[string]int32{ - "UNKNOWN": 0, - "ERROR": 1, - "SUCCESS": 2, - "CREATE_USER_PARAMS": 3, - "SAML_ATTRIBUTES_TO_ROLES": 4, - "SAML_ATTRIBUTES_TO_ROLES_WARNINGS": 5, - "SAML_ASSERTION_INFO": 6, - "SAML_ATTRIBUTE_STATEMENTS": 7, - "SAML_TRAITS_FROM_ASSERTIONS": 8, - "SAML_CONNECTOR_TRAIT_MAPPING": 9, -} - -func (x SSOInfoType) String() string { - return proto.EnumName(SSOInfoType_name, int32(x)) -} - -func (SSOInfoType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{8} -} - // SessionState represents the state of a session. type SessionState int32 @@ -367,7 +307,7 @@ func (x SessionState) String() string { } func (SessionState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{9} + return fileDescriptor_d938547f84707355, []int{8} } // Type is the type of keep alive, used by servers. At the moment only @@ -4927,6 +4867,52 @@ func (m *ClaimMapping) XXX_DiscardUnknown() { var xxx_messageInfo_ClaimMapping proto.InternalMessageInfo +// TraitMapping maps a trait to teleport roles. +type TraitMapping struct { + // Trait is a trait name. + Trait string `protobuf:"bytes,1,opt,name=Trait,proto3" json:"trait"` + // Value is a trait value to match. + Value string `protobuf:"bytes,2,opt,name=Value,proto3" json:"value"` + // Roles is a list of static teleport roles to match. + Roles []string `protobuf:"bytes,3,rep,name=Roles,proto3" json:"roles,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TraitMapping) Reset() { *m = TraitMapping{} } +func (m *TraitMapping) String() string { return proto.CompactTextString(m) } +func (*TraitMapping) ProtoMessage() {} +func (*TraitMapping) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{88} +} +func (m *TraitMapping) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TraitMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TraitMapping.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 *TraitMapping) XXX_Merge(src proto.Message) { + xxx_messageInfo_TraitMapping.Merge(m, src) +} +func (m *TraitMapping) XXX_Size() int { + return m.Size() +} +func (m *TraitMapping) XXX_DiscardUnknown() { + xxx_messageInfo_TraitMapping.DiscardUnknown(m) +} + +var xxx_messageInfo_TraitMapping proto.InternalMessageInfo + // Rule represents allow or deny rule that is executed to check // if user or service have access to resource type Rule struct { @@ -4947,7 +4933,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{88} + return fileDescriptor_d938547f84707355, []int{89} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4995,7 +4981,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{89} + return fileDescriptor_d938547f84707355, []int{90} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5037,7 +5023,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{90} + return fileDescriptor_d938547f84707355, []int{91} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5086,7 +5072,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{91} + return fileDescriptor_d938547f84707355, []int{92} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5150,7 +5136,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{92} + return fileDescriptor_d938547f84707355, []int{93} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5195,7 +5181,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{93} + return fileDescriptor_d938547f84707355, []int{94} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5247,7 +5233,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{94} + return fileDescriptor_d938547f84707355, []int{95} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5292,7 +5278,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{95} + return fileDescriptor_d938547f84707355, []int{96} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5341,7 +5327,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{96} + return fileDescriptor_d938547f84707355, []int{97} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5396,7 +5382,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{97} + return fileDescriptor_d938547f84707355, []int{98} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5494,7 +5480,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{98} + return fileDescriptor_d938547f84707355, []int{99} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5526,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{99} + return fileDescriptor_d938547f84707355, []int{100} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5607,7 +5593,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{100} + return fileDescriptor_d938547f84707355, []int{101} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5650,7 +5636,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{101} + return fileDescriptor_d938547f84707355, []int{102} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5696,7 +5682,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{102} + return fileDescriptor_d938547f84707355, []int{103} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5738,7 +5724,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{103} + return fileDescriptor_d938547f84707355, []int{104} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5788,7 +5774,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{104} + return fileDescriptor_d938547f84707355, []int{105} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5835,7 +5821,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{105} + return fileDescriptor_d938547f84707355, []int{106} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5884,7 +5870,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{106} + return fileDescriptor_d938547f84707355, []int{107} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5932,7 +5918,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{107} + return fileDescriptor_d938547f84707355, []int{108} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5980,7 +5966,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{108} + return fileDescriptor_d938547f84707355, []int{109} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6031,7 +6017,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{109} + return fileDescriptor_d938547f84707355, []int{110} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6079,7 +6065,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{110} + return fileDescriptor_d938547f84707355, []int{111} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6125,7 +6111,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{111} + return fileDescriptor_d938547f84707355, []int{112} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6174,7 +6160,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{112} + return fileDescriptor_d938547f84707355, []int{113} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6216,7 +6202,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{113} + return fileDescriptor_d938547f84707355, []int{114} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6265,7 +6251,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{114} + return fileDescriptor_d938547f84707355, []int{115} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6326,7 +6312,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{115} + return fileDescriptor_d938547f84707355, []int{116} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6368,7 +6354,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{116} + return fileDescriptor_d938547f84707355, []int{117} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6417,7 +6403,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{117} + return fileDescriptor_d938547f84707355, []int{118} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6461,7 +6447,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{118} + return fileDescriptor_d938547f84707355, []int{119} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6511,7 +6497,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{119} + return fileDescriptor_d938547f84707355, []int{120} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6560,7 +6546,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{120} + return fileDescriptor_d938547f84707355, []int{121} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6602,7 +6588,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{121} + return fileDescriptor_d938547f84707355, []int{122} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6654,7 +6640,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{122} + return fileDescriptor_d938547f84707355, []int{123} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6698,7 +6684,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{123} + return fileDescriptor_d938547f84707355, []int{124} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6742,7 +6728,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{124} + return fileDescriptor_d938547f84707355, []int{125} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6786,7 +6772,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{125} + return fileDescriptor_d938547f84707355, []int{126} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6830,7 +6816,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{126} + return fileDescriptor_d938547f84707355, []int{127} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6874,7 +6860,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{127} + return fileDescriptor_d938547f84707355, []int{128} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6916,7 +6902,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{128} + return fileDescriptor_d938547f84707355, []int{129} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6960,7 +6946,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{129} + return fileDescriptor_d938547f84707355, []int{130} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7002,7 +6988,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{130} + return fileDescriptor_d938547f84707355, []int{131} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7046,7 +7032,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{131} + return fileDescriptor_d938547f84707355, []int{132} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7088,7 +7074,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{132} + return fileDescriptor_d938547f84707355, []int{133} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7138,7 +7124,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{133} + return fileDescriptor_d938547f84707355, []int{134} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7180,7 +7166,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{134} + return fileDescriptor_d938547f84707355, []int{135} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7253,7 +7239,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{135} + return fileDescriptor_d938547f84707355, []int{136} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7303,7 +7289,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{136} + return fileDescriptor_d938547f84707355, []int{137} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7345,7 +7331,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{137} + return fileDescriptor_d938547f84707355, []int{138} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7414,7 +7400,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{138} + return fileDescriptor_d938547f84707355, []int{139} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7460,7 +7446,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{139} + return fileDescriptor_d938547f84707355, []int{140} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7505,7 +7491,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{140} + return fileDescriptor_d938547f84707355, []int{141} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7555,7 +7541,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{141} + return fileDescriptor_d938547f84707355, []int{142} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7597,7 +7583,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{142} + return fileDescriptor_d938547f84707355, []int{143} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7647,7 +7633,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{143} + return fileDescriptor_d938547f84707355, []int{144} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7676,23 +7662,139 @@ func (m *GithubConnectorSpecV3) XXX_DiscardUnknown() { var xxx_messageInfo_GithubConnectorSpecV3 proto.InternalMessageInfo -// SSODiagnosticInfo is a single SSO diagnostic info entry. -type SSODiagnosticInfo struct { - // SSO Diagnostic info type. - InfoType SSOInfoType `protobuf:"varint,1,opt,name=InfoType,proto3,enum=types.SSOInfoType" json:"info_type"` - // Value is arbitrary string encoding of particular value. The meaning depends on particular SSO - // diagnostic info type. - Value []byte `protobuf:"bytes,2,opt,name=Value,proto3" json:"value"` +// SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the SAML +// attributes to roles. +type SAMLAttributesToRolesWarnings struct { + // Message is main user-facing message to be shown. + Message string `protobuf:"bytes,1,opt,name=Message,proto3" json:"message,omitempty"` + // Warnings is a set of distinct warnings to be reported. + Warnings []string `protobuf:"bytes,2,rep,name=Warnings,proto3" json:"warnings,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } +func (m *SAMLAttributesToRolesWarnings) Reset() { *m = SAMLAttributesToRolesWarnings{} } +func (m *SAMLAttributesToRolesWarnings) String() string { return proto.CompactTextString(m) } +func (*SAMLAttributesToRolesWarnings) ProtoMessage() {} +func (*SAMLAttributesToRolesWarnings) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{145} +} +func (m *SAMLAttributesToRolesWarnings) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SAMLAttributesToRolesWarnings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SAMLAttributesToRolesWarnings.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 *SAMLAttributesToRolesWarnings) XXX_Merge(src proto.Message) { + xxx_messageInfo_SAMLAttributesToRolesWarnings.Merge(m, src) +} +func (m *SAMLAttributesToRolesWarnings) XXX_Size() int { + return m.Size() +} +func (m *SAMLAttributesToRolesWarnings) XXX_DiscardUnknown() { + xxx_messageInfo_SAMLAttributesToRolesWarnings.DiscardUnknown(m) +} + +var xxx_messageInfo_SAMLAttributesToRolesWarnings proto.InternalMessageInfo + +// CreateUserParams represents the user creation parameters as called during SSO login flow. +type CreateUserParams struct { + // ConnectorName is the name of the connector used for SSO login flow. + ConnectorName string `protobuf:"bytes,1,opt,name=ConnectorName,proto3" json:"connector_name,omitempty"` + // Username is the name of the user to be created. + Username string `protobuf:"bytes,2,opt,name=Username,proto3" json:"username,omitempty"` + // Logins is a list of available unix logins. + Logins []string `protobuf:"bytes,3,rep,name=Logins,proto3" json:"logins,omitempty"` + // KubeGroups is a list of assigned kube groups. + KubeGroups []string `protobuf:"bytes,4,rep,name=KubeGroups,proto3" json:"kube_groups,omitempty"` + // KubeUsers is a list of available kube users. + KubeUsers []string `protobuf:"bytes,5,rep,name=KubeUsers,proto3" json:"kube_users,omitempty"` + // Roles is a list of assigned roles. + Roles []string `protobuf:"bytes,6,rep,name=Roles,proto3" json:"roles,omitempty"` + // Traits is the set of traits the user is assigned. + Traits github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=Traits,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"traits,omitempty"` + // SessionTTL determines the TTL. + SessionTTL Duration `protobuf:"varint,8,opt,name=SessionTTL,proto3,casttype=Duration" json:"session_ttl,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } +func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } +func (*CreateUserParams) ProtoMessage() {} +func (*CreateUserParams) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{146} +} +func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateUserParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CreateUserParams.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 *CreateUserParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateUserParams.Merge(m, src) +} +func (m *CreateUserParams) XXX_Size() int { + return m.Size() +} +func (m *CreateUserParams) XXX_DiscardUnknown() { + xxx_messageInfo_CreateUserParams.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateUserParams proto.InternalMessageInfo + +// SSODiagnosticInfo is a single SSO diagnostic info entry. +type SSODiagnosticInfo struct { + // Error stores user-friendly error message. + Error string `protobuf:"bytes,1,opt,name=Error,proto3" json:"error"` + // Success if present, marks the flow as finished with success. + Success string `protobuf:"bytes,2,opt,name=Success,proto3" json:"success"` + // CreateUserParams represents the user creation parameters as called during SSO login flow. + CreateUserParams *CreateUserParams `protobuf:"bytes,3,opt,name=CreateUserParams,proto3" json:"create_user_params,omitempty"` + // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login + // flow. + SAMLAttributesToRoles []AttributeMapping `protobuf:"bytes,4,rep,name=SAMLAttributesToRoles,proto3" json:"attributes_to_roles,omitempty"` + // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the + // SAML attributes to roles. + SAMLAttributesToRolesWarnings *SAMLAttributesToRolesWarnings `protobuf:"bytes,5,opt,name=SAMLAttributesToRolesWarnings,proto3" json:"saml_attributes_to_roles_warnings,omitempty"` + // SAMLAttributeStatements represents SAML attribute statements. + SAMLAttributeStatements github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,6,opt,name=SAMLAttributeStatements,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_attribute_statements,omitempty"` + // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. + SAMLAssertionInfo *AssertionInfoWrapper `protobuf:"bytes,7,opt,name=SAMLAssertionInfo,proto3,customtype=AssertionInfoWrapper" json:"saml_assertion_info,omitempty"` + // SAMLTraitsFromAssertions represents traits translated from SAML assertions. + SAMLTraitsFromAssertions github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,8,opt,name=SAMLTraitsFromAssertions,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_traits_from_assertions,omitempty"` + // SAMLConnectorTraitMapping represents connector-specific trait mapping. + SAMLConnectorTraitMapping []TraitMapping `protobuf:"bytes,9,rep,name=SAMLConnectorTraitMapping,proto3" json:"saml_connector_trait_mapping,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{147} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7742,7 +7844,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{148} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7791,7 +7893,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{149} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7833,7 +7935,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{150} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7889,7 +7991,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{151} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7942,7 +8044,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{152} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7988,7 +8090,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{153} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8043,7 +8145,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{154} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8087,7 +8189,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{155} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8130,7 +8232,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{156} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8183,7 +8285,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{157} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8227,7 +8329,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{158} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8273,7 +8375,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{159} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8317,7 +8419,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{160} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8361,7 +8463,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{161} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8407,7 +8509,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{162} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8473,7 +8575,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{163} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8527,7 +8629,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{164} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8572,7 +8674,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{165} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8616,7 +8718,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{166} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8660,7 +8762,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{167} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8742,7 +8844,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{168} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8789,7 +8891,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{169} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8837,7 +8939,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{170} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8881,7 +8983,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{168} + return fileDescriptor_d938547f84707355, []int{171} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8919,7 +9021,6 @@ func init() { proto.RegisterEnum("types.RequestState", RequestState_name, RequestState_value) proto.RegisterEnum("types.CertExtensionMode", CertExtensionMode_name, CertExtensionMode_value) proto.RegisterEnum("types.CertExtensionType", CertExtensionType_name, CertExtensionType_value) - proto.RegisterEnum("types.SSOInfoType", SSOInfoType_name, SSOInfoType_value) proto.RegisterEnum("types.SessionState", SessionState_name, SessionState_value) proto.RegisterEnum("types.KeepAlive_KeepAliveType", KeepAlive_KeepAliveType_name, KeepAlive_KeepAliveType_value) proto.RegisterEnum("types.CertAuthoritySpecV2_SigningAlgType", CertAuthoritySpecV2_SigningAlgType_name, CertAuthoritySpecV2_SigningAlgType_value) @@ -9023,6 +9124,7 @@ func init() { proto.RegisterType((*AccessRequestConditions)(nil), "types.AccessRequestConditions") proto.RegisterType((*AccessReviewConditions)(nil), "types.AccessReviewConditions") proto.RegisterType((*ClaimMapping)(nil), "types.ClaimMapping") + proto.RegisterType((*TraitMapping)(nil), "types.TraitMapping") proto.RegisterType((*Rule)(nil), "types.Rule") proto.RegisterType((*ImpersonateConditions)(nil), "types.ImpersonateConditions") proto.RegisterType((*BoolValue)(nil), "types.BoolValue") @@ -9082,6 +9184,8 @@ func init() { proto.RegisterType((*GithubConnectorV3)(nil), "types.GithubConnectorV3") proto.RegisterType((*GithubConnectorV3List)(nil), "types.GithubConnectorV3List") proto.RegisterType((*GithubConnectorSpecV3)(nil), "types.GithubConnectorSpecV3") + proto.RegisterType((*SAMLAttributesToRolesWarnings)(nil), "types.SAMLAttributesToRolesWarnings") + proto.RegisterType((*CreateUserParams)(nil), "types.CreateUserParams") proto.RegisterType((*SSODiagnosticInfo)(nil), "types.SSODiagnosticInfo") proto.RegisterType((*TeamMapping)(nil), "types.TeamMapping") proto.RegisterType((*TrustedClusterV2)(nil), "types.TrustedClusterV2") @@ -9112,745 +9216,759 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 11794 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x6c, 0x24, 0x49, - 0x72, 0xd8, 0x54, 0x77, 0x93, 0xec, 0x0e, 0x36, 0xc9, 0x66, 0xce, 0x8b, 0x33, 0x3b, 0xbb, 0x3d, - 0x57, 0xfb, 0x9a, 0x9d, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0x47, 0xda, 0xdb, 0xd7, 0x75, 0x93, 0x3d, - 0x33, 0xdc, 0xe1, 0x6b, 0xab, 0x9b, 0xe4, 0x9d, 0xee, 0x4e, 0xa5, 0x62, 0x57, 0x0e, 0x59, 0xcb, - 0x66, 0x57, 0xab, 0xaa, 0x7a, 0x66, 0x28, 0x59, 0x90, 0x0c, 0x43, 0x16, 0x64, 0x41, 0xf7, 0x10, - 0x4e, 0x96, 0x64, 0xc8, 0x90, 0x2c, 0x58, 0xb0, 0x65, 0xe3, 0xfc, 0x21, 0x1b, 0xb0, 0x0d, 0x18, - 0x06, 0x04, 0x18, 0xc2, 0x7d, 0xd8, 0xb0, 0xfe, 0x0c, 0xc9, 0x06, 0x6d, 0xdd, 0xf9, 0x47, 0x04, - 0x6c, 0x18, 0xf0, 0x97, 0xce, 0x16, 0x6c, 0x64, 0x64, 0x66, 0x55, 0x66, 0x75, 0x35, 0xd9, 0xb3, - 0x3b, 0x0b, 0x68, 0xf6, 0x8b, 0xec, 0xc8, 0x88, 0xa8, 0x7c, 0x46, 0x46, 0x64, 0x46, 0x44, 0xc2, - 0x64, 0x74, 0xd8, 0xa3, 0xe1, 0x8d, 0x5e, 0xe0, 0x47, 0x3e, 0x19, 0xc3, 0x1f, 0x97, 0xcf, 0xed, - 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd9, 0x7f, 0xbc, 0xf0, 0x72, 0x75, 0xd7, 0xf7, 0x77, 0x3b, 0x74, - 0x1e, 0x7f, 0xed, 0xf4, 0x1f, 0xcc, 0x47, 0xde, 0x01, 0x0d, 0x23, 0xe7, 0xa0, 0x27, 0x10, 0x16, - 0x77, 0xbd, 0x68, 0xaf, 0xbf, 0x73, 0xa3, 0xed, 0x1f, 0xcc, 0xef, 0x06, 0xce, 0x43, 0x2f, 0x72, - 0x22, 0xcf, 0xef, 0x3a, 0x9d, 0xf9, 0x88, 0x76, 0x68, 0xcf, 0x0f, 0xa2, 0x79, 0xa7, 0xe7, 0xcd, - 0xe3, 0x37, 0xe6, 0x1f, 0x05, 0x4e, 0xaf, 0x47, 0x83, 0xe4, 0x1f, 0xce, 0xc4, 0xfc, 0x07, 0x79, - 0x28, 0xdd, 0xa7, 0xb4, 0x57, 0xeb, 0x78, 0x0f, 0x29, 0x79, 0x11, 0x0a, 0x6b, 0xce, 0x01, 0x9d, - 0x33, 0xae, 0x1a, 0xd7, 0x4a, 0xf5, 0x99, 0xe3, 0xa3, 0xea, 0x64, 0x48, 0x83, 0x87, 0x34, 0xb0, - 0xbb, 0xce, 0x01, 0xb5, 0xb0, 0x90, 0x7c, 0x1e, 0x4a, 0xec, 0x6f, 0xd8, 0x73, 0xda, 0x74, 0x2e, - 0x87, 0x98, 0x53, 0xc7, 0x47, 0xd5, 0x52, 0x57, 0x02, 0xad, 0xa4, 0x9c, 0xbc, 0x02, 0x13, 0x2b, - 0xd4, 0x09, 0xe9, 0xf2, 0xd2, 0x5c, 0xfe, 0xaa, 0x71, 0x2d, 0x5f, 0x2f, 0x1f, 0x1f, 0x55, 0x8b, - 0x1d, 0x06, 0xb2, 0x3d, 0xd7, 0x92, 0x85, 0x64, 0x19, 0x26, 0x1a, 0x8f, 0x7b, 0x5e, 0x40, 0xc3, - 0xb9, 0xc2, 0x55, 0xe3, 0xda, 0xe4, 0xc2, 0xe5, 0x1b, 0xbc, 0xfd, 0x37, 0x64, 0xfb, 0x6f, 0xb4, - 0x64, 0xfb, 0xeb, 0x67, 0xbf, 0x7f, 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x9d, 0xa0, 0x9c, 0xe4, 0xdb, - 0xff, 0xb5, 0x6a, 0x58, 0x92, 0x9e, 0xbc, 0x03, 0x85, 0xd6, 0x61, 0x8f, 0xce, 0x95, 0xae, 0x1a, - 0xd7, 0xa6, 0x17, 0x5e, 0xb8, 0xc1, 0x7b, 0x3c, 0x6e, 0x64, 0xf2, 0x1f, 0xc3, 0xaa, 0x17, 0x8f, - 0x8f, 0xaa, 0x05, 0x86, 0x62, 0x21, 0x15, 0x79, 0x03, 0xc6, 0xef, 0xf9, 0x61, 0xb4, 0xbc, 0x34, - 0x07, 0xd8, 0xb4, 0xf3, 0xc7, 0x47, 0xd5, 0xd9, 0x3d, 0x3f, 0x8c, 0x6c, 0xcf, 0x7d, 0xdd, 0x3f, - 0xf0, 0x22, 0x7a, 0xd0, 0x8b, 0x0e, 0x2d, 0x81, 0x64, 0xee, 0xc0, 0x94, 0xc6, 0x8f, 0x4c, 0xc2, - 0xc4, 0xe6, 0xda, 0xfd, 0xb5, 0xf5, 0xed, 0xb5, 0xca, 0x19, 0x52, 0x84, 0xc2, 0xda, 0xfa, 0x52, - 0xa3, 0x62, 0x90, 0x09, 0xc8, 0xd7, 0x36, 0x36, 0x2a, 0x39, 0x52, 0x86, 0xe2, 0x52, 0xad, 0x55, - 0xab, 0xd7, 0x9a, 0x8d, 0x4a, 0x9e, 0x9c, 0x85, 0x99, 0xed, 0xe5, 0xb5, 0xa5, 0xf5, 0xed, 0xa6, - 0xbd, 0xd4, 0x68, 0xde, 0x6f, 0xad, 0x6f, 0x54, 0x0a, 0x64, 0x1a, 0xe0, 0xfe, 0x66, 0xbd, 0x61, - 0xad, 0x35, 0x5a, 0x8d, 0x66, 0x65, 0xcc, 0xfc, 0xa5, 0x3c, 0x14, 0x57, 0x69, 0xe4, 0xb8, 0x4e, - 0xe4, 0x90, 0x2b, 0xda, 0x10, 0x61, 0xed, 0x95, 0xb1, 0x79, 0x71, 0x70, 0x6c, 0xc6, 0x8e, 0x8f, - 0xaa, 0xc6, 0x1b, 0xea, 0x98, 0xbc, 0x0d, 0x93, 0x4b, 0x34, 0x6c, 0x07, 0x5e, 0x8f, 0xcd, 0x17, - 0x1c, 0x97, 0x52, 0xfd, 0xd2, 0xf1, 0x51, 0xf5, 0xbc, 0x9b, 0x80, 0x95, 0xb6, 0xaa, 0xd8, 0x64, - 0x19, 0xc6, 0x57, 0x9c, 0x1d, 0xda, 0x09, 0xe7, 0xc6, 0xae, 0xe6, 0xaf, 0x4d, 0x2e, 0x3c, 0x27, - 0xfa, 0x57, 0x56, 0xf0, 0x06, 0x2f, 0x6d, 0x74, 0xa3, 0xe0, 0xb0, 0x7e, 0xee, 0xf8, 0xa8, 0x5a, - 0xe9, 0x20, 0x40, 0xed, 0x3b, 0x8e, 0x42, 0x9a, 0xc9, 0x98, 0x8f, 0x9f, 0x3a, 0xe6, 0xcf, 0x7f, - 0xff, 0xa8, 0x6a, 0xb0, 0xb1, 0x10, 0x63, 0x9e, 0xf0, 0xd3, 0x47, 0xff, 0x2a, 0xe4, 0x96, 0x97, - 0xe6, 0x26, 0x70, 0xae, 0x55, 0x8e, 0x8f, 0xaa, 0x65, 0x6d, 0xd8, 0x72, 0xcb, 0x4b, 0x97, 0xdf, - 0x82, 0x49, 0xa5, 0x8e, 0xa4, 0x02, 0xf9, 0x7d, 0x7a, 0xc8, 0xfb, 0xd3, 0x62, 0xff, 0x92, 0x73, - 0x30, 0xf6, 0xd0, 0xe9, 0xf4, 0x45, 0x07, 0x5a, 0xfc, 0xc7, 0x97, 0x72, 0x3f, 0x6e, 0x98, 0xbf, - 0x56, 0x80, 0xa2, 0xe5, 0xf3, 0x75, 0x46, 0x5e, 0x83, 0xb1, 0x66, 0xe4, 0x44, 0x72, 0x28, 0xce, - 0x1e, 0x1f, 0x55, 0x67, 0x42, 0x06, 0x50, 0xbe, 0xc7, 0x31, 0x18, 0xea, 0xc6, 0x9e, 0x13, 0xca, - 0x21, 0x41, 0xd4, 0x1e, 0x03, 0xa8, 0xa8, 0x88, 0x41, 0x5e, 0x81, 0xc2, 0xaa, 0xef, 0x52, 0x31, - 0x2a, 0xe4, 0xf8, 0xa8, 0x3a, 0x7d, 0xe0, 0xbb, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0xa1, 0xb4, 0xd8, - 0x0f, 0x02, 0xda, 0x65, 0x53, 0xb5, 0x80, 0xc8, 0xd3, 0xc7, 0x47, 0x55, 0x68, 0x73, 0x20, 0x5b, - 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x66, 0xe4, 0x04, 0x11, 0x75, 0xe7, 0xc6, 0x46, 0xea, 0x6a, 0xb6, - 0xbc, 0x66, 0x43, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, 0xdc, 0x83, 0xc9, 0xbb, 0x81, 0xd3, 0xa6, - 0x1b, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0x7f, 0xe5, 0xf8, 0xa8, 0x7a, 0x61, 0x97, 0x81, - 0xed, 0x1e, 0xc2, 0x13, 0xea, 0x1f, 0x1d, 0x55, 0x8b, 0x4b, 0xfd, 0x00, 0x7b, 0xcf, 0x52, 0x49, - 0xc9, 0x4f, 0xb1, 0x21, 0x09, 0x23, 0xec, 0x5a, 0xea, 0xe2, 0xe8, 0x9d, 0x5c, 0x45, 0x53, 0x54, - 0xf1, 0x42, 0xc7, 0x09, 0x23, 0x3b, 0xe0, 0x74, 0xa9, 0x7a, 0xaa, 0x2c, 0xc9, 0x3a, 0x14, 0x9b, - 0xed, 0x3d, 0xea, 0xf6, 0x3b, 0x74, 0xae, 0x88, 0xec, 0x2f, 0x8a, 0x89, 0x2b, 0xc7, 0x53, 0x16, - 0xd7, 0x2f, 0x0b, 0xde, 0x24, 0x14, 0x10, 0xa5, 0xef, 0x63, 0x26, 0x5f, 0x2a, 0xfe, 0xe6, 0xef, - 0x56, 0xcf, 0xfc, 0xc2, 0x7f, 0xb9, 0x7a, 0xc6, 0xfc, 0x97, 0x39, 0xa8, 0xa4, 0x99, 0x90, 0x07, - 0x30, 0xb5, 0xd9, 0x73, 0x9d, 0x88, 0x2e, 0x76, 0x3c, 0xda, 0x8d, 0x42, 0x9c, 0x24, 0x27, 0xb7, - 0xe9, 0x25, 0xf1, 0xdd, 0xb9, 0x3e, 0x12, 0xda, 0x6d, 0x4e, 0x99, 0x6a, 0x95, 0xce, 0x36, 0xf9, - 0x4e, 0x13, 0xe5, 0x74, 0x88, 0x33, 0xec, 0xc9, 0xbe, 0xc3, 0x25, 0xfc, 0x90, 0xef, 0x08, 0xb6, - 0x62, 0x02, 0x75, 0xdd, 0x9d, 0x43, 0x9c, 0x99, 0xa3, 0x4f, 0x20, 0x46, 0x92, 0x31, 0x81, 0x18, - 0xd8, 0xfc, 0xef, 0x06, 0x4c, 0x5b, 0x34, 0xf4, 0xfb, 0x41, 0x9b, 0xde, 0xa3, 0x8e, 0x4b, 0x03, - 0x36, 0xfd, 0xef, 0x7b, 0x5d, 0x57, 0xac, 0x29, 0x9c, 0xfe, 0xfb, 0x5e, 0x57, 0x5d, 0xc2, 0x58, - 0x4e, 0xbe, 0x00, 0x13, 0xcd, 0xfe, 0x0e, 0xa2, 0xf2, 0x35, 0x75, 0x01, 0x47, 0xac, 0xbf, 0x63, - 0xa7, 0xd0, 0x25, 0x1a, 0x99, 0x87, 0x89, 0x2d, 0x1a, 0x84, 0x89, 0xc4, 0x43, 0xc9, 0xfe, 0x90, - 0x83, 0x54, 0x02, 0x81, 0x45, 0xee, 0x26, 0x52, 0x57, 0xec, 0x49, 0x33, 0x29, 0x59, 0x97, 0x4c, - 0x95, 0x03, 0x01, 0x51, 0xa7, 0x8a, 0xc4, 0x32, 0xbf, 0x93, 0x83, 0xca, 0x92, 0x13, 0x39, 0x3b, - 0x4e, 0x28, 0xfa, 0x73, 0xeb, 0x16, 0x93, 0xe3, 0x4a, 0x43, 0x51, 0x8e, 0xb3, 0x9a, 0x7f, 0xec, - 0xe6, 0xbd, 0x9c, 0x6e, 0xde, 0x24, 0xdb, 0x20, 0x45, 0xf3, 0x92, 0x46, 0xbd, 0x7b, 0x7a, 0xa3, - 0x2a, 0xa2, 0x51, 0x45, 0xd9, 0xa8, 0xa4, 0x29, 0xe4, 0x5d, 0x28, 0x34, 0x7b, 0xb4, 0x2d, 0x84, - 0x88, 0x94, 0xfd, 0x7a, 0xe3, 0x18, 0xc2, 0xd6, 0xad, 0x7a, 0x59, 0xb0, 0x29, 0x84, 0x3d, 0xda, - 0xb6, 0x90, 0x4c, 0x59, 0x34, 0xdf, 0x1d, 0x87, 0x73, 0x59, 0x64, 0xe4, 0x5d, 0x7d, 0x73, 0xe2, - 0xdd, 0xf3, 0xdc, 0xd0, 0xcd, 0x69, 0xce, 0xd0, 0xb7, 0xa7, 0xeb, 0x50, 0xdc, 0x60, 0x13, 0xb2, - 0xed, 0x77, 0x44, 0xcf, 0x31, 0xa9, 0x58, 0xec, 0x49, 0x98, 0x61, 0xc5, 0xe5, 0xe4, 0x39, 0xc8, - 0x6f, 0x5a, 0xcb, 0xa2, 0xbb, 0x4a, 0xc7, 0x47, 0xd5, 0x7c, 0x3f, 0xf0, 0xe6, 0x0c, 0x8b, 0x41, - 0xc9, 0x3c, 0x8c, 0x2f, 0xd6, 0x16, 0x69, 0x10, 0x61, 0x37, 0x95, 0xeb, 0x17, 0xd9, 0x6c, 0x69, - 0x3b, 0x76, 0x9b, 0x06, 0x91, 0xf6, 0x79, 0x81, 0x46, 0x3e, 0x0f, 0xf9, 0xda, 0x76, 0x53, 0xf4, - 0x0c, 0x88, 0x9e, 0xa9, 0x6d, 0x37, 0xeb, 0x53, 0xa2, 0x23, 0xf2, 0xce, 0xa3, 0x90, 0x71, 0xaf, - 0x6d, 0x37, 0xd5, 0xd1, 0x1a, 0x3f, 0x61, 0xb4, 0xae, 0x41, 0x91, 0xe9, 0x19, 0x6c, 0x83, 0x47, - 0xa1, 0x58, 0xe2, 0xea, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x31, 0x56, 0x5b, 0x8a, 0x09, - 0x3f, 0xa1, 0xb6, 0x48, 0x65, 0x85, 0x3c, 0x86, 0xa9, 0xa5, 0xc3, 0xae, 0x73, 0xe0, 0xb5, 0xc5, - 0x16, 0x5e, 0xc2, 0x2d, 0xfc, 0xc6, 0x09, 0xc3, 0x78, 0x43, 0x23, 0xe0, 0xbb, 0xba, 0x14, 0xbe, - 0x73, 0x2e, 0x2f, 0xb3, 0xd3, 0x3b, 0xfc, 0x9c, 0x61, 0xe9, 0x1f, 0x62, 0x6b, 0x49, 0x8a, 0x48, - 0xd4, 0xab, 0x92, 0x69, 0x27, 0xc1, 0xc9, 0x5a, 0x0a, 0x04, 0x44, 0x5d, 0x4b, 0xf1, 0xa6, 0xfb, - 0x2e, 0xe4, 0xef, 0x2e, 0x6e, 0xcc, 0x4d, 0x22, 0x0f, 0x22, 0x78, 0xdc, 0x5d, 0xdc, 0x58, 0xec, - 0xf8, 0x7d, 0xb7, 0xf9, 0xe1, 0x4a, 0xfd, 0xa2, 0x60, 0x33, 0xb5, 0xdb, 0xee, 0x69, 0x35, 0x62, - 0x74, 0xa4, 0x01, 0x45, 0xd9, 0xca, 0xb9, 0x32, 0xf2, 0x98, 0x4d, 0x35, 0x7e, 0xeb, 0x16, 0x5f, - 0x6b, 0xae, 0xf8, 0xad, 0xd6, 0x42, 0xe2, 0x5c, 0xde, 0x06, 0x32, 0xd8, 0x2f, 0x19, 0x9a, 0xc4, - 0xe7, 0x55, 0x4d, 0x62, 0x72, 0xe1, 0xbc, 0xf8, 0xd6, 0xa2, 0x7f, 0x70, 0xe0, 0x74, 0x5d, 0xa4, - 0xdd, 0x5a, 0x50, 0x15, 0x8c, 0x1a, 0x4c, 0x27, 0x15, 0x59, 0xf1, 0xc2, 0x88, 0xcc, 0x43, 0x49, - 0x42, 0xd8, 0x26, 0x92, 0xcf, 0xac, 0xb2, 0x95, 0xe0, 0x98, 0x7f, 0x9c, 0x03, 0x48, 0x4a, 0x9e, - 0x51, 0x39, 0xf3, 0x63, 0x9a, 0x9c, 0x39, 0x9f, 0x9e, 0xa0, 0x43, 0x25, 0x0c, 0x79, 0x1f, 0xc6, - 0x99, 0xca, 0xd5, 0x97, 0x2a, 0xe5, 0xc5, 0x34, 0x29, 0x16, 0x6e, 0xdd, 0xaa, 0x4f, 0x0b, 0xe2, - 0xf1, 0x10, 0x21, 0x96, 0x20, 0x53, 0x44, 0xd4, 0xff, 0x2c, 0x24, 0x83, 0x21, 0x84, 0xd3, 0x35, - 0x45, 0xba, 0x18, 0xc9, 0x7a, 0x94, 0xd2, 0x45, 0x91, 0x2d, 0x97, 0xb8, 0x6c, 0xe1, 0x9d, 0x3a, - 0x21, 0x64, 0x4b, 0x5a, 0xb2, 0xf0, 0x0e, 0x3c, 0x55, 0xb2, 0xf4, 0xd2, 0xcb, 0xb6, 0x80, 0xd3, - 0xe0, 0x5a, 0x66, 0xaf, 0x64, 0x2d, 0xd8, 0xab, 0xa7, 0x2d, 0xd8, 0xf4, 0x72, 0xbd, 0x35, 0x4c, - 0x96, 0x9d, 0x97, 0xab, 0xcb, 0x79, 0xa4, 0x92, 0xa3, 0x4c, 0x7b, 0x9b, 0x2f, 0xcd, 0xf1, 0xa1, - 0x4b, 0xf3, 0x7c, 0xe6, 0xd2, 0xe4, 0x0b, 0xf3, 0x6d, 0x18, 0xab, 0xfd, 0x4c, 0x3f, 0xa0, 0x42, - 0xf7, 0x2b, 0xcb, 0x6f, 0x32, 0x58, 0xbc, 0xa6, 0x67, 0x1c, 0xf6, 0x53, 0xd5, 0x99, 0xb1, 0x9c, - 0x7d, 0xb9, 0xb5, 0xd2, 0x14, 0x7a, 0x1d, 0x49, 0x75, 0x4b, 0x6b, 0x45, 0xa9, 0x76, 0xa4, 0xb5, - 0x9a, 0x51, 0x91, 0x79, 0xc8, 0xd5, 0x96, 0xd0, 0x58, 0x9c, 0x5c, 0x28, 0xc9, 0xcf, 0x2e, 0xd5, - 0xcf, 0x09, 0x92, 0xb2, 0xa3, 0xd9, 0x0f, 0xb5, 0xa5, 0x4f, 0x6f, 0xf1, 0x77, 0x14, 0x35, 0x41, - 0x4c, 0x53, 0x66, 0x8e, 0x8a, 0xc9, 0x62, 0x24, 0x4a, 0xcb, 0xc0, 0x64, 0x89, 0xa7, 0xca, 0x6b, - 0x7c, 0xe0, 0x72, 0x03, 0x03, 0x37, 0xa9, 0x6c, 0x42, 0x38, 0x5c, 0xe6, 0x5f, 0x18, 0x88, 0x4b, - 0x5e, 0x87, 0x71, 0x8b, 0xee, 0x26, 0x7b, 0x2d, 0xda, 0x6c, 0x01, 0x42, 0xd4, 0x0f, 0x70, 0x1c, - 0x14, 0xe4, 0xd4, 0x0d, 0xf7, 0xbc, 0x07, 0x91, 0xf8, 0x4a, 0x2c, 0xc8, 0x05, 0x58, 0x11, 0xe4, - 0x02, 0xa2, 0x09, 0x72, 0x01, 0x63, 0x53, 0xcc, 0x5a, 0x6a, 0x0a, 0x65, 0x52, 0xd6, 0xd4, 0x5a, - 0x52, 0xc6, 0x2a, 0x70, 0xb5, 0xb1, 0xb2, 0x96, 0x9a, 0xe4, 0x36, 0x94, 0x6a, 0xed, 0xb6, 0xdf, - 0x57, 0x8c, 0x9e, 0xb9, 0xe3, 0xa3, 0xea, 0x39, 0x87, 0x03, 0x75, 0x13, 0x3d, 0x41, 0x35, 0xeb, - 0x49, 0xad, 0x19, 0x8f, 0xc5, 0x4e, 0x3f, 0x8c, 0x68, 0xb0, 0xbc, 0x24, 0x9a, 0x8c, 0x3c, 0xda, - 0x1c, 0x98, 0xe2, 0x11, 0xa3, 0x9a, 0xff, 0xd9, 0xc0, 0x1a, 0x93, 0xb7, 0x00, 0x96, 0xbb, 0x4c, - 0xb1, 0x6d, 0xd3, 0x98, 0x01, 0x1a, 0xcf, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, 0xfd, 0xd3, 0xb9, - 0x91, 0x3f, 0xcd, 0x3e, 0x29, 0xd5, 0x64, 0x71, 0x8e, 0x22, 0x3e, 0x19, 0x08, 0x68, 0xea, 0x93, - 0x09, 0x32, 0x79, 0x05, 0x26, 0x96, 0x6b, 0xab, 0xb5, 0x7e, 0xb4, 0x87, 0xfd, 0x55, 0xe4, 0x02, - 0xcb, 0x73, 0x0e, 0x6c, 0xa7, 0x1f, 0xed, 0x59, 0xb2, 0xd0, 0xfc, 0x05, 0x03, 0x26, 0x95, 0xb5, - 0xca, 0xaa, 0xba, 0x11, 0xf8, 0x1f, 0xd1, 0x76, 0xa4, 0xf7, 0x52, 0x8f, 0x03, 0x53, 0x55, 0x8d, - 0x51, 0x53, 0xbd, 0x93, 0x7b, 0x82, 0xde, 0x31, 0xe7, 0x85, 0x08, 0x60, 0x36, 0x80, 0x72, 0xc4, - 0x81, 0x36, 0x00, 0xd3, 0x71, 0x54, 0x1b, 0x80, 0x95, 0x9b, 0x7f, 0x60, 0xb0, 0xa5, 0x4b, 0xe6, - 0x01, 0xee, 0xd3, 0xc3, 0xc8, 0xd9, 0xb9, 0xe3, 0x75, 0xb4, 0xa3, 0xab, 0x7d, 0x84, 0xda, 0x0f, - 0xbc, 0x0e, 0xb5, 0x14, 0x14, 0x72, 0x0b, 0x8a, 0xf7, 0x83, 0x9d, 0x37, 0x11, 0x3d, 0x17, 0x8b, - 0xe0, 0xb3, 0xfb, 0xc1, 0xce, 0x9b, 0x88, 0xac, 0xce, 0x57, 0x89, 0x48, 0x4c, 0x18, 0x5f, 0xf2, - 0x0f, 0x1c, 0x4f, 0x6e, 0x7b, 0xc0, 0xf6, 0x0e, 0x17, 0x21, 0x96, 0x28, 0x61, 0x42, 0xbf, 0xb9, - 0xb1, 0x26, 0x26, 0x26, 0x0a, 0xfd, 0xb0, 0xd7, 0xb5, 0x18, 0xcc, 0xfc, 0x9e, 0x01, 0x93, 0x8a, - 0x44, 0x22, 0x5f, 0x14, 0x66, 0xbe, 0x81, 0x87, 0x54, 0x17, 0x06, 0x65, 0x16, 0x2b, 0xe5, 0xdb, - 0x35, 0x33, 0xff, 0x85, 0xd1, 0x9f, 0x48, 0x83, 0xdc, 0x28, 0xd2, 0xe0, 0x2d, 0x00, 0xae, 0xcb, - 0x61, 0x77, 0x2a, 0xf3, 0x46, 0x39, 0xd4, 0x53, 0x07, 0x23, 0x41, 0x36, 0xff, 0x66, 0x0e, 0x8a, - 0xc2, 0x56, 0x59, 0x78, 0x46, 0x75, 0x88, 0x37, 0x35, 0x1d, 0xe2, 0xac, 0x20, 0x55, 0x94, 0xdb, - 0x85, 0x53, 0x6c, 0x94, 0xb7, 0xa0, 0x2c, 0xbb, 0x00, 0x55, 0xb1, 0xd7, 0x60, 0x42, 0x5a, 0xd9, - 0x5c, 0x11, 0x9b, 0xd1, 0x78, 0x6e, 0x2d, 0x58, 0xb2, 0xdc, 0xfc, 0xce, 0x98, 0xa4, 0xe5, 0x5f, - 0x62, 0x5d, 0x58, 0x73, 0xdd, 0x40, 0xed, 0x42, 0xc7, 0x75, 0x03, 0x0b, 0xa1, 0x6c, 0xa0, 0x36, - 0xfa, 0x3b, 0x1d, 0xaf, 0x8d, 0x38, 0xca, 0xaa, 0xe9, 0x21, 0xd4, 0x66, 0xa8, 0xea, 0x40, 0x25, - 0xc8, 0x9a, 0x89, 0x90, 0x3f, 0xd1, 0x44, 0xf8, 0x49, 0x28, 0x2d, 0x1e, 0xb8, 0x9a, 0x0a, 0x61, - 0x66, 0x74, 0xca, 0x8d, 0x18, 0x89, 0x2b, 0x0f, 0x57, 0x44, 0x1f, 0x9d, 0x6b, 0x1f, 0xb8, 0x83, - 0x8a, 0x43, 0xc2, 0x52, 0xd3, 0xf1, 0xc7, 0x3e, 0x89, 0x8e, 0x7f, 0x1b, 0x4a, 0x9b, 0x21, 0x6d, - 0xf5, 0xbb, 0x5d, 0xda, 0x41, 0x75, 0xa2, 0xc8, 0x65, 0x4f, 0x3f, 0xa4, 0x76, 0x84, 0x50, 0xb5, - 0x02, 0x31, 0xaa, 0x3a, 0xad, 0x26, 0x4e, 0x98, 0x56, 0x5f, 0x84, 0x42, 0xad, 0xd7, 0x93, 0xc6, - 0x4f, 0xbc, 0x49, 0xf6, 0x7a, 0xb8, 0xf5, 0x4d, 0x3b, 0xbd, 0x9e, 0x6e, 0xca, 0x20, 0x36, 0xa1, - 0x40, 0xee, 0xf7, 0x77, 0x68, 0xd0, 0xa5, 0x11, 0x0d, 0x85, 0x68, 0x0e, 0xe7, 0x00, 0x79, 0xcc, - 0xc9, 0x33, 0xe6, 0x34, 0x02, 0x1a, 0xae, 0x17, 0xf7, 0xfb, 0x3b, 0xd4, 0x16, 0x32, 0x5e, 0xed, - 0xbb, 0x0c, 0x86, 0x97, 0x9b, 0x30, 0xad, 0xf7, 0xff, 0x53, 0x50, 0x2c, 0x3e, 0x28, 0x14, 0x8b, - 0x95, 0x92, 0xf9, 0x4b, 0x39, 0x98, 0xac, 0xf5, 0x7a, 0xcf, 0xf8, 0x09, 0xc4, 0x8f, 0x6b, 0xab, - 0xfa, 0x42, 0x32, 0x7a, 0x4f, 0x70, 0xf8, 0xf0, 0x97, 0x06, 0xcc, 0xa4, 0x28, 0xd4, 0xda, 0x1b, - 0x23, 0x5a, 0xe4, 0xb9, 0x11, 0x2d, 0xf2, 0xfc, 0x70, 0x8b, 0x5c, 0x5d, 0x33, 0x85, 0x4f, 0xb2, - 0x66, 0x5e, 0x85, 0x7c, 0xad, 0xd7, 0x13, 0xbd, 0x52, 0x4e, 0x7a, 0x65, 0xeb, 0x16, 0xdf, 0x88, - 0x9c, 0x5e, 0xcf, 0x62, 0x18, 0xe6, 0x1b, 0x50, 0x42, 0x30, 0x4a, 0xb4, 0xab, 0x62, 0x29, 0x70, - 0x71, 0xa6, 0x91, 0xf1, 0x69, 0x6f, 0xfe, 0x1f, 0x03, 0xc6, 0xf0, 0xf7, 0x33, 0x3a, 0x5d, 0x16, - 0xb4, 0xe9, 0x52, 0x51, 0xa6, 0xcb, 0x28, 0x13, 0xe5, 0x0f, 0xf3, 0xd8, 0x5b, 0x62, 0x8a, 0x08, - 0x9b, 0xce, 0xc8, 0xb0, 0xe9, 0x3e, 0x81, 0x00, 0xdf, 0x4f, 0x5b, 0x77, 0x79, 0x1c, 0x8c, 0x17, - 0xd3, 0x55, 0x7d, 0x2a, 0x86, 0xdd, 0x3d, 0x20, 0xcb, 0xdd, 0x90, 0xb6, 0xfb, 0x01, 0x6d, 0xee, - 0x7b, 0xbd, 0x2d, 0x1a, 0x78, 0x0f, 0x0e, 0x85, 0x66, 0x88, 0x32, 0xd6, 0x13, 0xa5, 0x76, 0xb8, - 0xef, 0xf5, 0xec, 0x87, 0x58, 0x6e, 0x65, 0xd0, 0x90, 0xf7, 0x61, 0xc2, 0xa2, 0x8f, 0x02, 0x2f, - 0xa2, 0xa2, 0x6f, 0xa7, 0x63, 0x3b, 0x00, 0xa1, 0x5c, 0x37, 0x09, 0xf8, 0x0f, 0x75, 0xfc, 0x45, - 0xf9, 0xa7, 0x67, 0x46, 0x7d, 0x77, 0x0c, 0xd7, 0xc2, 0x29, 0x37, 0x65, 0x27, 0x18, 0xe8, 0xfa, - 0x60, 0xe6, 0x9f, 0x64, 0x30, 0xb7, 0xa0, 0xcc, 0x4c, 0xb7, 0x94, 0xa5, 0x7e, 0x25, 0x19, 0xcb, - 0x1b, 0x6a, 0xf1, 0x49, 0x97, 0x64, 0x1a, 0x1f, 0x62, 0xa7, 0x27, 0x09, 0xbf, 0x7c, 0x7b, 0x5e, - 0x61, 0x9c, 0x31, 0x3d, 0x62, 0xd1, 0xd1, 0xe6, 0x9d, 0xf5, 0xc4, 0x13, 0x63, 0xfc, 0x93, 0x4d, - 0x8c, 0x89, 0x8f, 0x33, 0x31, 0xd2, 0xd7, 0x93, 0xc5, 0x27, 0xb9, 0x9e, 0xbc, 0xfc, 0x3e, 0xcc, - 0x0e, 0xf4, 0xf0, 0x93, 0x5c, 0xf1, 0x7d, 0x7a, 0xd3, 0xf2, 0xe7, 0xe2, 0x7e, 0x21, 0x0b, 0x68, - 0x8e, 0x7a, 0x01, 0x6d, 0x47, 0x28, 0x7a, 0x85, 0xb4, 0x0c, 0x04, 0x2c, 0x65, 0x2f, 0x23, 0x8c, - 0xbc, 0x07, 0x13, 0xfc, 0x8a, 0x24, 0x9c, 0xcb, 0xe1, 0xd8, 0x4f, 0x89, 0x2f, 0x72, 0xa8, 0xb8, - 0xa7, 0xe6, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x2e, 0x8c, 0x8b, 0x2b, 0x96, 0x93, 0xd7, 0x45, - 0x15, 0xc6, 0xb6, 0x92, 0x9e, 0xc1, 0x63, 0x71, 0xde, 0x08, 0x8b, 0xc3, 0xcd, 0x5f, 0x31, 0x60, - 0x5a, 0x6f, 0x25, 0xb9, 0x01, 0xe3, 0xe2, 0x0e, 0xd0, 0xc0, 0x3b, 0x40, 0xd6, 0x9a, 0x71, 0x7e, - 0xfb, 0xa7, 0xdd, 0xf9, 0x09, 0x2c, 0x26, 0xfa, 0x05, 0x07, 0x6c, 0x8b, 0x10, 0xfd, 0x62, 0x92, - 0x5a, 0xb2, 0x8c, 0x99, 0x5c, 0x16, 0x0d, 0xfb, 0x9d, 0x48, 0x35, 0xb9, 0x02, 0x84, 0x58, 0xa2, - 0xc4, 0x3c, 0x32, 0x00, 0x9a, 0xcd, 0x7b, 0xf7, 0xe9, 0xe1, 0x86, 0xe3, 0x05, 0x68, 0xb6, 0xe2, - 0x6a, 0xbc, 0x2f, 0x46, 0xab, 0x2c, 0xcc, 0x56, 0xbe, 0x72, 0xf7, 0xe9, 0xa1, 0x66, 0xb6, 0x4a, - 0x54, 0x5c, 0xf2, 0x81, 0xf7, 0xd0, 0x89, 0x28, 0x23, 0xcc, 0x21, 0x21, 0x5f, 0xf2, 0x1c, 0x9a, - 0xa2, 0x54, 0x90, 0xc9, 0x37, 0x60, 0x3a, 0xf9, 0x85, 0x8e, 0x07, 0x79, 0xb4, 0xe9, 0xe4, 0x8c, - 0xd0, 0x0b, 0xeb, 0x2f, 0x1c, 0x1f, 0x55, 0x2f, 0x2b, 0x5c, 0x6d, 0x86, 0xa5, 0xb0, 0x4e, 0x31, - 0x33, 0x7f, 0xcf, 0x00, 0x68, 0xad, 0x34, 0x65, 0x03, 0x5f, 0x81, 0x42, 0x7c, 0x1a, 0x54, 0xe6, - 0xb6, 0x71, 0xca, 0xf8, 0xc3, 0x72, 0xf2, 0x22, 0xe4, 0x93, 0x96, 0xcc, 0x1e, 0x1f, 0x55, 0xa7, - 0xf4, 0x16, 0xb0, 0x52, 0x72, 0x17, 0x26, 0x46, 0xaa, 0x33, 0xce, 0xce, 0x8c, 0xba, 0x4a, 0x6a, - 0x1c, 0x85, 0x0f, 0xb6, 0x5b, 0x9f, 0xdd, 0x51, 0xf8, 0x56, 0x0e, 0x66, 0x58, 0xbf, 0xd6, 0xfa, - 0xd1, 0x9e, 0x1f, 0x78, 0xd1, 0xe1, 0x33, 0x6b, 0x15, 0xbf, 0xa3, 0x29, 0x44, 0x97, 0xa5, 0xd8, - 0x52, 0xdb, 0x36, 0x92, 0x71, 0xfc, 0xe7, 0x13, 0x70, 0x36, 0x83, 0x8a, 0xbc, 0x2e, 0xbc, 0x6f, - 0x92, 0x33, 0x23, 0xf4, 0xae, 0xf9, 0xd1, 0x51, 0xb5, 0x2c, 0xd1, 0x5b, 0x89, 0xb7, 0xcd, 0x02, - 0x4c, 0x0a, 0xd3, 0x67, 0x2d, 0xd1, 0xa8, 0xd1, 0x6d, 0x43, 0x9e, 0x89, 0xa1, 0x68, 0x52, 0x91, - 0x48, 0x0d, 0xca, 0x8b, 0x7b, 0xb4, 0xbd, 0xef, 0x75, 0x77, 0xef, 0xd3, 0x43, 0xae, 0x2f, 0x95, - 0xeb, 0xcf, 0x33, 0x4b, 0xab, 0x2d, 0xe0, 0x6c, 0x48, 0x75, 0x23, 0x4e, 0x23, 0x21, 0xef, 0xc1, - 0x64, 0xd3, 0xdb, 0xed, 0x4a, 0x0e, 0x05, 0xe4, 0x70, 0xe5, 0xf8, 0xa8, 0x7a, 0x21, 0xe4, 0xe0, - 0x41, 0x06, 0x2a, 0x01, 0x79, 0x0d, 0xc6, 0x2c, 0xbf, 0x43, 0xf9, 0x36, 0x2c, 0xfc, 0x39, 0x02, - 0x06, 0x50, 0xcf, 0xa6, 0x11, 0x83, 0xdc, 0x83, 0x09, 0xf6, 0xcf, 0xaa, 0xd3, 0x9b, 0x1b, 0x47, - 0xb9, 0x4d, 0x62, 0x05, 0x1f, 0xa1, 0x3d, 0xaf, 0xbb, 0xab, 0xea, 0xf8, 0x1d, 0x6a, 0x1f, 0x38, - 0x3d, 0x6d, 0x5f, 0xe4, 0x88, 0x64, 0x0b, 0x26, 0x13, 0x41, 0x10, 0xce, 0x4d, 0x68, 0x77, 0x41, - 0x49, 0x49, 0xfd, 0x73, 0x82, 0xd9, 0xc5, 0xa8, 0x13, 0xe2, 0xdc, 0xee, 0x31, 0x7c, 0xbd, 0x31, - 0x0a, 0x23, 0xcd, 0x06, 0x29, 0x0e, 0xb7, 0x41, 0x8c, 0x53, 0x6d, 0x10, 0x17, 0x40, 0x74, 0x52, - 0xad, 0xb3, 0x2b, 0xdc, 0xaf, 0x5e, 0x1b, 0x3e, 0xc1, 0x6e, 0x24, 0xc8, 0xb8, 0x26, 0xf9, 0xc9, - 0x94, 0xe8, 0x7f, 0xa7, 0xb3, 0xab, 0x9d, 0x4c, 0xc5, 0xa8, 0xac, 0x1b, 0x12, 0x51, 0x23, 0x2d, - 0x70, 0xd9, 0x0d, 0x49, 0x49, 0xd2, 0x0d, 0x1f, 0x3d, 0x8a, 0x86, 0x75, 0x83, 0xc2, 0x88, 0xac, - 0x01, 0xd4, 0xda, 0x91, 0xf7, 0x90, 0xe2, 0x94, 0x98, 0xd4, 0x3a, 0x62, 0xb1, 0x76, 0x9f, 0x1e, - 0x36, 0x69, 0x14, 0x7b, 0x36, 0x9c, 0x77, 0x10, 0x35, 0x35, 0x4d, 0x2c, 0x85, 0x03, 0xe9, 0xc1, - 0xf9, 0x9a, 0xeb, 0x7a, 0xdc, 0x25, 0xaf, 0x15, 0xb0, 0xf9, 0xeb, 0x22, 0xeb, 0x72, 0x36, 0xeb, - 0xd7, 0x04, 0xeb, 0xcf, 0x39, 0x31, 0x95, 0x1d, 0x71, 0xb2, 0xf4, 0x67, 0xb2, 0x19, 0x9b, 0xeb, - 0x30, 0xad, 0x77, 0xa9, 0xee, 0x8c, 0x56, 0x86, 0xa2, 0xd5, 0xac, 0xd9, 0xcd, 0x7b, 0xb5, 0x9b, - 0x15, 0x83, 0x54, 0xa0, 0x2c, 0x7e, 0x2d, 0xd8, 0x0b, 0x6f, 0xde, 0xae, 0xe4, 0x34, 0xc8, 0x9b, - 0x37, 0x17, 0x2a, 0x79, 0xf3, 0x0f, 0x0d, 0x28, 0xca, 0xfa, 0x91, 0xdb, 0x90, 0x6f, 0x36, 0xef, - 0xa5, 0xae, 0x20, 0x93, 0xad, 0x97, 0x6f, 0x32, 0x61, 0xb8, 0xa7, 0x6e, 0x32, 0xcd, 0xe6, 0x3d, - 0x46, 0xd7, 0x5a, 0x69, 0x0a, 0xa5, 0x25, 0x63, 0xba, 0xce, 0x0e, 0xb9, 0x97, 0xb9, 0x0d, 0xf9, - 0x0f, 0xb6, 0x5b, 0xc2, 0x1a, 0xca, 0x18, 0x5f, 0xa4, 0xfb, 0xe8, 0x91, 0xba, 0xf5, 0x31, 0x02, - 0xd3, 0x82, 0x49, 0x65, 0x69, 0x71, 0x25, 0xe2, 0xc0, 0x8f, 0xdd, 0xb4, 0x84, 0x12, 0xc1, 0x20, - 0x96, 0x28, 0x61, 0x3a, 0xcf, 0x8a, 0xdf, 0x76, 0x3a, 0x42, 0x1b, 0x41, 0x9d, 0xa7, 0xc3, 0x00, - 0x16, 0x87, 0x9b, 0x7f, 0x64, 0x40, 0x65, 0x23, 0xf0, 0x1f, 0x7a, 0x4c, 0x02, 0xb7, 0xfc, 0x7d, - 0xda, 0xdd, 0xba, 0x49, 0xde, 0x90, 0x42, 0x80, 0xab, 0x70, 0x17, 0x19, 0x15, 0x0a, 0x81, 0x1f, - 0x1d, 0x55, 0xa1, 0x79, 0x18, 0x46, 0xf4, 0x80, 0x95, 0x4b, 0x41, 0xa0, 0x78, 0xbb, 0xe5, 0x46, - 0xf7, 0xa0, 0x39, 0xc5, 0xdb, 0xad, 0x0a, 0x63, 0x58, 0x1d, 0xc5, 0x89, 0x61, 0x2c, 0x62, 0x00, - 0x8b, 0xc3, 0x15, 0x81, 0xfd, 0x9d, 0xdc, 0x40, 0x1b, 0x16, 0x3e, 0x53, 0x5e, 0x28, 0x7a, 0xe3, - 0x46, 0xda, 0xc4, 0xbe, 0x0a, 0xe7, 0xd2, 0x5d, 0x82, 0xe7, 0x22, 0x35, 0x98, 0xd1, 0xe1, 0xf2, - 0x88, 0xe4, 0x62, 0xe6, 0xb7, 0xb6, 0x16, 0xac, 0x34, 0xbe, 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, - 0xd5, 0xef, 0x50, 0xa6, 0xd9, 0xd4, 0xb6, 0x9b, 0xe2, 0x42, 0x4a, 0xbd, 0x34, 0x72, 0x1e, 0x85, - 0xb6, 0xb8, 0xbd, 0xd2, 0xe4, 0x48, 0x8c, 0x2c, 0x48, 0xf9, 0xf5, 0x5b, 0x28, 0x66, 0x68, 0x4c, - 0xca, 0xef, 0xe9, 0xc2, 0x14, 0xa9, 0x40, 0x66, 0xe3, 0xc7, 0x7e, 0xf9, 0x1d, 0x79, 0x34, 0x8c, - 0xe3, 0x87, 0x74, 0xbe, 0x76, 0xcd, 0x21, 0xd1, 0xc8, 0x1b, 0x30, 0xce, 0x3e, 0x6d, 0xc9, 0x4b, - 0x0c, 0xb4, 0x2a, 0xb0, 0x8e, 0x81, 0x76, 0x1b, 0xc8, 0x91, 0xcc, 0x7f, 0x95, 0x4b, 0x77, 0xa0, - 0xd0, 0x02, 0x9e, 0x70, 0x6d, 0xbc, 0x0d, 0x63, 0xb5, 0x4e, 0xc7, 0x7f, 0x24, 0xa4, 0x84, 0x3c, - 0xa6, 0x89, 0xfb, 0x8f, 0xef, 0xb0, 0x0e, 0x43, 0xd1, 0x6e, 0x7f, 0x19, 0x80, 0x2c, 0x42, 0xa9, - 0xb6, 0xdd, 0x5c, 0x5e, 0x5e, 0x6a, 0xb5, 0x56, 0x84, 0x93, 0xf1, 0xcb, 0xb2, 0x7f, 0x3c, 0xcf, - 0xb5, 0xa3, 0xa8, 0x33, 0xc4, 0x07, 0x31, 0xa1, 0x23, 0xef, 0x02, 0x7c, 0xe0, 0x7b, 0xdd, 0x55, - 0x1a, 0xed, 0xf9, 0xae, 0x68, 0x3c, 0x53, 0x29, 0x26, 0x3f, 0xf2, 0xbd, 0xae, 0x7d, 0x80, 0x60, - 0x56, 0xf7, 0x04, 0xc9, 0x52, 0xfe, 0x67, 0x3d, 0x5d, 0xf7, 0x23, 0xd4, 0x61, 0xc6, 0x92, 0x9e, - 0xde, 0xf1, 0xa3, 0xf4, 0x1d, 0x8b, 0x44, 0x33, 0x7f, 0x35, 0x07, 0xd3, 0xdc, 0x52, 0xe5, 0x13, - 0xe6, 0x99, 0x5d, 0x8c, 0x6f, 0x6b, 0x8b, 0xf1, 0x92, 0xdc, 0x18, 0x94, 0xa6, 0x8d, 0xb4, 0x14, - 0xf7, 0x80, 0x0c, 0xd2, 0x10, 0x4b, 0x9e, 0xa7, 0x8c, 0xb2, 0x0a, 0x6f, 0x26, 0x77, 0xc7, 0x21, - 0x12, 0xd9, 0x28, 0x0a, 0x43, 0x4b, 0xe3, 0x61, 0xfe, 0x4a, 0x0e, 0xa6, 0x14, 0x7d, 0xf2, 0x99, - 0xed, 0xf8, 0x2f, 0x69, 0x1d, 0x2f, 0xef, 0x20, 0x94, 0x96, 0x8d, 0xd4, 0xef, 0x7d, 0x98, 0x1d, - 0x20, 0x49, 0xab, 0xe5, 0xc6, 0x28, 0x6a, 0xf9, 0xeb, 0x83, 0x97, 0xdb, 0xdc, 0x21, 0x39, 0xbe, - 0xdc, 0x56, 0x6f, 0xd3, 0xbf, 0x95, 0x83, 0x73, 0xe2, 0x57, 0xad, 0xef, 0x7a, 0xd1, 0xa2, 0xdf, - 0x7d, 0xe0, 0xed, 0x3e, 0xb3, 0x63, 0x51, 0xd3, 0xc6, 0xa2, 0xaa, 0x8f, 0x85, 0xd2, 0xc0, 0xe1, - 0x43, 0x62, 0xfe, 0x9b, 0x22, 0xcc, 0x0d, 0x23, 0x60, 0x66, 0xbf, 0x62, 0x55, 0xa1, 0xd9, 0x9f, - 0xb2, 0x58, 0xb9, 0x3d, 0x95, 0x38, 0x73, 0xe4, 0x46, 0x70, 0xe6, 0x58, 0x81, 0x0a, 0x7e, 0xaa, - 0x49, 0x43, 0xd6, 0x09, 0x61, 0xe2, 0x0d, 0x79, 0xf5, 0xf8, 0xa8, 0x7a, 0xc5, 0x61, 0x65, 0x76, - 0x28, 0x0a, 0xed, 0x7e, 0xe0, 0x29, 0x3c, 0x06, 0x28, 0xc9, 0xef, 0x19, 0x30, 0x8d, 0xc0, 0xc6, - 0x43, 0xda, 0x8d, 0x90, 0x59, 0x41, 0x5c, 0xd2, 0xc4, 0x41, 0x27, 0xcd, 0x28, 0xf0, 0xba, 0xbb, - 0x78, 0x90, 0x14, 0xd6, 0x77, 0x58, 0x2f, 0xfc, 0xd9, 0x51, 0xf5, 0x9d, 0x8f, 0x13, 0xc8, 0x22, - 0x58, 0x85, 0xcc, 0x90, 0xe7, 0x15, 0xa5, 0xf8, 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, 0x3f, 0x01, - 0x17, 0x1b, 0x5d, 0x67, 0xa7, 0x43, 0x17, 0xfd, 0x6e, 0xe4, 0x75, 0xfb, 0x7e, 0x3f, 0xac, 0x3b, - 0xed, 0xfd, 0x7e, 0x2f, 0x14, 0x87, 0x9d, 0xd8, 0xf2, 0x76, 0x5c, 0x68, 0xef, 0xf0, 0x52, 0x85, - 0xe5, 0x30, 0x06, 0xe4, 0x1e, 0xcc, 0xf2, 0xa2, 0x5a, 0x3f, 0xf2, 0x9b, 0x6d, 0xa7, 0xe3, 0x75, - 0x77, 0xf1, 0x0c, 0xb4, 0x58, 0xbf, 0xcc, 0x6c, 0x4b, 0xa7, 0x1f, 0xf9, 0x76, 0xc8, 0xe1, 0x0a, - 0xbf, 0x41, 0x22, 0xb2, 0x0c, 0x33, 0x16, 0x75, 0xdc, 0x55, 0xe7, 0xf1, 0xa2, 0xd3, 0x73, 0xda, - 0x5e, 0x74, 0x88, 0x96, 0x59, 0xbe, 0x5e, 0x3d, 0x3e, 0xaa, 0x3e, 0x17, 0x50, 0xc7, 0xb5, 0x0f, - 0x9c, 0xc7, 0x76, 0x5b, 0x14, 0x2a, 0xcc, 0xd2, 0x74, 0x31, 0x2b, 0xaf, 0x1b, 0xb3, 0x2a, 0xa5, - 0x59, 0x79, 0xdd, 0xe1, 0xac, 0x12, 0x3a, 0xc9, 0xaa, 0xe5, 0x04, 0xbb, 0x34, 0xe2, 0x87, 0x84, - 0x70, 0xd5, 0xb8, 0x66, 0x28, 0xac, 0x22, 0x2c, 0xb3, 0xf1, 0xc0, 0x30, 0xcd, 0x4a, 0xa1, 0x63, - 0x33, 0x6f, 0x3b, 0xf0, 0x22, 0xaa, 0xb6, 0x70, 0x12, 0xab, 0x85, 0xfd, 0x8f, 0xc7, 0xa4, 0xc3, - 0x9a, 0x38, 0x40, 0x99, 0x70, 0x53, 0x1a, 0x59, 0x1e, 0xe0, 0x96, 0xdd, 0xca, 0x01, 0xca, 0x98, - 0x9b, 0xda, 0xce, 0x29, 0x6c, 0xa7, 0xc2, 0x6d, 0x48, 0x43, 0x07, 0x28, 0xc9, 0x1a, 0xeb, 0xb4, - 0x88, 0x76, 0xd9, 0x8c, 0x16, 0x87, 0xa4, 0xd3, 0x58, 0xb5, 0x97, 0x84, 0x4d, 0x5d, 0x09, 0x64, - 0xb1, 0x9d, 0x71, 0x64, 0x9a, 0x26, 0xfe, 0xa0, 0x50, 0x1c, 0xab, 0x8c, 0x5b, 0x15, 0x3e, 0xe5, - 0x23, 0x36, 0x71, 0x50, 0x16, 0x9b, 0xbf, 0x95, 0x83, 0x4b, 0x52, 0x1c, 0xd3, 0xe8, 0x91, 0x1f, - 0xec, 0x7b, 0xdd, 0xdd, 0x67, 0x5c, 0xaa, 0xde, 0xd1, 0xa4, 0xea, 0x4b, 0xa9, 0x1d, 0x2e, 0xd5, - 0xca, 0x13, 0x44, 0xeb, 0x9f, 0x8e, 0xc1, 0xf3, 0x27, 0x52, 0x91, 0x0f, 0xd9, 0x2e, 0xe8, 0xd1, - 0x6e, 0xb4, 0xec, 0x76, 0x28, 0x33, 0xc3, 0xfc, 0x7e, 0x24, 0x0e, 0xb3, 0x5f, 0x3c, 0x3e, 0xaa, - 0x9e, 0xe5, 0xb1, 0x18, 0xb6, 0xe7, 0x76, 0xa8, 0x1d, 0xf1, 0x62, 0x6d, 0x98, 0x06, 0xa9, 0x19, - 0xcb, 0x38, 0x32, 0x6c, 0xb9, 0x1b, 0xd1, 0xe0, 0xa1, 0xc3, 0x5d, 0xd2, 0x05, 0xcb, 0x7d, 0x4a, - 0x7b, 0xb6, 0xc3, 0x4a, 0x6d, 0x4f, 0x14, 0xeb, 0x2c, 0x07, 0xa8, 0xc9, 0x1d, 0x85, 0xe5, 0x22, - 0x33, 0x0e, 0x56, 0x9d, 0xc7, 0x42, 0xe3, 0xc5, 0xf3, 0x55, 0x85, 0x25, 0xf7, 0x87, 0x3b, 0x70, - 0x1e, 0x5b, 0x83, 0x24, 0xe4, 0x1b, 0x70, 0x5e, 0x08, 0x6e, 0x26, 0xc4, 0x02, 0xbf, 0x23, 0x5b, - 0x5c, 0x40, 0x5e, 0xaf, 0x1e, 0x1f, 0x55, 0x2f, 0x0a, 0xb1, 0x6f, 0xb7, 0x39, 0x46, 0x66, 0xab, - 0xb3, 0xb9, 0x90, 0x16, 0xdb, 0xc8, 0x52, 0xdd, 0xb1, 0x4a, 0xc3, 0xd0, 0xd9, 0x95, 0xda, 0x31, - 0xbf, 0x51, 0x52, 0x3a, 0xd3, 0x3e, 0xe0, 0xe5, 0xd6, 0x50, 0x4a, 0x72, 0x0f, 0xa6, 0xb7, 0xe9, - 0x8e, 0x3a, 0x3e, 0xe3, 0xf1, 0x12, 0xaf, 0x3c, 0xa2, 0x3b, 0xc3, 0x07, 0x27, 0x45, 0x47, 0x3c, - 0x98, 0xdd, 0x08, 0xfc, 0xc7, 0x87, 0xcc, 0xd4, 0xa3, 0x5d, 0x1a, 0xa0, 0x23, 0xd6, 0x04, 0x1e, - 0x57, 0xcd, 0x25, 0x9a, 0xa5, 0x5e, 0x5e, 0xff, 0xdc, 0xf1, 0x51, 0xf5, 0xf9, 0x1e, 0x03, 0xdb, - 0x1d, 0x01, 0xb7, 0x53, 0x81, 0x59, 0x83, 0x5c, 0xc9, 0x4f, 0xc1, 0x8c, 0xe5, 0xf7, 0x23, 0xaf, - 0xbb, 0xdb, 0x8c, 0x02, 0x27, 0xa2, 0xbb, 0x5c, 0x90, 0x27, 0x1e, 0x5f, 0xa9, 0x52, 0x7e, 0x30, - 0x1d, 0x70, 0xa0, 0x1d, 0x0a, 0xa8, 0x26, 0x49, 0x75, 0x02, 0xf3, 0x37, 0x72, 0x30, 0x27, 0x86, - 0xc1, 0xa2, 0x6d, 0x3f, 0x70, 0x9f, 0xfd, 0x65, 0xdf, 0xd0, 0x96, 0xfd, 0x8b, 0xb1, 0x8f, 0x52, - 0x56, 0x23, 0x4f, 0x58, 0xf5, 0xff, 0xcc, 0x80, 0x2b, 0x27, 0x11, 0xb1, 0xde, 0x89, 0x7d, 0xf0, - 0x4a, 0x03, 0xbe, 0x76, 0x3d, 0x38, 0x8b, 0xe3, 0x89, 0x07, 0xc7, 0xe1, 0x3d, 0x3f, 0x8c, 0xf0, - 0xf4, 0x2e, 0xa7, 0x39, 0x12, 0xd4, 0x7d, 0xbf, 0x83, 0x72, 0xbe, 0xfe, 0x3a, 0x13, 0xe7, 0x7f, - 0x76, 0x54, 0x05, 0x06, 0x5a, 0xc7, 0xcb, 0x48, 0xb6, 0xe7, 0xf3, 0x19, 0x83, 0xe7, 0xd2, 0xa1, - 0x8d, 0xde, 0x1f, 0xfb, 0xf4, 0x30, 0xb4, 0xb2, 0x58, 0xe3, 0x09, 0x4d, 0xad, 0x1f, 0xed, 0x6d, - 0x04, 0xf4, 0x01, 0x0d, 0x68, 0xb7, 0x4d, 0x3f, 0x63, 0x27, 0x34, 0x7a, 0xe3, 0x46, 0x32, 0x4f, - 0xfe, 0xdf, 0x38, 0x9c, 0xcb, 0x22, 0x63, 0xfd, 0xa2, 0x68, 0xc4, 0xe9, 0x28, 0xde, 0xbf, 0x65, - 0x40, 0xb9, 0x49, 0xdb, 0x7e, 0xd7, 0xbd, 0xe3, 0xb4, 0x23, 0x5f, 0xba, 0x64, 0xd8, 0x5c, 0xb2, - 0x31, 0xb8, 0xfd, 0x00, 0x0b, 0xb4, 0x93, 0x81, 0x2f, 0x8f, 0xa6, 0x88, 0xb6, 0x7d, 0x74, 0x5a, - 0x8d, 0xd8, 0x9c, 0x4c, 0x3e, 0x81, 0xb7, 0x1a, 0xda, 0x47, 0x49, 0x1d, 0xa6, 0x16, 0xfd, 0x6e, - 0x97, 0xb2, 0x1f, 0x8a, 0x0b, 0xe6, 0x95, 0xe3, 0xa3, 0xea, 0x5c, 0x5b, 0x16, 0xa4, 0x4f, 0x08, - 0x74, 0x12, 0x72, 0x0b, 0xf2, 0x9b, 0x0b, 0x77, 0xc4, 0x18, 0x48, 0x67, 0xb5, 0xcd, 0x85, 0x3b, - 0x68, 0xeb, 0x32, 0xfd, 0x61, 0xaa, 0xbf, 0xf0, 0x40, 0x3d, 0x03, 0xdd, 0x5c, 0xb8, 0x43, 0xd6, - 0x61, 0xd6, 0xa2, 0x3f, 0xdd, 0xf7, 0x02, 0x2a, 0x16, 0xc0, 0xea, 0x9d, 0x1a, 0x8e, 0x45, 0x91, - 0xcb, 0xb1, 0x80, 0x17, 0x4a, 0xdd, 0xde, 0x3e, 0x78, 0xa0, 0x46, 0xae, 0x0d, 0xd2, 0x92, 0x9f, - 0x87, 0xf3, 0x4b, 0x5e, 0x28, 0xea, 0xcc, 0x0f, 0x1f, 0x5d, 0xbc, 0x87, 0x1c, 0x1f, 0xb2, 0x1c, - 0x7e, 0x2c, 0x73, 0x39, 0x7c, 0xce, 0x8d, 0x99, 0xd8, 0xfc, 0x64, 0xd3, 0x4d, 0xfb, 0xae, 0x66, - 0x7f, 0x87, 0x7c, 0x04, 0xd3, 0x78, 0xda, 0x83, 0xe7, 0xb1, 0xe8, 0xce, 0x3c, 0x31, 0xe4, 0xcb, - 0x5f, 0xc8, 0xfc, 0xf2, 0x65, 0x3c, 0x3c, 0xb2, 0xf1, 0x54, 0x17, 0x5d, 0x9f, 0x35, 0x1b, 0x41, - 0xe3, 0x4c, 0x3e, 0x80, 0x19, 0xb1, 0xe9, 0xac, 0x3f, 0x68, 0xed, 0xd1, 0x25, 0xe7, 0x50, 0x38, - 0x21, 0xa0, 0xfe, 0x27, 0x76, 0x2a, 0xdb, 0x7f, 0x60, 0x47, 0x7b, 0xd4, 0x76, 0x1d, 0x4d, 0x3c, - 0xa7, 0x08, 0xc9, 0xcf, 0xc2, 0xe4, 0x8a, 0x8f, 0x17, 0x4f, 0x28, 0x6a, 0x4a, 0xc8, 0xe7, 0xab, - 0x18, 0xb9, 0xca, 0xc1, 0xa9, 0x4d, 0xe4, 0x47, 0x47, 0xd5, 0xb7, 0x9f, 0x74, 0x16, 0x2a, 0x1f, - 0xb0, 0xd4, 0xaf, 0x91, 0x45, 0x28, 0x6e, 0xd3, 0x1d, 0xd6, 0xda, 0x74, 0xd4, 0x95, 0x04, 0x73, - 0x79, 0xf1, 0x48, 0xfc, 0x52, 0x6f, 0x75, 0x24, 0x86, 0xf9, 0xaf, 0x0d, 0x9c, 0x81, 0xe4, 0x3a, - 0x3a, 0x82, 0xc5, 0xde, 0xe0, 0x68, 0x59, 0x3a, 0xbd, 0x9e, 0xee, 0xcf, 0xcd, 0x51, 0x98, 0x19, - 0x7a, 0xc7, 0x69, 0xd3, 0x48, 0x9e, 0x57, 0x22, 0xf2, 0x03, 0x84, 0xa8, 0x66, 0x28, 0xc7, 0x21, - 0x5f, 0x81, 0x73, 0x4b, 0xf4, 0xa1, 0xd7, 0xa6, 0xb5, 0x28, 0xa2, 0x21, 0x6f, 0xed, 0x62, 0x8d, - 0x5f, 0xec, 0x95, 0xea, 0x2f, 0x1d, 0x1f, 0x55, 0xaf, 0xba, 0x58, 0x6e, 0x3b, 0x09, 0x82, 0xdd, - 0x76, 0x54, 0x5e, 0x99, 0x1c, 0xcc, 0xff, 0x65, 0x24, 0x3d, 0x40, 0x5e, 0x85, 0x82, 0xb5, 0x11, - 0xd7, 0x9f, 0xdf, 0xd9, 0xa5, 0xaa, 0x8f, 0x08, 0xe4, 0x6b, 0x70, 0x5e, 0xe1, 0x83, 0x93, 0x83, - 0xba, 0xac, 0x42, 0xbc, 0x31, 0x2f, 0xe3, 0x25, 0x8d, 0x52, 0x13, 0x87, 0x63, 0xa4, 0x6a, 0x94, - 0xcd, 0x83, 0x35, 0x56, 0x29, 0x58, 0xa2, 0x5d, 0x8f, 0xf3, 0x56, 0x1a, 0xab, 0xf2, 0x76, 0x11, - 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0x1f, 0x14, 0x8a, 0x85, 0xca, 0x98, 0xf9, 0x97, 0x86, 0x92, 0x02, - 0xe0, 0x19, 0xdd, 0x3d, 0x6e, 0x6b, 0xbb, 0xc7, 0x39, 0x41, 0x1a, 0xb7, 0x8a, 0x95, 0x65, 0xee, - 0xf8, 0x33, 0x30, 0xa5, 0x21, 0xa1, 0xcb, 0xeb, 0x66, 0x48, 0x03, 0x7e, 0x3e, 0xf8, 0xd9, 0x72, - 0x79, 0x8d, 0xdb, 0x35, 0x92, 0x27, 0xe3, 0x9f, 0x1b, 0x30, 0x93, 0xa2, 0x60, 0xbd, 0xc1, 0x40, - 0x6a, 0x6f, 0xf4, 0x43, 0x1a, 0x58, 0x08, 0xe5, 0x0e, 0x72, 0x2b, 0xba, 0x83, 0x5c, 0xc7, 0x62, - 0x30, 0xf2, 0x65, 0x18, 0xdb, 0x44, 0x6d, 0x5e, 0xf7, 0xb1, 0x88, 0xf9, 0x63, 0x21, 0x5f, 0x61, - 0x7d, 0xf6, 0xaf, 0x2a, 0x20, 0xb0, 0x8c, 0x34, 0x61, 0x62, 0x31, 0xa0, 0x18, 0xec, 0x5f, 0x18, - 0xfd, 0x32, 0xac, 0xcd, 0x49, 0xd2, 0x97, 0x61, 0x82, 0x93, 0xf9, 0xeb, 0x39, 0x20, 0x49, 0x1b, - 0x69, 0x3b, 0xa0, 0x51, 0xf8, 0xcc, 0x0e, 0xfa, 0xfb, 0xda, 0xa0, 0x3f, 0x3f, 0x30, 0xe8, 0xbc, - 0x79, 0x23, 0x8d, 0xfd, 0x1f, 0x19, 0x70, 0x21, 0x9b, 0x90, 0xbc, 0x08, 0xe3, 0xeb, 0xad, 0x0d, - 0xe9, 0xa6, 0x23, 0x9a, 0xe2, 0xf7, 0x50, 0x4b, 0xb5, 0x44, 0x11, 0x79, 0x03, 0xc6, 0x3f, 0xb4, - 0x16, 0xd9, 0xf6, 0xa5, 0x44, 0x9d, 0xfc, 0x74, 0x60, 0xb7, 0x75, 0xf3, 0x47, 0x20, 0xa9, 0x63, - 0x9b, 0x7f, 0x6a, 0x63, 0xfb, 0xad, 0x1c, 0xcc, 0xd4, 0xda, 0x6d, 0x1a, 0x86, 0x4c, 0x39, 0xa1, - 0x61, 0xf4, 0xcc, 0x0e, 0x6c, 0xb6, 0x03, 0x8e, 0xd6, 0xb6, 0x91, 0x46, 0xf5, 0x8f, 0x0d, 0x38, - 0x2f, 0xa9, 0x1e, 0x7a, 0xf4, 0x51, 0x6b, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x71, 0x47, 0x8d, 0x9f, - 0xc2, 0x5d, 0xda, 0xeb, 0x44, 0x34, 0x50, 0x0f, 0x8b, 0x1f, 0x20, 0x44, 0xdb, 0xa5, 0x11, 0x42, - 0xe6, 0x61, 0xa2, 0xd6, 0xeb, 0x05, 0xfe, 0x43, 0xbe, 0xec, 0xa7, 0xc4, 0xdd, 0x20, 0x07, 0x69, - 0x77, 0x89, 0x1c, 0xc4, 0xaa, 0xb1, 0x44, 0xbb, 0xdc, 0xbb, 0x78, 0x8a, 0x57, 0xc3, 0xa5, 0x5d, - 0x55, 0x5b, 0xc2, 0x72, 0xf3, 0x9b, 0x05, 0x28, 0xab, 0x0d, 0x21, 0x26, 0x8c, 0x73, 0x57, 0x11, - 0xf5, 0xca, 0xde, 0x41, 0x88, 0x25, 0x4a, 0x12, 0x0f, 0x9c, 0xdc, 0xa9, 0x1e, 0x38, 0xdb, 0x30, - 0xb5, 0x11, 0xf8, 0x3d, 0x3f, 0xa4, 0x2e, 0xcf, 0xd7, 0xc2, 0xa5, 0xd6, 0xd9, 0xd8, 0x2d, 0x95, - 0xf7, 0x39, 0x2b, 0xe2, 0xaa, 0x79, 0x4f, 0x60, 0xdb, 0xe9, 0x6c, 0x2e, 0x3a, 0x1f, 0x7e, 0xd8, - 0xee, 0x84, 0xc2, 0x75, 0x3f, 0x3e, 0x6c, 0x67, 0x10, 0xfd, 0xb0, 0x9d, 0x41, 0xd4, 0x65, 0x31, - 0xf6, 0xb4, 0x96, 0x05, 0xf9, 0x75, 0x03, 0x26, 0x6b, 0xdd, 0xae, 0xf0, 0xc0, 0x91, 0x41, 0xcf, - 0xe7, 0x93, 0x03, 0x77, 0xee, 0xa2, 0xc9, 0xcf, 0xdb, 0xbf, 0x2e, 0xce, 0xdb, 0xdf, 0xfe, 0x58, - 0xe7, 0xed, 0xad, 0xc0, 0xf1, 0xa2, 0x10, 0x2f, 0x56, 0x93, 0x0f, 0xaa, 0x6e, 0xb8, 0x4a, 0x3d, - 0xc8, 0xdb, 0x50, 0x89, 0xe7, 0xe3, 0x72, 0xd7, 0xa5, 0x8f, 0x29, 0x77, 0x58, 0x9a, 0xe2, 0x91, - 0x79, 0xda, 0x45, 0x42, 0x1a, 0xd1, 0xfc, 0x96, 0x01, 0x17, 0xd4, 0x09, 0xd1, 0xec, 0xef, 0x1c, - 0x78, 0x68, 0x8a, 0x90, 0x1b, 0x50, 0x12, 0xe3, 0x15, 0x2b, 0x72, 0x83, 0x49, 0x7e, 0x12, 0x14, - 0xd2, 0x60, 0x43, 0xc4, 0x78, 0x08, 0xbb, 0xfd, 0x6c, 0x6a, 0xb9, 0xb1, 0xa2, 0xfa, 0x9c, 0xe8, - 0xec, 0x4a, 0x80, 0xbf, 0xf5, 0xb1, 0x63, 0x10, 0xf3, 0x3d, 0x98, 0xd5, 0x6b, 0xd9, 0xa4, 0x18, - 0x0e, 0x26, 0x9b, 0x66, 0x64, 0x37, 0x4d, 0x96, 0x9b, 0xdb, 0x40, 0x06, 0xe8, 0x43, 0xbc, 0x34, - 0xa2, 0x91, 0xbc, 0xd4, 0x94, 0x47, 0x4f, 0x03, 0x88, 0x71, 0xba, 0xab, 0x49, 0xb5, 0xbb, 0x91, - 0xd4, 0xfc, 0xab, 0x12, 0x9c, 0xcd, 0x10, 0x1d, 0xa7, 0x6c, 0xed, 0x55, 0x7d, 0xf1, 0x94, 0xe2, - 0xdb, 0x79, 0xb9, 0x64, 0xde, 0x93, 0xa9, 0x8d, 0x4e, 0x58, 0x2a, 0x27, 0xe5, 0x3b, 0xfa, 0x34, - 0xb6, 0x77, 0xd5, 0x81, 0x66, 0xec, 0xa9, 0x39, 0xd0, 0xd4, 0x61, 0x4a, 0xb4, 0x4a, 0x2c, 0xe5, - 0xf1, 0xc4, 0x44, 0x0f, 0x78, 0x81, 0x3d, 0xb0, 0xa4, 0x75, 0x12, 0xce, 0x23, 0xf4, 0x3b, 0x0f, - 0xa9, 0xe0, 0x31, 0xa1, 0xf2, 0xc0, 0x82, 0x4c, 0x1e, 0x0a, 0x09, 0xf9, 0xa7, 0x06, 0x10, 0x01, - 0x51, 0xd7, 0x73, 0xf1, 0xa4, 0xf5, 0xec, 0x3e, 0x9d, 0xf5, 0xfc, 0xbc, 0xac, 0x63, 0xf6, 0xba, - 0xce, 0xa8, 0x16, 0xf9, 0xc7, 0x06, 0xcc, 0x72, 0x2f, 0x0e, 0xb5, 0xb2, 0xa5, 0x93, 0x2a, 0xdb, - 0x7e, 0x3a, 0x95, 0xbd, 0x12, 0xe2, 0x67, 0x87, 0xd4, 0x75, 0xb0, 0x52, 0xe4, 0x27, 0x00, 0xe2, - 0x15, 0x25, 0xbd, 0x05, 0xaf, 0x64, 0x48, 0x81, 0x18, 0x29, 0x09, 0x78, 0x8c, 0x62, 0x3a, 0xd5, - 0xbf, 0x26, 0xe1, 0x46, 0x7e, 0x1e, 0xce, 0xb1, 0xf5, 0x12, 0x43, 0x84, 0xcf, 0xd9, 0xdc, 0x24, - 0x7e, 0xe5, 0x8b, 0xc3, 0xb7, 0xf6, 0x1b, 0x59, 0x64, 0x3c, 0x66, 0x23, 0x09, 0x7f, 0x8f, 0x0e, - 0x54, 0x93, 0x2f, 0x8b, 0x02, 0x9d, 0x4b, 0xb1, 0xf6, 0xe1, 0x5c, 0x19, 0xbf, 0x99, 0x29, 0xdf, - 0x2e, 0xc9, 0xb5, 0xc0, 0xe5, 0x5b, 0xa8, 0x07, 0x5d, 0x20, 0x88, 0x7c, 0x08, 0xa4, 0xd9, 0xdf, - 0xdd, 0xa5, 0x61, 0x44, 0x5d, 0x0e, 0xa3, 0x41, 0x38, 0x37, 0x85, 0xf2, 0x01, 0x8f, 0x8c, 0x42, - 0x59, 0x6a, 0x07, 0xb2, 0x58, 0x9d, 0x24, 0x83, 0xc4, 0x97, 0x77, 0xe0, 0xd2, 0xd0, 0x66, 0x66, - 0x04, 0x54, 0xcc, 0xeb, 0x01, 0x15, 0x97, 0x86, 0x89, 0xc3, 0x50, 0x0d, 0xaa, 0xf8, 0x1d, 0x23, - 0x25, 0xff, 0x84, 0xb2, 0xc2, 0xb3, 0xc0, 0x0d, 0xdb, 0x20, 0x72, 0x18, 0x18, 0xcf, 0x25, 0x64, - 0x2e, 0x51, 0x92, 0x98, 0x84, 0x54, 0x25, 0x2c, 0xca, 0xca, 0x4f, 0x28, 0x0a, 0xcd, 0x7f, 0x61, - 0x00, 0xe1, 0x35, 0x5c, 0x74, 0x7a, 0xce, 0x8e, 0xd7, 0xf1, 0x22, 0x8f, 0x86, 0xe4, 0x3e, 0x54, - 0x04, 0x0b, 0x67, 0xa7, 0x43, 0x55, 0x5f, 0x29, 0x71, 0x99, 0x1a, 0x97, 0xd9, 0x69, 0xb5, 0x66, - 0x80, 0x70, 0xc8, 0xe0, 0xe5, 0x3e, 0xc1, 0xe0, 0x99, 0x3f, 0x34, 0xe0, 0xd2, 0x60, 0xb5, 0xc5, - 0x97, 0xe3, 0xce, 0x33, 0x4e, 0xe9, 0xbc, 0xac, 0x56, 0xe6, 0xf0, 0x18, 0xf2, 0xa9, 0xb5, 0x32, - 0x9f, 0x9c, 0x6a, 0x3e, 0x79, 0x2b, 0x7f, 0x39, 0x07, 0xe5, 0x8d, 0x4e, 0x7f, 0xd7, 0xeb, 0x2e, - 0x39, 0x91, 0xf3, 0xcc, 0x9a, 0x14, 0x6f, 0x69, 0x26, 0x45, 0xec, 0x1d, 0x15, 0x37, 0x6c, 0xb4, - 0x8c, 0x5c, 0x06, 0xcc, 0x24, 0x24, 0x7c, 0x95, 0xde, 0x83, 0x02, 0xfb, 0x21, 0x34, 0x94, 0xab, - 0x03, 0x8c, 0x11, 0xeb, 0x46, 0xfc, 0x9f, 0x50, 0xf2, 0xf5, 0x3c, 0x68, 0xc8, 0xe1, 0xf2, 0x8f, - 0xf1, 0x34, 0x46, 0x4f, 0x9e, 0x72, 0xf1, 0x9f, 0x1b, 0x50, 0x49, 0xb7, 0x84, 0xdc, 0x87, 0x09, - 0xc6, 0xc9, 0x8b, 0x53, 0x22, 0xbd, 0x34, 0xa4, 0xcd, 0x37, 0x04, 0x1a, 0xaf, 0x1e, 0x76, 0x3e, - 0xe5, 0x10, 0x4b, 0x72, 0xb8, 0x6c, 0x41, 0x59, 0xc5, 0xca, 0xa8, 0xdd, 0xeb, 0xba, 0x68, 0xba, - 0x90, 0xdd, 0x0f, 0x6a, 0xad, 0x7f, 0x5b, 0xab, 0xb5, 0x10, 0x4a, 0xa3, 0xe6, 0xb6, 0xc3, 0xf0, - 0x30, 0x9e, 0xc1, 0x43, 0x9d, 0x67, 0x32, 0xd9, 0x87, 0x1e, 0x1e, 0xc6, 0x61, 0xcc, 0x16, 0xe1, - 0xdf, 0x13, 0xf3, 0x0c, 0x6d, 0x91, 0x1e, 0x42, 0x54, 0x7d, 0x96, 0xe3, 0x98, 0x7f, 0x3f, 0x0f, - 0x17, 0x92, 0xea, 0xf1, 0x4c, 0x7f, 0x1b, 0x4e, 0xe0, 0x1c, 0x84, 0xa7, 0xac, 0x80, 0x6b, 0x03, - 0x55, 0xc3, 0xf0, 0x67, 0x59, 0x35, 0xa5, 0x42, 0x66, 0xaa, 0x42, 0x68, 0xc4, 0xf1, 0x0a, 0xc9, - 0x6a, 0x90, 0xfb, 0x90, 0x6f, 0xd2, 0x48, 0x04, 0x49, 0xbe, 0x32, 0xd0, 0xab, 0x6a, 0xbd, 0x6e, - 0x34, 0x69, 0xc4, 0x07, 0x91, 0xfb, 0x99, 0x53, 0xcd, 0xef, 0x9b, 0xa9, 0xe3, 0xdb, 0x30, 0xde, - 0x78, 0xdc, 0xa3, 0xed, 0x48, 0xc4, 0x46, 0xbe, 0x76, 0x32, 0x3f, 0x8e, 0xab, 0x44, 0x60, 0x52, - 0x04, 0xa8, 0x9d, 0xc5, 0x51, 0x2e, 0xdf, 0x86, 0xa2, 0xfc, 0xf8, 0x13, 0x45, 0x12, 0xbe, 0x05, - 0x93, 0xca, 0x47, 0x9e, 0x68, 0xd2, 0xff, 0x95, 0x01, 0xe3, 0x4c, 0xe8, 0x6d, 0xbd, 0xf9, 0x8c, - 0x4a, 0xa4, 0x5b, 0x9a, 0x44, 0x9a, 0x55, 0x42, 0x5e, 0x70, 0x5d, 0xbe, 0x79, 0x8a, 0x2c, 0x3a, - 0x32, 0x00, 0x12, 0x64, 0x72, 0x17, 0x26, 0xf8, 0x45, 0x8e, 0x4c, 0xa3, 0xa9, 0xc6, 0xd0, 0x88, - 0x92, 0x44, 0xcb, 0xf1, 0x7b, 0x69, 0xb5, 0x50, 0x52, 0x93, 0xa5, 0xc4, 0xcf, 0x58, 0x0d, 0xda, - 0x64, 0x6c, 0x16, 0xfd, 0x2e, 0x8f, 0xa9, 0x08, 0x95, 0x74, 0x53, 0xd9, 0x0e, 0xc7, 0x35, 0x71, - 0xb0, 0x91, 0x3f, 0x89, 0xc9, 0x05, 0xc1, 0x24, 0xfb, 0xcc, 0xe3, 0xdb, 0x93, 0x3c, 0x4a, 0x41, - 0x56, 0xec, 0x5d, 0x28, 0xdf, 0xf1, 0x83, 0x47, 0x4e, 0xe0, 0xd6, 0x76, 0xa9, 0xf0, 0x10, 0x2f, - 0xa2, 0x9b, 0xf7, 0xd4, 0x03, 0x0e, 0xb7, 0x1d, 0x56, 0xf0, 0xa3, 0xa3, 0x6a, 0xa1, 0xee, 0xfb, - 0x1d, 0x4b, 0x43, 0x27, 0xeb, 0x30, 0xb5, 0xea, 0x3c, 0x16, 0xf7, 0x75, 0xad, 0xd6, 0x8a, 0xf0, - 0x33, 0x79, 0xed, 0xf8, 0xa8, 0x7a, 0xe9, 0xc0, 0x79, 0x1c, 0xdf, 0xf3, 0x0d, 0x77, 0x85, 0xd6, - 0xe9, 0x89, 0x07, 0xd3, 0x1b, 0x7e, 0x10, 0x89, 0x8f, 0x30, 0x9d, 0x36, 0x3f, 0xe4, 0xba, 0x6d, - 0x3e, 0xf3, 0xba, 0xed, 0x12, 0x53, 0xe4, 0xed, 0x07, 0x31, 0xb9, 0x16, 0x5a, 0xa7, 0x31, 0x26, - 0xef, 0xc2, 0xec, 0x22, 0x0d, 0x22, 0xef, 0x81, 0xd7, 0x76, 0x22, 0x7a, 0xc7, 0x0f, 0x0e, 0x9c, - 0x48, 0x1c, 0xa8, 0xa0, 0x41, 0xdd, 0xa6, 0x9c, 0xd3, 0x81, 0x13, 0x59, 0x83, 0x98, 0xe4, 0x6b, - 0x59, 0x9e, 0x3b, 0x63, 0xd8, 0xfc, 0x37, 0x98, 0x52, 0x90, 0xe1, 0xb9, 0x33, 0xa4, 0x0b, 0x32, - 0x7c, 0x78, 0x76, 0x4f, 0xba, 0xf6, 0x2c, 0xd6, 0x6f, 0x8a, 0x2b, 0xd8, 0xd3, 0xaf, 0x35, 0xe3, - 0x71, 0x1b, 0x72, 0xbd, 0xb9, 0x00, 0xf9, 0xfa, 0xc6, 0x1d, 0x3c, 0x22, 0x11, 0xd7, 0x8c, 0xb4, - 0xbb, 0xe7, 0x74, 0xdb, 0xa8, 0xcb, 0x08, 0xdf, 0x05, 0x55, 0xe0, 0xd5, 0x37, 0xee, 0x10, 0x07, - 0xce, 0x6e, 0xd0, 0xe0, 0xc0, 0x8b, 0xbe, 0x72, 0xf3, 0xa6, 0x32, 0x50, 0x45, 0xac, 0xda, 0xbc, - 0xa8, 0x5a, 0xb5, 0x87, 0x28, 0xf6, 0xe3, 0x9b, 0x37, 0x33, 0x87, 0x23, 0xae, 0x58, 0x16, 0x2f, - 0xd2, 0x80, 0xe9, 0x55, 0xe7, 0xb1, 0xb8, 0x90, 0x8e, 0x6d, 0xbc, 0x3c, 0x7a, 0xc6, 0xe3, 0xc4, - 0x6a, 0x27, 0x45, 0xea, 0x10, 0xeb, 0x44, 0xe4, 0x1d, 0x98, 0x4c, 0xa6, 0x57, 0x88, 0x57, 0x91, - 0x79, 0xee, 0x12, 0xa9, 0x4c, 0x4e, 0xed, 0x2c, 0x49, 0x41, 0x27, 0x9b, 0xb1, 0x89, 0xce, 0x15, - 0x52, 0x74, 0x14, 0x2c, 0xd5, 0xe7, 0x55, 0x13, 0xdd, 0xc1, 0x12, 0xad, 0x59, 0x33, 0xb1, 0x8a, - 0xce, 0x3d, 0x65, 0x2c, 0x9d, 0x8b, 0x62, 0xf9, 0x6f, 0x04, 0xfe, 0x41, 0x2f, 0x42, 0x8f, 0xc1, - 0x94, 0xe5, 0xdf, 0xc3, 0x92, 0x0c, 0xcb, 0x9f, 0x93, 0x64, 0xdf, 0xb3, 0x4f, 0x7d, 0x82, 0x7b, - 0x76, 0x0a, 0x85, 0x15, 0xbf, 0xbd, 0x8f, 0x2e, 0x82, 0xa5, 0xfa, 0x87, 0x4c, 0x7e, 0x74, 0xfc, - 0xf6, 0xfe, 0xd3, 0xbb, 0x1f, 0x46, 0xf6, 0x64, 0x8d, 0xb5, 0x9d, 0x4d, 0x2b, 0xf1, 0xe9, 0xb9, - 0x19, 0xed, 0xa6, 0x4d, 0x2b, 0xe3, 0x8a, 0x0a, 0x9f, 0x85, 0xb2, 0x21, 0x96, 0x4e, 0x4e, 0x28, - 0x54, 0x96, 0x68, 0xb8, 0x1f, 0xf9, 0xbd, 0xc5, 0x8e, 0xd7, 0xdb, 0xf1, 0x9d, 0xc0, 0x9d, 0xab, - 0x0c, 0x11, 0x18, 0xaf, 0x66, 0x0a, 0x8c, 0x59, 0x97, 0xd3, 0xdb, 0x6d, 0xc9, 0xc0, 0x1a, 0x60, - 0x49, 0xbe, 0x06, 0xd3, 0x6c, 0xb5, 0x34, 0x1e, 0x47, 0xb4, 0xcb, 0xa7, 0xd2, 0x2c, 0x6e, 0xf5, - 0xe7, 0x94, 0x20, 0xc3, 0xb8, 0x90, 0x4f, 0x52, 0x94, 0x1e, 0x34, 0x26, 0x50, 0x27, 0xa9, 0xce, - 0xca, 0xfc, 0x89, 0x54, 0x9f, 0x90, 0x65, 0x98, 0x10, 0x35, 0x10, 0xbb, 0xce, 0x60, 0x5b, 0x9e, - 0xcf, 0x6c, 0xcb, 0x84, 0x68, 0x8b, 0x25, 0xe9, 0xcd, 0x7f, 0x6b, 0xc0, 0x94, 0xf6, 0x39, 0x72, - 0x5b, 0x71, 0x5f, 0x49, 0xdc, 0xce, 0x34, 0x9c, 0xcc, 0xf4, 0xf4, 0xb7, 0x85, 0xcf, 0x52, 0x6e, - 0x38, 0x5d, 0x66, 0xe6, 0x30, 0x19, 0xf4, 0x9f, 0x3f, 0x39, 0xe8, 0xbf, 0x30, 0x24, 0xe8, 0xff, - 0xdb, 0x53, 0x30, 0xad, 0x6f, 0x70, 0x4c, 0xe3, 0x5c, 0xf1, 0x77, 0xbd, 0xae, 0xb4, 0x5b, 0x79, - 0x1a, 0x0b, 0x84, 0x68, 0xb9, 0xde, 0x11, 0x42, 0x5e, 0x06, 0x88, 0xaf, 0x66, 0xa5, 0x69, 0x2a, - 0x32, 0xd3, 0x2b, 0x05, 0xe4, 0x27, 0x01, 0xd6, 0x7c, 0x97, 0xc6, 0x99, 0x50, 0x4e, 0x38, 0x50, - 0x7a, 0x55, 0x1c, 0x28, 0x89, 0x6c, 0xf2, 0xc7, 0x47, 0xd5, 0xf3, 0x5d, 0xdf, 0xa5, 0x83, 0x29, - 0x50, 0x14, 0x8e, 0xe4, 0x4b, 0x30, 0x66, 0xf5, 0x3b, 0x54, 0x26, 0xe6, 0x98, 0x94, 0x13, 0xbe, - 0xdf, 0x51, 0xb2, 0x4c, 0x06, 0xfd, 0xf4, 0x3d, 0x02, 0x03, 0x90, 0xf7, 0x01, 0xee, 0xf7, 0x77, - 0xe8, 0xdd, 0xc0, 0xef, 0xf7, 0x64, 0xe4, 0x2f, 0x9a, 0xb1, 0xfb, 0x71, 0x1a, 0x27, 0x7b, 0x17, - 0x0b, 0xd5, 0x8f, 0x27, 0x24, 0x64, 0x1d, 0x26, 0x84, 0xf8, 0x10, 0xe7, 0xf4, 0x2f, 0x64, 0x9d, - 0x10, 0x29, 0x3a, 0x84, 0xc8, 0x94, 0x81, 0x60, 0xfd, 0xd0, 0x86, 0x9b, 0xe1, 0xef, 0x40, 0x89, - 0xb1, 0x67, 0xa6, 0x76, 0x28, 0xf6, 0x0e, 0xf4, 0x1f, 0x54, 0x2a, 0xc4, 0xcc, 0x72, 0x2d, 0x5f, - 0x57, 0x4c, 0x40, 0xbe, 0x86, 0xb9, 0x6d, 0x44, 0x57, 0x9f, 0x78, 0xd0, 0xf8, 0xca, 0x40, 0x57, - 0x9f, 0x73, 0x7a, 0xbd, 0x8c, 0x64, 0x60, 0x31, 0x3f, 0xb2, 0x1b, 0xc7, 0xd8, 0xc4, 0xa9, 0x86, - 0x4f, 0xf8, 0xc0, 0xf5, 0x81, 0x0f, 0xcc, 0xc9, 0xb0, 0x91, 0xc1, 0x8c, 0x36, 0x1a, 0x5f, 0xd2, - 0x83, 0x4a, 0x92, 0x46, 0x4b, 0x7c, 0x0b, 0x4e, 0xfa, 0xd6, 0x1b, 0x03, 0xdf, 0x52, 0x07, 0x70, - 0xe0, 0x73, 0x03, 0xdc, 0x89, 0x9b, 0xa4, 0x85, 0x15, 0xdf, 0x9b, 0x3c, 0xe9, 0x7b, 0x2f, 0x0f, - 0x7c, 0xef, 0xac, 0xbb, 0x33, 0xf8, 0x9d, 0x14, 0x4f, 0xf2, 0x0e, 0x4c, 0x49, 0x08, 0xae, 0x0f, - 0x3c, 0xe0, 0x13, 0xfa, 0xbd, 0xbb, 0x83, 0x4e, 0x63, 0x7a, 0x3a, 0x17, 0x15, 0x59, 0xa5, 0xe6, - 0xb3, 0x63, 0x4a, 0xa3, 0x4e, 0xcf, 0x0a, 0x1d, 0x99, 0x7c, 0x15, 0x26, 0x97, 0x0f, 0x58, 0x43, - 0xfc, 0xae, 0x13, 0x51, 0xdc, 0x8c, 0x92, 0x43, 0x53, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0xc7, 0x63, - 0x52, 0xa4, 0x6e, 0xe6, 0x0a, 0x05, 0xeb, 0x3c, 0x7e, 0xfc, 0x22, 0xe6, 0x70, 0x28, 0xb6, 0x9e, - 0xe7, 0x33, 0x0e, 0x2e, 0x15, 0xf6, 0x28, 0xcb, 0xf9, 0xa9, 0x8e, 0x2d, 0x16, 0x84, 0xd6, 0x79, - 0x3a, 0x4f, 0xf2, 0x2e, 0x4c, 0x8a, 0x88, 0xc6, 0x9a, 0xb5, 0x16, 0xce, 0x55, 0xb0, 0xf1, 0x98, - 0x8b, 0x4d, 0x06, 0x3f, 0xda, 0x4e, 0x90, 0xba, 0xbd, 0x4a, 0xf0, 0xc9, 0x57, 0xe0, 0xdc, 0xb6, - 0xd7, 0x75, 0xfd, 0x47, 0xa1, 0x10, 0xe0, 0x42, 0xd0, 0xcd, 0x26, 0x3e, 0x3a, 0x8f, 0x78, 0xb9, - 0x2d, 0xb7, 0xad, 0x01, 0xc1, 0x97, 0xc9, 0x81, 0xfc, 0xdc, 0x00, 0x67, 0x3e, 0x83, 0xc8, 0x49, - 0x33, 0x68, 0x61, 0x60, 0x06, 0x0d, 0x7e, 0x3e, 0x3d, 0x9d, 0x32, 0x3f, 0x43, 0x7c, 0x20, 0xba, - 0xce, 0xf1, 0x81, 0xef, 0x75, 0xe7, 0xce, 0x6a, 0x0f, 0x79, 0xc4, 0x2e, 0xb3, 0x88, 0xb7, 0xe1, - 0x77, 0xbc, 0xf6, 0x61, 0xdd, 0x3c, 0x3e, 0xaa, 0xbe, 0x90, 0xd6, 0x66, 0x3e, 0xf2, 0xb5, 0xc3, - 0x85, 0x0c, 0xd6, 0xe4, 0xab, 0x50, 0x66, 0x7f, 0x63, 0xd5, 0xef, 0x9c, 0x76, 0xd5, 0xa5, 0x60, - 0x8a, 0xef, 0xe0, 0x18, 0x61, 0xc8, 0x65, 0x86, 0x56, 0xa8, 0xb1, 0x32, 0x7f, 0x68, 0xc0, 0xb9, - 0xac, 0xba, 0x9e, 0x92, 0xdf, 0xc6, 0x4c, 0x5d, 0x7a, 0xe3, 0xb9, 0x04, 0xbf, 0xf4, 0x8e, 0xaf, - 0xba, 0xab, 0x30, 0xc6, 0x6c, 0x65, 0xe9, 0x94, 0x85, 0xdb, 0x21, 0xb3, 0xa7, 0x43, 0x8b, 0xc3, - 0x19, 0x02, 0x3a, 0xd3, 0xe3, 0x7e, 0x39, 0xc6, 0x11, 0xd0, 0xe3, 0xde, 0xe2, 0x70, 0x86, 0xc0, - 0xb6, 0x5d, 0xb9, 0x4d, 0x20, 0x02, 0xdb, 0x8d, 0x43, 0x8b, 0xc3, 0xc9, 0x2b, 0x30, 0xb1, 0xde, - 0x5d, 0xa1, 0xce, 0x43, 0x2a, 0x6e, 0x9c, 0xf0, 0x1c, 0xc5, 0xef, 0xda, 0x1d, 0x06, 0xb3, 0x64, - 0xa1, 0xf9, 0x5d, 0x03, 0x66, 0x07, 0xba, 0xe9, 0xf4, 0x14, 0x3e, 0x27, 0x5f, 0xef, 0x8d, 0xd2, - 0x3e, 0x5e, 0xfd, 0x42, 0x76, 0xf5, 0xcd, 0xbf, 0xc8, 0xc3, 0xc5, 0x21, 0xbb, 0x56, 0x72, 0x35, - 0x6f, 0x9c, 0x7a, 0x35, 0xff, 0x75, 0xb6, 0x4b, 0x38, 0xde, 0x41, 0xd8, 0xf2, 0x93, 0x1a, 0x27, - 0xb7, 0x18, 0x58, 0x26, 0x73, 0x64, 0xc8, 0x7c, 0x0e, 0x97, 0xda, 0x48, 0x61, 0x47, 0xfe, 0xc0, - 0x99, 0xb1, 0xce, 0x6c, 0xe0, 0x72, 0x3c, 0xff, 0xd7, 0xe4, 0x72, 0x5c, 0xbf, 0x92, 0x2a, 0x3c, - 0xd5, 0x2b, 0xa9, 0xec, 0x43, 0xf2, 0xb1, 0x4f, 0x72, 0x15, 0xf0, 0xef, 0x53, 0xd7, 0xf1, 0x7f, - 0x1d, 0x87, 0xfa, 0x35, 0x18, 0xdb, 0xde, 0xa3, 0x81, 0xd4, 0x6f, 0xb1, 0x22, 0x8f, 0x18, 0x40, - 0xad, 0x08, 0x62, 0x98, 0x3f, 0x0b, 0x65, 0xf5, 0x63, 0xb8, 0x96, 0xd9, 0x6f, 0xb1, 0x98, 0xf8, - 0x5a, 0x66, 0x00, 0x8b, 0xc3, 0x4f, 0xcd, 0x88, 0x95, 0xf4, 0x42, 0xfe, 0xb4, 0x5e, 0x30, 0xff, - 0x9d, 0x01, 0x05, 0x4c, 0x08, 0xf0, 0x26, 0x94, 0xe4, 0x51, 0xa9, 0x1a, 0x24, 0x7f, 0x56, 0x9e, - 0xa4, 0x86, 0xba, 0x3f, 0x83, 0x00, 0xb2, 0x4f, 0x6d, 0xd1, 0x60, 0x47, 0x73, 0x7b, 0x79, 0xc8, - 0x00, 0xea, 0xa7, 0x10, 0xe3, 0x09, 0xba, 0x04, 0x5d, 0x7b, 0x84, 0x7d, 0xcf, 0x17, 0x3c, 0x77, - 0xed, 0x19, 0xb0, 0xeb, 0x25, 0x96, 0xf9, 0x9b, 0x06, 0x9c, 0xcf, 0xd4, 0x03, 0xd8, 0x57, 0xb9, - 0xc2, 0xa1, 0xcc, 0x88, 0xb4, 0xb6, 0xc1, 0x31, 0x9e, 0xc4, 0x85, 0xe7, 0x09, 0x86, 0xf7, 0x73, - 0x50, 0x8a, 0xed, 0x33, 0x72, 0x4e, 0x0e, 0x1d, 0x9e, 0xa7, 0x49, 0x63, 0xe6, 0xaf, 0x0c, 0x18, - 0x67, 0x55, 0x78, 0x66, 0xa3, 0x2b, 0xb2, 0x4f, 0x57, 0x59, 0x93, 0x46, 0x8a, 0xa9, 0xf8, 0xbd, - 0x71, 0x80, 0x04, 0x99, 0xec, 0xc0, 0xf4, 0xfa, 0xf2, 0xd2, 0xe2, 0xb2, 0x4b, 0xbb, 0x11, 0xde, - 0xf2, 0xa5, 0xa2, 0xec, 0x99, 0x61, 0x19, 0x74, 0x9d, 0x8e, 0x40, 0x38, 0x4c, 0x96, 0xa7, 0xef, - 0xb9, 0x6d, 0xdb, 0x8b, 0xe9, 0x54, 0x85, 0x4c, 0xe7, 0xc8, 0xbe, 0xd1, 0xac, 0xad, 0xae, 0x28, - 0xdf, 0xc8, 0x8d, 0xf8, 0x8d, 0xd0, 0x39, 0xe8, 0x0c, 0xf9, 0x86, 0xce, 0x91, 0xec, 0x41, 0xe5, - 0x2e, 0xca, 0x6e, 0xe5, 0x2b, 0xf9, 0x93, 0xbf, 0xf2, 0xa2, 0xf8, 0xca, 0x73, 0x5c, 0xe8, 0x67, - 0x7f, 0x67, 0x80, 0x6b, 0x32, 0x73, 0x0b, 0xa7, 0xce, 0xdc, 0xbf, 0x6d, 0xc0, 0x38, 0xdf, 0x1c, - 0xe2, 0xb7, 0x2c, 0x32, 0xb7, 0x9f, 0xed, 0xa7, 0xb3, 0xfd, 0x54, 0x22, 0xfc, 0x4f, 0x35, 0xc0, - 0x79, 0x19, 0x59, 0x4a, 0x3d, 0x8c, 0x21, 0x8f, 0xd0, 0x51, 0x31, 0xe5, 0x25, 0x89, 0x23, 0x14, - 0x7f, 0x13, 0x43, 0xe5, 0xc2, 0x31, 0xd4, 0x67, 0xfa, 0x26, 0x3e, 0xe1, 0x33, 0x7d, 0x2b, 0x50, - 0x12, 0x9e, 0x3d, 0xf5, 0x43, 0x61, 0x7e, 0xca, 0x03, 0x96, 0x18, 0xae, 0x24, 0x9f, 0xe6, 0x20, - 0x7b, 0x47, 0x4b, 0x1d, 0x17, 0x23, 0x92, 0x75, 0x28, 0x25, 0xa1, 0x21, 0x25, 0xed, 0x1e, 0x34, - 0x86, 0x0b, 0xd7, 0x57, 0x1e, 0x7d, 0x98, 0x19, 0x09, 0x92, 0xf0, 0x30, 0xbf, 0x69, 0x40, 0x25, - 0x3d, 0x5f, 0xc8, 0x3b, 0x30, 0x19, 0x47, 0xe7, 0xc4, 0xfe, 0x05, 0x78, 0x90, 0x99, 0x84, 0xf3, - 0x68, 0x9e, 0x06, 0x2a, 0x3a, 0x59, 0x80, 0x22, 0x5b, 0x76, 0x4a, 0xee, 0x60, 0x94, 0x27, 0x7d, - 0x01, 0x53, 0xef, 0xf5, 0x24, 0x9e, 0xb2, 0x6a, 0xff, 0x63, 0x1e, 0x26, 0x95, 0xc1, 0x22, 0xaf, - 0x41, 0x71, 0x39, 0x5c, 0xf1, 0xdb, 0xfb, 0xd4, 0x15, 0xd7, 0x05, 0xf8, 0x0a, 0xa3, 0x17, 0xda, - 0x1d, 0x04, 0x5a, 0x71, 0x31, 0xa9, 0xc3, 0x14, 0xff, 0x4f, 0x46, 0x61, 0xe6, 0x92, 0xa3, 0x4e, - 0x8e, 0x2c, 0xe3, 0x2f, 0xd5, 0x1d, 0x56, 0x23, 0x21, 0xdf, 0x00, 0xe0, 0x00, 0x36, 0xbe, 0x23, - 0x38, 0xf6, 0xca, 0x05, 0x7c, 0x5e, 0x7c, 0x20, 0xf2, 0xd4, 0x16, 0xe2, 0x54, 0x50, 0x18, 0xe2, - 0x0b, 0x70, 0x7e, 0x7b, 0x7f, 0xf4, 0x37, 0x20, 0x93, 0x17, 0xe0, 0xfc, 0xf6, 0xbe, 0x9d, 0xed, - 0xe5, 0xa5, 0xb2, 0x24, 0xdf, 0x32, 0xe0, 0xb2, 0x45, 0xdb, 0xfe, 0x43, 0x1a, 0x1c, 0xd6, 0x22, - 0xc4, 0x52, 0xbf, 0x78, 0xba, 0x4b, 0xd9, 0x2d, 0xf1, 0xc5, 0x57, 0x03, 0xc1, 0x05, 0xc3, 0x51, - 0x0e, 0x7a, 0x91, 0x7d, 0x42, 0x15, 0x4e, 0xf8, 0xa4, 0xf9, 0xa7, 0x86, 0xb2, 0x04, 0xc8, 0x1a, - 0x94, 0xe2, 0xc9, 0x22, 0x0e, 0x1c, 0x63, 0xe5, 0x48, 0xc2, 0x2d, 0xfa, 0xa0, 0xfe, 0x9c, 0x38, - 0xd9, 0x3f, 0x1b, 0x4f, 0x39, 0x6d, 0x45, 0x48, 0x20, 0xf9, 0x32, 0x14, 0x70, 0xa8, 0x4e, 0x4f, - 0x36, 0x25, 0xb7, 0x9a, 0x02, 0x1b, 0x23, 0xac, 0x35, 0x52, 0x92, 0x2f, 0x08, 0x2f, 0x8f, 0xbc, - 0x96, 0xc6, 0x95, 0x81, 0x58, 0x3d, 0xe2, 0x3d, 0x26, 0x71, 0x2c, 0x54, 0x66, 0xeb, 0xdf, 0xcd, - 0x41, 0x25, 0xbd, 0xf0, 0xc8, 0xfb, 0x50, 0xde, 0x70, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0xf7, 0x9c, - 0x70, 0x4f, 0xa4, 0x86, 0x44, 0x9b, 0xaf, 0x27, 0xe0, 0xf6, 0x9e, 0xa3, 0xa5, 0x10, 0xd3, 0x08, - 0xd8, 0x86, 0xdc, 0x12, 0xfe, 0xea, 0xca, 0x02, 0x8a, 0xfc, 0xa8, 0x97, 0x4a, 0x0d, 0x29, 0xd1, - 0xc8, 0x9b, 0x90, 0xe7, 0xb1, 0x6f, 0x6a, 0x5e, 0xa1, 0xd5, 0x3b, 0x35, 0x1e, 0x2e, 0xc4, 0x2f, - 0x93, 0xf5, 0x53, 0x79, 0x86, 0x4f, 0x56, 0x94, 0xc8, 0xa9, 0x71, 0x2d, 0xbf, 0x8a, 0x04, 0xc7, - 0x8d, 0x3b, 0x3d, 0x84, 0xea, 0x83, 0x42, 0x31, 0x5f, 0x29, 0x88, 0xf8, 0x9c, 0x3f, 0xc8, 0x43, - 0x29, 0xfe, 0x3e, 0x21, 0x80, 0xfa, 0x86, 0xb8, 0x15, 0xc6, 0xff, 0xc9, 0x25, 0x28, 0x4a, 0x15, - 0x43, 0xdc, 0x0c, 0x4f, 0x84, 0x42, 0xbd, 0x98, 0x03, 0xa9, 0x4b, 0x70, 0xf5, 0xc2, 0x92, 0x3f, - 0xc9, 0x4d, 0x88, 0x15, 0x85, 0x61, 0x1a, 0x45, 0x81, 0x0d, 0x98, 0x15, 0xa3, 0x91, 0x69, 0xc8, - 0x79, 0xdc, 0x17, 0xb9, 0x64, 0xe5, 0x3c, 0x97, 0xbc, 0x0f, 0x45, 0xc7, 0x75, 0xa9, 0x6b, 0x3b, - 0xd1, 0x08, 0xef, 0x71, 0x16, 0x19, 0x37, 0x2e, 0xd1, 0x91, 0xaa, 0x16, 0x91, 0x1a, 0x94, 0xf0, - 0x39, 0xc6, 0x7e, 0x38, 0xd2, 0x1b, 0x8e, 0x09, 0x87, 0x22, 0x23, 0xdb, 0x0c, 0xa9, 0x4b, 0x5e, - 0x85, 0x02, 0x1b, 0x4d, 0xb1, 0x1f, 0xc4, 0xd9, 0xe2, 0xd6, 0x5b, 0x1b, 0xbc, 0xc3, 0xee, 0x9d, - 0xb1, 0x10, 0x81, 0xbc, 0x04, 0xf9, 0xfe, 0xc2, 0x03, 0x21, 0xe9, 0x2b, 0x49, 0x58, 0x64, 0x8c, - 0xc6, 0x8a, 0xc9, 0x2d, 0x28, 0x3e, 0xd2, 0x03, 0xe0, 0xce, 0xa7, 0x86, 0x31, 0xc6, 0x8f, 0x11, - 0xeb, 0x45, 0x18, 0xe7, 0xe1, 0x66, 0xe6, 0x0b, 0x00, 0xc9, 0xa7, 0x07, 0x2f, 0xf0, 0xcd, 0x6f, - 0x40, 0x29, 0xfe, 0x24, 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xda, 0x7b, 0x4e, 0xd7, 0x15, 0xcf, 0x90, - 0x94, 0xad, 0xd2, 0x3e, 0x3d, 0xbc, 0x87, 0x00, 0x72, 0x11, 0x26, 0x7a, 0x6c, 0x54, 0x65, 0x62, - 0x53, 0x6b, 0xbc, 0xd7, 0xdf, 0x61, 0x33, 0x74, 0x0e, 0x26, 0xf0, 0xe8, 0x40, 0x2c, 0xb4, 0x29, - 0x4b, 0xfe, 0x34, 0x7f, 0x27, 0x87, 0x21, 0xef, 0x4a, 0x3d, 0xc9, 0x8b, 0x30, 0xd5, 0x0e, 0x28, - 0x6e, 0x47, 0x0e, 0x53, 0x8b, 0xc4, 0x77, 0xca, 0x09, 0x70, 0xd9, 0x25, 0xaf, 0xc0, 0x4c, 0x92, - 0x69, 0xd5, 0x6e, 0xef, 0x88, 0xf0, 0xd7, 0xb2, 0x35, 0xd5, 0x93, 0xa9, 0x56, 0x17, 0x77, 0xd0, - 0x87, 0xbe, 0xa2, 0x86, 0x9a, 0x45, 0x32, 0x6b, 0x6a, 0xc9, 0x9a, 0x51, 0xe0, 0x78, 0xed, 0x70, - 0x01, 0xc6, 0x1d, 0x67, 0xb7, 0xef, 0x71, 0x7f, 0xde, 0xb2, 0x25, 0x7e, 0x91, 0xcf, 0xc3, 0x6c, - 0xe8, 0xed, 0x76, 0x9d, 0xa8, 0x1f, 0x88, 0x9c, 0x03, 0x34, 0xc0, 0x29, 0x35, 0x65, 0x55, 0xe2, - 0x82, 0x45, 0x0e, 0x27, 0x6f, 0x00, 0x51, 0xbf, 0xe7, 0xef, 0x7c, 0x44, 0xdb, 0x7c, 0xaa, 0x95, - 0xad, 0x59, 0xa5, 0x64, 0x1d, 0x0b, 0xc8, 0xe7, 0xa0, 0x1c, 0xd0, 0x10, 0x55, 0x32, 0xec, 0x36, - 0xcc, 0xa4, 0x62, 0x4d, 0x4a, 0xd8, 0x7d, 0x7a, 0x68, 0xd6, 0x61, 0x76, 0x60, 0x3d, 0x92, 0x37, - 0xb8, 0x76, 0x2f, 0xf6, 0xe7, 0x32, 0x37, 0x66, 0x98, 0x90, 0x4a, 0xbd, 0xe0, 0xcb, 0x91, 0xcc, - 0x2e, 0x94, 0x55, 0xf9, 0x7a, 0x4a, 0x60, 0xf1, 0x05, 0x74, 0x2c, 0xe4, 0xc2, 0x67, 0xfc, 0xf8, - 0xa8, 0x9a, 0xf3, 0x5c, 0x74, 0x27, 0xbc, 0x06, 0x45, 0xa9, 0x25, 0xa8, 0xcf, 0x70, 0x08, 0x85, - 0xf2, 0xd0, 0x8a, 0x4b, 0xcd, 0x57, 0x61, 0x42, 0x88, 0xd0, 0x93, 0x8f, 0x71, 0xcc, 0x5f, 0xcc, - 0xc1, 0x8c, 0x45, 0xd9, 0x02, 0x17, 0x0f, 0x5c, 0x7c, 0xc6, 0x72, 0xce, 0x6a, 0x6d, 0x3b, 0x21, - 0x8e, 0xff, 0x7b, 0x06, 0x9c, 0xcd, 0xc0, 0xfd, 0x58, 0x49, 0xaa, 0x6e, 0x43, 0x69, 0xc9, 0x73, - 0x3a, 0x35, 0xd7, 0x8d, 0x1d, 0x24, 0x51, 0x1b, 0x74, 0xd9, 0x72, 0x72, 0x18, 0x54, 0xdd, 0x4c, - 0x63, 0x54, 0x72, 0x5d, 0x4c, 0x8a, 0x24, 0x8d, 0x9e, 0xcc, 0x6a, 0x0b, 0xbc, 0x4e, 0x49, 0x4e, - 0x5b, 0x0c, 0x43, 0xe3, 0xc0, 0xe4, 0x0e, 0xfc, 0x99, 0x1d, 0xba, 0xec, 0x30, 0xb4, 0x74, 0xf3, - 0x46, 0x32, 0x3b, 0xbf, 0x99, 0x83, 0x0b, 0xd9, 0x84, 0x1f, 0x37, 0xdf, 0x18, 0x26, 0x51, 0x50, - 0x12, 0x07, 0x63, 0xbe, 0x31, 0x9e, 0x71, 0x01, 0xf1, 0x13, 0x04, 0xf2, 0x00, 0xa6, 0x56, 0x9c, - 0x30, 0xba, 0x47, 0x9d, 0x20, 0xda, 0xa1, 0x4e, 0x34, 0x82, 0x06, 0x1b, 0xbf, 0x93, 0x8b, 0x9b, - 0xda, 0x9e, 0xa4, 0x4c, 0xbf, 0x93, 0xab, 0xb1, 0x8d, 0x27, 0x4a, 0x61, 0x84, 0x89, 0xf2, 0xd3, - 0x30, 0xd3, 0xa4, 0x07, 0x4e, 0x6f, 0xcf, 0x0f, 0xa8, 0x38, 0x79, 0xbe, 0x01, 0x53, 0x31, 0x28, - 0x73, 0xb6, 0xe8, 0xc5, 0x1a, 0xbe, 0xd2, 0x11, 0x89, 0x28, 0xd1, 0x8b, 0xcd, 0xdf, 0xca, 0xc1, - 0xc5, 0x5a, 0x5b, 0x1c, 0xd3, 0x8b, 0x02, 0x79, 0x9b, 0xf8, 0x29, 0x7f, 0x9b, 0xcc, 0x43, 0x69, - 0xd5, 0x79, 0x8c, 0x0f, 0xbe, 0x87, 0x22, 0x6b, 0x0d, 0x57, 0xbf, 0x9c, 0xc7, 0x76, 0x7c, 0xec, - 0x65, 0x25, 0x38, 0x4f, 0xf3, 0x4d, 0x78, 0x13, 0xc6, 0xef, 0xf9, 0x1d, 0x57, 0x6c, 0x4e, 0xe2, - 0xd4, 0x7f, 0x0f, 0x21, 0x96, 0x28, 0x31, 0x7f, 0x68, 0xc0, 0x74, 0x5c, 0x63, 0xac, 0xc2, 0xa7, - 0xde, 0x25, 0xa9, 0xd7, 0xf1, 0x4b, 0x23, 0xbc, 0x8e, 0x3f, 0xf6, 0xc9, 0x7a, 0xc2, 0xfc, 0x27, - 0x78, 0xa1, 0xa0, 0xb6, 0x92, 0xed, 0x44, 0x4a, 0x45, 0x8c, 0x11, 0x2b, 0x92, 0x7b, 0x6a, 0x43, - 0x92, 0x1f, 0x3a, 0x24, 0xbf, 0x94, 0x83, 0xc9, 0xb8, 0xb2, 0x9f, 0xb1, 0xf8, 0xed, 0xb8, 0x5d, - 0x23, 0x79, 0x67, 0x37, 0x15, 0x59, 0x21, 0x9c, 0xa0, 0xbf, 0x0c, 0xe3, 0x62, 0x31, 0x19, 0xa9, - 0x5b, 0xb5, 0xd4, 0xe8, 0x26, 0x6f, 0x9d, 0xe2, 0x80, 0x86, 0x96, 0xa0, 0x43, 0xf7, 0xf7, 0x6d, - 0xba, 0x23, 0xee, 0x97, 0x9e, 0xd9, 0x3d, 0x2a, 0xdb, 0xfd, 0x3d, 0x69, 0xd8, 0x48, 0xbb, 0xd3, - 0x3f, 0x2c, 0x40, 0x25, 0x4d, 0x72, 0x7a, 0x84, 0xfc, 0x46, 0x7f, 0x47, 0xbc, 0x53, 0x80, 0x11, - 0xf2, 0xbd, 0xfe, 0x8e, 0xc5, 0x60, 0xe4, 0x15, 0x28, 0x6c, 0x04, 0xde, 0x43, 0x6c, 0xb5, 0x78, - 0xa6, 0xa1, 0x17, 0x78, 0x0f, 0x55, 0x3f, 0x50, 0x56, 0x8e, 0x06, 0xed, 0x4a, 0x53, 0x79, 0x66, - 0x9a, 0x1b, 0xb4, 0x9d, 0x30, 0x9d, 0x16, 0x45, 0xa2, 0xb1, 0xad, 0xb2, 0x4e, 0x9d, 0x40, 0x44, - 0x73, 0x0b, 0x71, 0x86, 0x5b, 0xe5, 0x0e, 0x82, 0x79, 0xce, 0x53, 0x4b, 0x45, 0x22, 0x1d, 0x20, - 0xca, 0x4f, 0xb9, 0x80, 0x4f, 0xb7, 0xf1, 0xe4, 0xf3, 0x42, 0xe7, 0x54, 0xd6, 0xb6, 0xba, 0x9a, - 0x33, 0xf8, 0x3e, 0xcd, 0x33, 0xc2, 0x0d, 0x28, 0xe1, 0x91, 0x17, 0x1e, 0x64, 0x14, 0x4f, 0x65, - 0x26, 0x7d, 0x6e, 0x01, 0x6f, 0xe3, 0xed, 0xf8, 0x38, 0x23, 0x61, 0x42, 0xde, 0x83, 0x49, 0xd5, - 0x51, 0x94, 0xbb, 0x33, 0x5e, 0xe1, 0x11, 0x42, 0x43, 0xd2, 0x87, 0xa9, 0x04, 0xe6, 0x17, 0xd4, - 0x59, 0x22, 0x36, 0xed, 0x13, 0x67, 0x89, 0xf9, 0x1b, 0xa8, 0xc6, 0x1f, 0xf8, 0x11, 0x15, 0xda, - 0xcb, 0x33, 0x2b, 0xc7, 0x92, 0x23, 0xe4, 0x31, 0xcd, 0x23, 0x44, 0x6b, 0xdd, 0x13, 0x3c, 0xb0, - 0xfc, 0xfb, 0x06, 0x9c, 0xcf, 0xa4, 0x25, 0x37, 0x00, 0x12, 0x1d, 0x51, 0xf4, 0x12, 0x4f, 0x26, - 0x1b, 0x43, 0x2d, 0x05, 0x83, 0x7c, 0x3d, 0xad, 0xdd, 0x9d, 0xbe, 0x39, 0xc9, 0x27, 0x17, 0xa6, - 0x75, 0xed, 0x2e, 0x43, 0xa7, 0x33, 0xbf, 0x97, 0x87, 0xd9, 0x81, 0xa7, 0xfa, 0x4e, 0xb9, 0x83, - 0xdf, 0x4f, 0x3d, 0x04, 0xc5, 0xaf, 0x3b, 0xae, 0x0f, 0x7b, 0x28, 0x30, 0xe3, 0x59, 0x28, 0x3c, - 0x16, 0x13, 0x79, 0x8c, 0x4f, 0x79, 0x1d, 0x2a, 0xcc, 0x7e, 0x42, 0xec, 0xf3, 0x43, 0xbf, 0xf6, - 0x14, 0x9e, 0x12, 0xfb, 0x6b, 0xfc, 0xd2, 0xd2, 0x6f, 0xe4, 0xe0, 0xec, 0x40, 0x9b, 0x9f, 0xd9, - 0x55, 0xf7, 0x65, 0x6d, 0x77, 0x7b, 0x61, 0xd8, 0x98, 0x8e, 0xa4, 0x45, 0xfc, 0x0f, 0x03, 0x2e, - 0x0e, 0xa1, 0x24, 0x87, 0xe9, 0x49, 0xc4, 0xb5, 0x8a, 0x9b, 0x27, 0x7f, 0xf0, 0xa9, 0x4c, 0xa5, - 0x4f, 0x6d, 0x26, 0xfc, 0x62, 0x0e, 0x60, 0x9b, 0xee, 0x3c, 0xdb, 0xe9, 0x7f, 0xb2, 0xdf, 0xc2, - 0x97, 0xcd, 0x1a, 0x69, 0xdc, 0xd7, 0xf1, 0x20, 0x71, 0xf4, 0xdc, 0x3f, 0xf1, 0xb3, 0x12, 0xb9, - 0xec, 0x67, 0x25, 0xcc, 0x1d, 0x38, 0x77, 0x97, 0x46, 0xc9, 0x4e, 0x28, 0x6d, 0xc8, 0x93, 0xd9, - 0xbe, 0x0e, 0x25, 0x81, 0xaf, 0xa7, 0x08, 0x97, 0x0e, 0x65, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, - 0x8b, 0x4b, 0xb4, 0x43, 0x23, 0xfa, 0xe9, 0x7e, 0xa6, 0x09, 0x84, 0x37, 0x85, 0xbf, 0x36, 0x30, - 0xd2, 0x17, 0x4e, 0xed, 0x9f, 0x2d, 0x38, 0x1f, 0xd7, 0xfd, 0x69, 0xf2, 0x9d, 0x67, 0xba, 0x84, - 0x88, 0xb5, 0x4b, 0x38, 0x9e, 0x70, 0x88, 0xf8, 0x18, 0x2e, 0x4b, 0x82, 0x6d, 0x2f, 0xbe, 0x89, - 0x19, 0x89, 0x96, 0xbc, 0x03, 0x93, 0x0a, 0x8d, 0x08, 0xdc, 0xc5, 0xdb, 0xce, 0x47, 0x5e, 0xb4, - 0x67, 0x87, 0x1c, 0xae, 0xde, 0x76, 0x2a, 0xe8, 0xe6, 0xd7, 0xe0, 0xb9, 0xd8, 0x6f, 0x25, 0xe3, - 0xd3, 0x29, 0xe6, 0xc6, 0x93, 0x31, 0x5f, 0x4b, 0x9a, 0xb5, 0xdc, 0x8d, 0xfd, 0xc7, 0x25, 0x6f, - 0xa2, 0x36, 0x4b, 0x34, 0xe6, 0x8a, 0x92, 0x16, 0x4d, 0xec, 0x45, 0x09, 0xc0, 0x7c, 0x5b, 0xa9, - 0x6c, 0x06, 0x43, 0x8d, 0xd8, 0x48, 0x13, 0xff, 0x62, 0x0e, 0x66, 0xd6, 0x97, 0x97, 0x16, 0xe3, - 0x63, 0xe4, 0xcf, 0x58, 0x6e, 0x22, 0xad, 0x6d, 0xc3, 0xe5, 0x8d, 0xb9, 0x09, 0x67, 0x53, 0xdd, - 0x80, 0x8f, 0xa9, 0xbc, 0xc7, 0xfd, 0x4b, 0x62, 0xb0, 0xdc, 0x59, 0x2e, 0x64, 0xb1, 0xdf, 0xba, - 0x65, 0xa5, 0xb0, 0xcd, 0xef, 0x8d, 0xa7, 0xf8, 0x0a, 0x11, 0xf6, 0x3a, 0x94, 0x96, 0xc3, 0xb0, - 0x4f, 0x83, 0x4d, 0x6b, 0x45, 0xd5, 0x11, 0x3d, 0x04, 0xda, 0xfd, 0xa0, 0x63, 0x25, 0x08, 0xe4, - 0x35, 0x28, 0x8a, 0xf8, 0x2e, 0x29, 0x13, 0xf0, 0xba, 0x3c, 0x0e, 0x0f, 0xb3, 0xe2, 0x62, 0xf2, - 0x26, 0x94, 0xf9, 0xff, 0x7c, 0xb6, 0x89, 0x0e, 0xc7, 0xb3, 0x2a, 0x81, 0xce, 0x67, 0xa7, 0xa5, - 0xa1, 0x31, 0xcb, 0x4c, 0xbe, 0xd6, 0xc8, 0x6a, 0x54, 0x48, 0x2c, 0x33, 0xf9, 0xb0, 0x23, 0xd6, - 0x49, 0x45, 0x22, 0xd7, 0x21, 0x5f, 0x5b, 0xb4, 0xd4, 0xac, 0xc8, 0x4e, 0x3b, 0xe0, 0x59, 0xc5, - 0xb5, 0x07, 0x91, 0x6a, 0x8b, 0x16, 0x59, 0x80, 0x22, 0x3e, 0x78, 0xe1, 0xd2, 0x40, 0xf8, 0x8c, - 0xe2, 0xac, 0xe9, 0x09, 0x98, 0x7a, 0xf3, 0x28, 0xf1, 0xc8, 0x3c, 0x4c, 0x2c, 0x79, 0x61, 0xaf, - 0xe3, 0x1c, 0x8a, 0xa4, 0x24, 0x78, 0x19, 0xe2, 0x72, 0x90, 0x3a, 0xcf, 0x04, 0x16, 0x79, 0x0d, - 0xc6, 0x9a, 0x6d, 0xbf, 0xc7, 0xac, 0xad, 0xd8, 0xb5, 0x25, 0x64, 0x00, 0x2d, 0xb3, 0x01, 0x03, - 0x60, 0xc8, 0x31, 0x8f, 0x9c, 0x2a, 0x29, 0x21, 0xc7, 0xe9, 0x88, 0x29, 0x81, 0x33, 0xe8, 0xff, - 0x07, 0x4f, 0xd3, 0xff, 0x6f, 0x07, 0x2e, 0xde, 0x45, 0x55, 0xbf, 0x49, 0x03, 0xcc, 0x03, 0xc9, - 0x1f, 0xcf, 0xd9, 0xb4, 0x96, 0x45, 0xb4, 0xd8, 0xb5, 0xe3, 0xa3, 0xea, 0x4b, 0xdc, 0x1a, 0xb0, - 0x43, 0x8e, 0x23, 0xdf, 0xdd, 0x49, 0xbd, 0x18, 0x30, 0x8c, 0x11, 0xf9, 0x0a, 0x9c, 0xcb, 0x2a, - 0x12, 0x71, 0x63, 0xe8, 0x15, 0x9e, 0xfd, 0x01, 0xd5, 0x2d, 0x3b, 0x8b, 0x03, 0x59, 0x81, 0x0a, - 0x87, 0xd7, 0xdc, 0x03, 0xaf, 0xdb, 0x38, 0x70, 0xbc, 0x0e, 0x46, 0x91, 0x89, 0x50, 0x40, 0xc1, - 0xd5, 0x61, 0x85, 0x36, 0x65, 0xa5, 0x9a, 0x77, 0x52, 0x8a, 0x12, 0xc5, 0x51, 0xb3, 0xb6, 0xba, - 0x92, 0xac, 0xa9, 0xcf, 0xd6, 0xbd, 0x91, 0xd6, 0xb6, 0x13, 0xee, 0x8d, 0x36, 0xe1, 0x6c, 0xaa, - 0x1b, 0xa4, 0x38, 0xd2, 0xc0, 0x69, 0x71, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x1a, 0x4f, - 0xf1, 0x15, 0x67, 0x45, 0x26, 0x8c, 0x73, 0x69, 0xa3, 0x66, 0x2d, 0xe3, 0xb2, 0xc8, 0x12, 0x25, - 0xe4, 0x12, 0xe4, 0x9b, 0xcd, 0x75, 0x35, 0xa7, 0x62, 0x18, 0xfa, 0x16, 0x83, 0xb1, 0x11, 0xc2, - 0x63, 0x20, 0x25, 0x40, 0xab, 0x4d, 0x83, 0x48, 0x3c, 0xe7, 0xf9, 0x72, 0xb2, 0x8e, 0x0b, 0x49, - 0x7f, 0x8b, 0x75, 0x9c, 0xac, 0xde, 0x45, 0x98, 0xab, 0x85, 0x21, 0x0d, 0x22, 0x9e, 0x94, 0x3d, - 0xec, 0x1f, 0xd0, 0x40, 0xcc, 0x35, 0x21, 0x63, 0xf8, 0x63, 0xe0, 0xed, 0xd0, 0x1a, 0x8a, 0x48, - 0xae, 0x41, 0xb1, 0xd6, 0x77, 0x3d, 0xda, 0x6d, 0x6b, 0xbe, 0xe9, 0x8e, 0x80, 0x59, 0x71, 0x29, - 0xf9, 0x10, 0xce, 0x0b, 0x22, 0x29, 0x70, 0x44, 0x0f, 0x70, 0x59, 0xc3, 0x2d, 0x58, 0xb1, 0x16, - 0xa4, 0x98, 0xb2, 0x45, 0x97, 0x64, 0x53, 0x92, 0x1a, 0x54, 0x1a, 0x78, 0x4f, 0x2a, 0x1f, 0xf5, - 0xf5, 0x03, 0x91, 0x7c, 0x17, 0x25, 0x17, 0xbf, 0x43, 0xb5, 0xdd, 0xb8, 0xd0, 0x1a, 0x40, 0x27, - 0xf7, 0xe1, 0x6c, 0x1a, 0xc6, 0xe4, 0x71, 0x29, 0x79, 0x74, 0x6b, 0x80, 0x0b, 0x0a, 0xe6, 0x2c, - 0x2a, 0xb2, 0x03, 0xb3, 0xb5, 0x28, 0x0a, 0xbc, 0x9d, 0x7e, 0x44, 0x53, 0xa2, 0x4b, 0x1e, 0x34, - 0xc6, 0xe5, 0x52, 0x7c, 0x3d, 0x27, 0x26, 0xe3, 0x59, 0x27, 0xa6, 0x8c, 0x45, 0x98, 0x35, 0xc8, - 0x8e, 0xb8, 0xf1, 0xbb, 0x7d, 0xe2, 0x6d, 0x3b, 0x11, 0x50, 0x24, 0x0f, 0x74, 0x6b, 0xe1, 0xe1, - 0xc1, 0x01, 0x8d, 0x02, 0xbc, 0xb9, 0xc7, 0xb7, 0xef, 0x4c, 0xe1, 0x03, 0x74, 0x59, 0x79, 0xae, - 0x12, 0xdf, 0x37, 0xd4, 0xdc, 0x23, 0x35, 0x9e, 0xda, 0xf6, 0x51, 0x1e, 0x71, 0xfb, 0xe8, 0xc0, - 0x6c, 0xa3, 0xdb, 0x0e, 0x0e, 0x31, 0xb2, 0x51, 0x56, 0x6e, 0xea, 0x94, 0xca, 0xc9, 0x87, 0x2d, - 0xae, 0x38, 0x72, 0x86, 0x65, 0x55, 0x6f, 0x90, 0xb1, 0xf9, 0x37, 0xa0, 0x92, 0xee, 0xcb, 0x4f, - 0xf8, 0x58, 0xf1, 0x93, 0xb8, 0x66, 0xb3, 0x91, 0x4e, 0xb7, 0x85, 0xcc, 0x6b, 0x2f, 0xd2, 0x1a, - 0x49, 0x54, 0xba, 0xf2, 0x76, 0xac, 0xf6, 0x0e, 0xad, 0x5c, 0xc6, 0xb9, 0xac, 0x65, 0x6c, 0xfe, - 0x72, 0x0e, 0x66, 0xb9, 0x37, 0xe9, 0xb3, 0xaf, 0x2b, 0xbe, 0xa7, 0x09, 0x67, 0x79, 0x16, 0x98, - 0x6a, 0xdd, 0x09, 0xda, 0xe2, 0x37, 0xe0, 0xfc, 0x40, 0x57, 0xa0, 0x80, 0x5e, 0x92, 0x7e, 0xbc, - 0x03, 0x22, 0x7a, 0x2e, 0xfb, 0x23, 0x5b, 0xb7, 0xac, 0x01, 0x0a, 0xf3, 0x1f, 0xe5, 0x06, 0xf8, - 0x0b, 0xbd, 0x51, 0xd5, 0x04, 0x8d, 0x27, 0xd3, 0x04, 0x73, 0x1f, 0x4b, 0x13, 0xcc, 0x8f, 0xa2, - 0x09, 0x7e, 0x08, 0x53, 0x2d, 0xea, 0x30, 0x8d, 0x46, 0x04, 0x9b, 0x15, 0xb4, 0xd7, 0x62, 0x59, - 0x99, 0x94, 0x2f, 0x71, 0xa0, 0x6a, 0xc4, 0x08, 0x98, 0x68, 0xe1, 0xd1, 0x67, 0x96, 0xce, 0x41, - 0xdd, 0x34, 0xc6, 0x86, 0x6f, 0x1a, 0x66, 0x08, 0xb3, 0xcd, 0xe6, 0xfa, 0x92, 0xe7, 0xec, 0x76, - 0xfd, 0x30, 0xf2, 0xda, 0xcb, 0xdd, 0x07, 0x3e, 0x9b, 0x1c, 0xec, 0xaf, 0x12, 0xa3, 0x4c, 0xe2, - 0x27, 0x3f, 0xd7, 0x65, 0x89, 0xf0, 0x38, 0xed, 0x3e, 0xf0, 0xd1, 0x79, 0xc8, 0x8a, 0x49, 0xf4, - 0x85, 0x59, 0xce, 0x08, 0x28, 0xfe, 0x66, 0x0e, 0x26, 0x95, 0x36, 0x91, 0x2f, 0x42, 0x79, 0x3d, - 0xd8, 0x75, 0xba, 0xde, 0xcf, 0x38, 0xca, 0x99, 0x2f, 0xf6, 0x99, 0xaf, 0xc0, 0x2d, 0x0d, 0x0b, - 0x7d, 0x75, 0xa8, 0x73, 0xa0, 0xae, 0x36, 0xd6, 0x27, 0x16, 0x42, 0x95, 0x08, 0xe5, 0xfc, 0x08, - 0x11, 0xca, 0x7a, 0x78, 0x6f, 0xe1, 0xc9, 0xc3, 0x7b, 0xb5, 0x68, 0xdc, 0xb1, 0x27, 0x8c, 0xc6, - 0x35, 0x7f, 0x35, 0x07, 0x15, 0xf1, 0x98, 0xab, 0x3c, 0xb1, 0xfc, 0x6c, 0x3d, 0xfe, 0xa0, 0x37, - 0xee, 0x84, 0x3b, 0xb9, 0xc2, 0x6f, 0xfe, 0x6e, 0x15, 0x9f, 0xe6, 0x4c, 0x77, 0x87, 0x7c, 0x9a, - 0x53, 0x87, 0xa7, 0xc3, 0x15, 0xd2, 0x54, 0x56, 0x1a, 0xdf, 0xfc, 0x93, 0x5c, 0x9a, 0xb7, 0x50, - 0xe1, 0x5e, 0x86, 0x09, 0xfe, 0x16, 0x97, 0xf4, 0xa8, 0x16, 0x09, 0xa3, 0x10, 0x64, 0xc9, 0xb2, - 0x27, 0x09, 0x5c, 0x39, 0xed, 0x7d, 0x56, 0x72, 0x1b, 0xca, 0xe8, 0xa4, 0x52, 0x73, 0xdd, 0x80, - 0x86, 0xa1, 0xd0, 0xee, 0xf0, 0xc2, 0xf0, 0x11, 0xdd, 0xb1, 0xb9, 0x33, 0x8b, 0xe3, 0xba, 0x81, - 0xa5, 0xe1, 0x91, 0x45, 0x38, 0xa7, 0xf9, 0x44, 0x49, 0xfa, 0xb1, 0x64, 0x8b, 0x8a, 0xb0, 0x80, - 0x13, 0x67, 0x22, 0x3f, 0xbd, 0xb7, 0xa9, 0xcd, 0xff, 0x6d, 0xb0, 0xb5, 0xd6, 0xde, 0xff, 0x8c, - 0x85, 0xd4, 0xb0, 0x26, 0x9d, 0x60, 0x61, 0xfc, 0x07, 0x83, 0x3b, 0xc5, 0x8b, 0xe9, 0xf3, 0x16, - 0x8c, 0xf3, 0x97, 0xbf, 0x84, 0xfb, 0xb6, 0xca, 0x85, 0x17, 0x24, 0x97, 0x62, 0xfc, 0xfd, 0x30, - 0x4b, 0x10, 0x30, 0x3b, 0x5d, 0xf7, 0xcd, 0x47, 0x6d, 0x77, 0xd0, 0x29, 0x5f, 0x62, 0xa9, 0xc9, - 0x50, 0x47, 0x4b, 0xb2, 0x6d, 0x9c, 0x9e, 0x0c, 0xd5, 0xfc, 0xbf, 0x39, 0xde, 0x1e, 0x51, 0xa9, - 0x51, 0xb3, 0xfc, 0xbd, 0x02, 0x05, 0x7c, 0x63, 0x56, 0x49, 0xa5, 0x98, 0x7a, 0x5f, 0x16, 0xcb, - 0xd9, 0xba, 0x41, 0x59, 0xab, 0x46, 0x71, 0xa1, 0x38, 0x56, 0xd7, 0x0d, 0x62, 0x60, 0x0a, 0x6b, - 0xdf, 0xa5, 0xea, 0x72, 0xe8, 0xea, 0xd9, 0xc6, 0xb1, 0x9c, 0xdc, 0x56, 0x9c, 0xa9, 0xd5, 0x53, - 0x94, 0x83, 0x07, 0x8e, 0xcd, 0x9d, 0x78, 0x55, 0x69, 0x9b, 0xf8, 0x5d, 0x37, 0x60, 0x5a, 0x0f, - 0x90, 0x16, 0x96, 0x0e, 0xc6, 0x99, 0xa7, 0x82, 0xab, 0x55, 0x9d, 0x5a, 0x27, 0x22, 0x75, 0x98, - 0xd2, 0xa2, 0x60, 0xd5, 0xcc, 0xaf, 0x3c, 0x25, 0x8d, 0x3d, 0x98, 0xbe, 0x41, 0x27, 0x51, 0x4e, - 0xe9, 0xbf, 0x00, 0x15, 0xb1, 0x32, 0xe3, 0x80, 0x3a, 0xd4, 0x27, 0x97, 0x97, 0x2c, 0x75, 0x35, - 0xb5, 0x3d, 0x37, 0xb0, 0x10, 0x6a, 0x7e, 0xd7, 0x80, 0x4b, 0xe2, 0x45, 0x33, 0x8b, 0x86, 0x4c, - 0x71, 0xc5, 0x28, 0x3c, 0x9c, 0x8f, 0x5f, 0x24, 0xef, 0xc8, 0x6c, 0x57, 0xba, 0x80, 0x4c, 0x7f, - 0xa3, 0x3e, 0x25, 0x26, 0xe5, 0x18, 0xe6, 0xbb, 0x92, 0x59, 0xae, 0xde, 0x12, 0x59, 0xae, 0x72, - 0x27, 0x13, 0xc7, 0xeb, 0xc2, 0xa5, 0x5d, 0x99, 0xdd, 0xea, 0x3b, 0x39, 0x38, 0x9f, 0x51, 0xad, - 0xad, 0x2f, 0x3e, 0xa3, 0xc2, 0xa1, 0xae, 0x09, 0x07, 0x99, 0x06, 0x71, 0x68, 0xc7, 0x67, 0xca, - 0x8a, 0xdf, 0x36, 0xe0, 0xa2, 0x3e, 0x7b, 0x84, 0x01, 0xbc, 0x75, 0x8b, 0xbc, 0x0d, 0xe3, 0xf7, - 0xa8, 0xe3, 0x52, 0x19, 0xf7, 0x11, 0xa7, 0x14, 0x13, 0x47, 0xd2, 0xbc, 0x90, 0xb3, 0xfd, 0x13, - 0xbe, 0x94, 0xcf, 0x58, 0x82, 0x84, 0x2c, 0x89, 0xca, 0xf1, 0x3b, 0x31, 0x53, 0x5e, 0x0f, 0x65, - 0x7d, 0xea, 0x04, 0x6d, 0xfc, 0xf7, 0x0d, 0x78, 0xee, 0x04, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, - 0x81, 0xc3, 0x8d, 0x05, 0xa1, 0xe4, 0x3d, 0x98, 0x69, 0x89, 0xf0, 0x34, 0x39, 0x1c, 0x4a, 0x4a, - 0x79, 0x19, 0xb9, 0x66, 0xcb, 0x71, 0x49, 0x23, 0x93, 0x6b, 0x50, 0xbc, 0xe7, 0x87, 0x51, 0x37, - 0xc9, 0x50, 0x83, 0x47, 0x0e, 0x7b, 0x02, 0x66, 0xc5, 0xa5, 0x4c, 0x2d, 0xd0, 0xab, 0x29, 0x7c, - 0x30, 0x5e, 0x84, 0x71, 0x86, 0x13, 0xab, 0xf4, 0x38, 0x0f, 0xf0, 0xbd, 0x2d, 0xcf, 0xb5, 0x44, - 0x51, 0x6c, 0x4c, 0xe6, 0x32, 0xaf, 0x4a, 0xbe, 0x69, 0x40, 0x45, 0xe7, 0xfd, 0x49, 0x87, 0xe6, - 0x5d, 0x6d, 0x68, 0x9e, 0xcb, 0x1e, 0x9a, 0xe1, 0x63, 0x32, 0x90, 0x2c, 0x62, 0xa4, 0xb1, 0x30, - 0x61, 0x7c, 0xc9, 0x3f, 0x70, 0xbc, 0xae, 0x9a, 0xe0, 0xc0, 0x45, 0x88, 0x25, 0x4a, 0x94, 0xde, - 0xca, 0x0f, 0xed, 0x2d, 0xf3, 0xdb, 0x05, 0xb8, 0x64, 0xd1, 0x5d, 0x8f, 0x29, 0x48, 0x9b, 0xa1, - 0xd7, 0xdd, 0xd5, 0x2e, 0xb2, 0xcc, 0x54, 0x87, 0x0b, 0xf7, 0x3d, 0x06, 0x89, 0xfb, 0xfb, 0x35, - 0x28, 0x32, 0x29, 0xad, 0xf4, 0x39, 0x1a, 0x0c, 0x98, 0xa6, 0x87, 0x8f, 0xab, 0x2c, 0x26, 0xd7, - 0xc5, 0x1e, 0xa2, 0x38, 0x58, 0xb3, 0x3d, 0x24, 0xf5, 0x5c, 0x38, 0xdf, 0x47, 0x62, 0xa5, 0xaa, - 0x30, 0x44, 0xa9, 0x5a, 0x85, 0x73, 0x35, 0x97, 0xcb, 0x27, 0xa7, 0xb3, 0x11, 0x78, 0xdd, 0xb6, - 0xd7, 0x73, 0x3a, 0x52, 0x29, 0xe7, 0x8f, 0xa7, 0xc7, 0xe5, 0x76, 0x2f, 0x46, 0xb0, 0x32, 0xc9, - 0x58, 0x33, 0x96, 0xd6, 0x9a, 0x3c, 0x0b, 0xcb, 0x38, 0xb2, 0xc0, 0x66, 0xb8, 0xdd, 0x90, 0xa7, - 0x61, 0xb1, 0xe2, 0x62, 0x54, 0xe7, 0x30, 0xc6, 0xa2, 0xb5, 0xd2, 0xbc, 0x2f, 0x62, 0x16, 0xa4, - 0xff, 0x17, 0x0f, 0xc9, 0x88, 0x3a, 0x21, 0x1e, 0x1a, 0x68, 0x78, 0x09, 0x5d, 0xb3, 0x79, 0x8f, - 0xd1, 0x15, 0x07, 0xe8, 0xc2, 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0x64, 0x1e, 0x80, 0x7b, 0xd0, 0xe0, - 0x84, 0x28, 0x25, 0xca, 0x5f, 0x80, 0x50, 0xae, 0xfc, 0x29, 0x28, 0xe4, 0x1d, 0x38, 0xdb, 0x58, - 0x5c, 0x90, 0xc1, 0x08, 0x4b, 0x7e, 0xbb, 0x7f, 0x40, 0xbb, 0x11, 0x06, 0xc7, 0x94, 0xf9, 0x18, - 0xd2, 0xf6, 0x02, 0x9b, 0x05, 0x59, 0x68, 0x22, 0x24, 0x81, 0x07, 0xb4, 0x2d, 0xfa, 0x2e, 0x0d, - 0xb7, 0x6e, 0x7e, 0xc6, 0x42, 0x12, 0x94, 0xb6, 0xe1, 0x6a, 0xbb, 0x99, 0xb9, 0x32, 0xff, 0x1e, - 0x86, 0x24, 0x0c, 0xe0, 0x92, 0x1f, 0x87, 0x31, 0xfc, 0x29, 0x76, 0xdc, 0xb3, 0x19, 0x6c, 0x93, - 0xdd, 0xb6, 0xcd, 0x13, 0x6a, 0x20, 0x01, 0x59, 0x4e, 0x32, 0xe6, 0x3f, 0x81, 0x63, 0xad, 0x88, - 0x8a, 0xd5, 0x9f, 0x4a, 0x71, 0xa1, 0xac, 0x7e, 0x90, 0xcd, 0x91, 0x7b, 0x4e, 0xb8, 0x47, 0xdd, - 0x45, 0xf9, 0xd8, 0x61, 0x99, 0xcf, 0x91, 0x3d, 0x84, 0xe2, 0x33, 0x2e, 0x96, 0x82, 0xc2, 0xa4, - 0xc3, 0x72, 0xb8, 0x19, 0x8a, 0xaa, 0x08, 0x2b, 0xc8, 0x43, 0xeb, 0xd5, 0xb5, 0x44, 0x11, 0x4a, - 0x4b, 0x99, 0x30, 0x32, 0x70, 0xda, 0xfb, 0x34, 0xd8, 0xba, 0xf9, 0x69, 0x48, 0x4b, 0xfd, 0x1b, - 0x27, 0x8c, 0xc9, 0xaf, 0x15, 0xe3, 0x7c, 0x30, 0x1a, 0x32, 0xd3, 0x11, 0x13, 0x77, 0x00, 0x23, - 0xd1, 0x11, 0x13, 0x77, 0x00, 0x55, 0x47, 0x8c, 0x51, 0xe3, 0x74, 0xbd, 0xb9, 0x53, 0xd2, 0xf5, - 0x0e, 0xc9, 0x10, 0x2e, 0x3d, 0x49, 0x3f, 0x43, 0x8f, 0x25, 0x7c, 0x09, 0xca, 0xb5, 0x28, 0x72, - 0xda, 0x7b, 0xd4, 0xc5, 0xb4, 0xd0, 0xca, 0x2d, 0xa4, 0x23, 0xe0, 0xaa, 0x8f, 0x9a, 0x8a, 0xab, - 0x3c, 0x96, 0x32, 0x31, 0xc2, 0x63, 0x29, 0xf3, 0x30, 0xb1, 0xdc, 0x7d, 0xe8, 0xb1, 0x3e, 0x29, - 0x26, 0x19, 0x29, 0x3c, 0x0e, 0xd2, 0x5f, 0xd8, 0x40, 0x10, 0x79, 0x4b, 0xd1, 0x20, 0x4a, 0x89, - 0x2a, 0x2f, 0x9e, 0x69, 0x96, 0x8a, 0x84, 0x7a, 0xc8, 0x2d, 0xd1, 0xc9, 0x6d, 0x98, 0x90, 0xd6, - 0x33, 0x24, 0xea, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x04, 0x43, 0x58, 0xcf, 0xef, 0xe8, 0x41, - 0x2b, 0x93, 0x4a, 0x30, 0xb8, 0x12, 0xb4, 0xa2, 0x05, 0x83, 0x2b, 0xe1, 0x2b, 0xb1, 0x31, 0x54, - 0x3e, 0xd5, 0x18, 0xda, 0x82, 0xf2, 0x86, 0x13, 0x44, 0x1e, 0xdb, 0x8e, 0xba, 0x11, 0xcf, 0xe5, - 0x95, 0xd8, 0xea, 0x4a, 0x51, 0xfd, 0x05, 0x19, 0x14, 0xdd, 0x53, 0xf0, 0xf5, 0x68, 0xda, 0x04, - 0x4e, 0xd6, 0x32, 0xdc, 0x1a, 0x45, 0xe6, 0x49, 0xbc, 0x77, 0x54, 0x0e, 0xae, 0x44, 0x8b, 0xd4, - 0xf3, 0xfb, 0x41, 0x8f, 0xc8, 0x5b, 0x7c, 0x0c, 0xd0, 0x66, 0x9c, 0x41, 0x36, 0x98, 0xd2, 0x04, - 0xf5, 0x8a, 0x94, 0xe1, 0x18, 0x23, 0x92, 0xaf, 0x43, 0x99, 0xfd, 0x8f, 0x89, 0x8d, 0x3c, 0xca, - 0x73, 0x75, 0x25, 0x6e, 0x6e, 0xfa, 0x82, 0xe6, 0xd9, 0x8f, 0x9a, 0x34, 0xe2, 0x0b, 0x18, 0x19, - 0xa7, 0x0f, 0x5e, 0x34, 0x6e, 0xe6, 0x0f, 0x0d, 0xb8, 0x38, 0x84, 0xc7, 0xc8, 0xcf, 0x24, 0xcd, - 0x27, 0x1b, 0x92, 0x62, 0x9b, 0x8b, 0x0d, 0x49, 0x9d, 0x18, 0x72, 0x6b, 0xca, 0xce, 0xb2, 0x95, - 0xff, 0xd4, 0xb2, 0x6c, 0x99, 0x47, 0x06, 0x4c, 0x2a, 0x23, 0xfb, 0x14, 0x5f, 0x3f, 0x78, 0x45, - 0xa4, 0x9b, 0xcc, 0x27, 0x78, 0xa9, 0x47, 0x8f, 0x79, 0x7a, 0xc9, 0x6f, 0x00, 0xac, 0x38, 0x61, - 0x54, 0x6b, 0x47, 0xde, 0x43, 0x3a, 0x82, 0x18, 0x4b, 0xb2, 0x03, 0x38, 0x98, 0xbd, 0x95, 0x91, - 0x0d, 0x64, 0x07, 0x88, 0x19, 0x9a, 0x6b, 0x30, 0xde, 0xf4, 0x83, 0xa8, 0x7e, 0xc8, 0xf7, 0xa6, - 0x25, 0x1a, 0xb6, 0xd5, 0x13, 0x3a, 0x0f, 0x6d, 0xf5, 0xb6, 0x25, 0x8a, 0x98, 0x82, 0x78, 0xc7, - 0xa3, 0x1d, 0x57, 0xbd, 0x16, 0x7a, 0xc0, 0x00, 0x16, 0x87, 0x5f, 0x7f, 0x1f, 0x66, 0x64, 0xc6, - 0xbb, 0xd6, 0x4a, 0x13, 0x5b, 0x30, 0x03, 0x93, 0x5b, 0x0d, 0x6b, 0xf9, 0xce, 0x57, 0xed, 0x3b, - 0x9b, 0x2b, 0x2b, 0x95, 0x33, 0x64, 0x0a, 0x4a, 0x02, 0xb0, 0x58, 0xab, 0x18, 0xa4, 0x0c, 0xc5, - 0xe5, 0xb5, 0x66, 0x63, 0x71, 0xd3, 0x6a, 0x54, 0x72, 0xd7, 0x5f, 0x86, 0xe9, 0xe4, 0xd2, 0x07, - 0x4f, 0xbc, 0x27, 0x20, 0x6f, 0xd5, 0xb6, 0x2b, 0x67, 0x08, 0xc0, 0xf8, 0xc6, 0xfd, 0xc5, 0xe6, - 0xcd, 0x9b, 0x15, 0xe3, 0xfa, 0x17, 0x32, 0x5e, 0x9a, 0x66, 0x9c, 0x9a, 0xb4, 0xe7, 0x04, 0x4e, - 0x44, 0xf9, 0x67, 0x56, 0xfb, 0x9d, 0xc8, 0xeb, 0x75, 0xe8, 0xe3, 0x8a, 0x71, 0xfd, 0xad, 0x81, - 0x07, 0xa3, 0xc9, 0x79, 0x98, 0xdd, 0x5c, 0xab, 0xad, 0xd6, 0x97, 0xef, 0x6e, 0xae, 0x6f, 0x36, - 0xed, 0xd5, 0x5a, 0x6b, 0xf1, 0x5e, 0xe5, 0x0c, 0xab, 0xf0, 0xea, 0x7a, 0xb3, 0x65, 0x5b, 0x8d, - 0xc5, 0xc6, 0x5a, 0xab, 0x62, 0x5c, 0xff, 0x15, 0x03, 0xa6, 0xf5, 0x27, 0xf8, 0xc8, 0x55, 0xb8, - 0xb2, 0xd9, 0x6c, 0x58, 0x76, 0x6b, 0xfd, 0x7e, 0x63, 0xcd, 0xde, 0x6c, 0xd6, 0xee, 0x36, 0xec, - 0xcd, 0xb5, 0xe6, 0x46, 0x63, 0x71, 0xf9, 0xce, 0x72, 0x63, 0xa9, 0x72, 0x86, 0x54, 0xe1, 0x39, - 0x05, 0xc3, 0x6a, 0x2c, 0xae, 0x6f, 0x35, 0x2c, 0x7b, 0xa3, 0xd6, 0x6c, 0x6e, 0xaf, 0x5b, 0x4b, - 0x15, 0x83, 0x5c, 0x86, 0x0b, 0x19, 0x08, 0xab, 0x77, 0x6a, 0x95, 0xdc, 0x40, 0xd9, 0x5a, 0x63, - 0xbb, 0xb6, 0x62, 0xd7, 0xd7, 0x5b, 0x95, 0xfc, 0xf5, 0xf7, 0x99, 0x16, 0x92, 0xbc, 0x91, 0x41, - 0x8a, 0x50, 0x58, 0x5b, 0x5f, 0x6b, 0x54, 0xce, 0x90, 0x49, 0x98, 0xd8, 0x68, 0xac, 0x2d, 0x2d, - 0xaf, 0xdd, 0xe5, 0xdd, 0x5a, 0xdb, 0xd8, 0xb0, 0xd6, 0xb7, 0x1a, 0x4b, 0x95, 0x1c, 0xeb, 0xbb, - 0xa5, 0xc6, 0x1a, 0xab, 0x59, 0xfe, 0xba, 0xc9, 0xf3, 0x42, 0x6b, 0x69, 0x4d, 0x59, 0x6f, 0x35, - 0xbe, 0xd2, 0x6a, 0xac, 0x35, 0x97, 0xd7, 0xd7, 0x2a, 0x67, 0xae, 0x5f, 0x49, 0xe1, 0xc8, 0x91, - 0x68, 0x36, 0xef, 0x55, 0xce, 0x5c, 0xff, 0x3b, 0x39, 0x98, 0x54, 0x6e, 0x2b, 0xd8, 0x87, 0x37, - 0xd7, 0xee, 0xaf, 0xad, 0x6f, 0xaf, 0x55, 0xce, 0x90, 0x12, 0x8c, 0x35, 0x2c, 0x6b, 0xdd, 0xaa, - 0x18, 0x0c, 0xde, 0xdc, 0x5c, 0x5c, 0x6c, 0x34, 0x9b, 0x95, 0x1c, 0xb9, 0x00, 0x64, 0xd1, 0x6a, - 0xd4, 0x5a, 0x0d, 0x1b, 0x9b, 0xb6, 0x51, 0xb3, 0x6a, 0xab, 0xcd, 0x4a, 0x9e, 0x5c, 0x81, 0xb9, - 0x66, 0x6d, 0x75, 0xc5, 0xae, 0xb5, 0x5a, 0xd6, 0x72, 0x7d, 0xb3, 0xd5, 0x68, 0xda, 0xad, 0x75, - 0xdb, 0x5a, 0x5f, 0x69, 0x34, 0x2b, 0x05, 0xf2, 0x32, 0x7c, 0x6e, 0x58, 0xa9, 0xbd, 0x5d, 0xb3, - 0xd6, 0x96, 0xd7, 0xee, 0x36, 0x2b, 0x63, 0xe4, 0x22, 0x77, 0x1d, 0xb0, 0x6b, 0xcd, 0x66, 0xc3, - 0x6a, 0x2d, 0xaf, 0xaf, 0xd9, 0xcb, 0x6b, 0x77, 0xd6, 0x2b, 0xe3, 0xe4, 0x79, 0xb8, 0xa4, 0xd3, - 0xdb, 0xcd, 0x56, 0xad, 0xd5, 0x58, 0x6d, 0xac, 0xb5, 0x9a, 0x95, 0x09, 0x36, 0x4a, 0x58, 0xdc, - 0xb2, 0x6a, 0xcb, 0xad, 0xa6, 0x7d, 0xc7, 0x5a, 0x5f, 0x4d, 0x78, 0x34, 0x2b, 0x45, 0x36, 0xd0, - 0x88, 0xb0, 0xb8, 0xbe, 0xb6, 0xd6, 0x58, 0x6c, 0xad, 0x5b, 0x1c, 0xd5, 0x5e, 0xad, 0x6d, 0x6c, - 0xb0, 0x8e, 0x2e, 0x5d, 0xff, 0x3a, 0x94, 0x55, 0x8d, 0x04, 0xab, 0xa2, 0xfc, 0xde, 0xa0, 0x5d, - 0xd7, 0xeb, 0xee, 0x56, 0xce, 0xa4, 0x0b, 0xac, 0x7e, 0xb7, 0xcb, 0x0a, 0x70, 0x26, 0xa8, 0x05, - 0x2d, 0x1a, 0x1c, 0x78, 0x5d, 0xa6, 0x6c, 0x54, 0x72, 0xf5, 0xca, 0xf7, 0xff, 0xfc, 0x85, 0x33, - 0xdf, 0xff, 0xc1, 0x0b, 0xc6, 0x9f, 0xfc, 0xe0, 0x05, 0xe3, 0xbf, 0xfd, 0xe0, 0x05, 0x63, 0x67, - 0x1c, 0x57, 0xfd, 0xad, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xad, 0x58, 0x81, 0xf1, 0xb6, - 0x00, 0x00, + // 12024 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, + 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0xf3, 0xc7, 0x99, 0x9d, 0xdd, + 0x9e, 0xab, 0xfd, 0x9b, 0x99, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0x47, 0xda, 0xdb, 0xbf, 0xeb, 0x26, + 0x39, 0x33, 0xdc, 0xe1, 0x90, 0xdc, 0x6a, 0xfe, 0xdc, 0xe9, 0xee, 0x54, 0x2a, 0x76, 0x25, 0xc9, + 0x5a, 0x76, 0x77, 0xb5, 0xaa, 0xaa, 0x67, 0x86, 0xd2, 0x27, 0x48, 0xc2, 0x67, 0x59, 0x10, 0x04, + 0xdd, 0x8f, 0x70, 0xb2, 0x24, 0x5b, 0x86, 0x64, 0xc1, 0xb2, 0x2d, 0x1b, 0xe7, 0x07, 0xd9, 0x80, + 0x6d, 0xd8, 0xb0, 0x21, 0xd8, 0x10, 0xee, 0xc1, 0x86, 0xf5, 0x66, 0x48, 0x36, 0x68, 0xeb, 0xce, + 0x2f, 0x22, 0x60, 0xc3, 0x80, 0x9f, 0x74, 0xb6, 0x60, 0x23, 0x23, 0x33, 0xab, 0x32, 0xab, 0xab, + 0xc9, 0xe6, 0xee, 0x2c, 0x7c, 0xb3, 0x4f, 0xdd, 0x15, 0x19, 0x11, 0xf9, 0x1f, 0x19, 0x19, 0x19, + 0x19, 0x09, 0xe3, 0xd1, 0x41, 0x97, 0x86, 0x37, 0xbb, 0x81, 0x1f, 0xf9, 0x64, 0x04, 0x3f, 0x2e, + 0x9f, 0xdb, 0xf5, 0x77, 0x7d, 0x84, 0xcc, 0xb2, 0x7f, 0x3c, 0xf1, 0x72, 0x75, 0xd7, 0xf7, 0x77, + 0x5b, 0x74, 0x16, 0xbf, 0xb6, 0x7b, 0x3b, 0xb3, 0x91, 0xd7, 0xa6, 0x61, 0xe4, 0xb4, 0xbb, 0x02, + 0x61, 0x7e, 0xd7, 0x8b, 0xf6, 0x7a, 0xdb, 0x37, 0x9b, 0x7e, 0x7b, 0x76, 0x37, 0x70, 0x1e, 0x79, + 0x91, 0x13, 0x79, 0x7e, 0xc7, 0x69, 0xcd, 0x46, 0xb4, 0x45, 0xbb, 0x7e, 0x10, 0xcd, 0x3a, 0x5d, + 0x6f, 0x16, 0xf3, 0x98, 0x7d, 0x1c, 0x38, 0xdd, 0x2e, 0x0d, 0x92, 0x3f, 0x9c, 0x89, 0xf9, 0xb7, + 0xf2, 0x50, 0x7a, 0x40, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x51, 0xf2, 0x22, 0x14, 0x56, 0x9c, 0x36, + 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4a, 0xf5, 0xa9, 0xa3, 0xc3, 0xea, 0x78, 0x48, 0x83, 0x47, 0x34, + 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x98, 0x48, 0x3e, 0x0b, 0x25, 0xf6, 0x1b, 0x76, 0x9d, 0x26, 0x9d, + 0xc9, 0x21, 0xe6, 0xc4, 0xd1, 0x61, 0xb5, 0xd4, 0x91, 0x40, 0x2b, 0x49, 0x27, 0xaf, 0xc0, 0xd8, + 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, 0xcb, 0xd7, 0xcb, 0x47, 0x87, 0xd5, + 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x22, 0x59, 0x82, 0xb1, 0xc5, 0x27, 0x5d, 0x2f, 0xa0, + 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x6d, 0x7c, 0xee, 0xf2, 0x4d, 0x5e, 0xff, 0x9b, 0xb2, 0xfe, 0x37, + 0xd7, 0x65, 0xfd, 0xeb, 0x67, 0xbf, 0x7b, 0x58, 0x3d, 0x73, 0x74, 0x58, 0x1d, 0xa3, 0x9c, 0xe4, + 0x9b, 0xff, 0xb9, 0x6a, 0x58, 0x92, 0x9e, 0xbc, 0x0d, 0x85, 0xf5, 0x83, 0x2e, 0x9d, 0x29, 0x5d, + 0x35, 0xae, 0x4d, 0xce, 0xbd, 0x70, 0x93, 0xb7, 0x78, 0x5c, 0xc9, 0xe4, 0x1f, 0xc3, 0xaa, 0x17, + 0x8f, 0x0e, 0xab, 0x05, 0x86, 0x62, 0x21, 0x15, 0x79, 0x1d, 0x46, 0xef, 0xfb, 0x61, 0xb4, 0xb4, + 0x30, 0x03, 0x58, 0xb5, 0xf3, 0x47, 0x87, 0xd5, 0xe9, 0x3d, 0x3f, 0x8c, 0x6c, 0xcf, 0x7d, 0xcd, + 0x6f, 0x7b, 0x11, 0x6d, 0x77, 0xa3, 0x03, 0x4b, 0x20, 0x99, 0xdb, 0x30, 0xa1, 0xf1, 0x23, 0xe3, + 0x30, 0xb6, 0xb1, 0xf2, 0x60, 0x65, 0x75, 0x6b, 0xa5, 0x72, 0x86, 0x14, 0xa1, 0xb0, 0xb2, 0xba, + 0xb0, 0x58, 0x31, 0xc8, 0x18, 0xe4, 0x6b, 0x6b, 0x6b, 0x95, 0x1c, 0x29, 0x43, 0x71, 0xa1, 0xb6, + 0x5e, 0xab, 0xd7, 0x1a, 0x8b, 0x95, 0x3c, 0x39, 0x0b, 0x53, 0x5b, 0x4b, 0x2b, 0x0b, 0xab, 0x5b, + 0x0d, 0x7b, 0x61, 0xb1, 0xf1, 0x60, 0x7d, 0x75, 0xad, 0x52, 0x20, 0x93, 0x00, 0x0f, 0x36, 0xea, + 0x8b, 0xd6, 0xca, 0xe2, 0xfa, 0x62, 0xa3, 0x32, 0x62, 0xfe, 0x62, 0x1e, 0x8a, 0x0f, 0x69, 0xe4, + 0xb8, 0x4e, 0xe4, 0x90, 0x2b, 0x5a, 0x17, 0x61, 0xe9, 0x95, 0xbe, 0x79, 0xb1, 0xbf, 0x6f, 0x46, + 0x8e, 0x0e, 0xab, 0xc6, 0xeb, 0x6a, 0x9f, 0xbc, 0x05, 0xe3, 0x0b, 0x34, 0x6c, 0x06, 0x5e, 0x97, + 0x8d, 0x17, 0xec, 0x97, 0x52, 0xfd, 0xd2, 0xd1, 0x61, 0xf5, 0xbc, 0x9b, 0x80, 0x95, 0xba, 0xaa, + 0xd8, 0x64, 0x09, 0x46, 0x97, 0x9d, 0x6d, 0xda, 0x0a, 0x67, 0x46, 0xae, 0xe6, 0xaf, 0x8d, 0xcf, + 0x3d, 0x27, 0xda, 0x57, 0x16, 0xf0, 0x26, 0x4f, 0x5d, 0xec, 0x44, 0xc1, 0x41, 0xfd, 0xdc, 0xd1, + 0x61, 0xb5, 0xd2, 0x42, 0x80, 0xda, 0x76, 0x1c, 0x85, 0x34, 0x92, 0x3e, 0x1f, 0x3d, 0xb1, 0xcf, + 0x9f, 0xff, 0xee, 0x61, 0xd5, 0x60, 0x7d, 0x21, 0xfa, 0x3c, 0xe1, 0xa7, 0xf7, 0xfe, 0x55, 0xc8, + 0x2d, 0x2d, 0xcc, 0x8c, 0xe1, 0x58, 0xab, 0x1c, 0x1d, 0x56, 0xcb, 0x5a, 0xb7, 0xe5, 0x96, 0x16, + 0x2e, 0xbf, 0x09, 0xe3, 0x4a, 0x19, 0x49, 0x05, 0xf2, 0xfb, 0xf4, 0x80, 0xb7, 0xa7, 0xc5, 0xfe, + 0x92, 0x73, 0x30, 0xf2, 0xc8, 0x69, 0xf5, 0x44, 0x03, 0x5a, 0xfc, 0xe3, 0x0b, 0xb9, 0x1f, 0x35, + 0xcc, 0x5f, 0x2d, 0x40, 0xd1, 0xf2, 0xf9, 0x3c, 0x23, 0xd7, 0x61, 0xa4, 0x11, 0x39, 0x91, 0xec, + 0x8a, 0xb3, 0x47, 0x87, 0xd5, 0xa9, 0x90, 0x01, 0x94, 0xfc, 0x38, 0x06, 0x43, 0x5d, 0xdb, 0x73, + 0x42, 0xd9, 0x25, 0x88, 0xda, 0x65, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x2b, 0x50, 0x78, 0xe8, 0xbb, + 0x54, 0xf4, 0x0a, 0x39, 0x3a, 0xac, 0x4e, 0xb6, 0x7d, 0x57, 0x45, 0xc4, 0x74, 0xf2, 0x1a, 0x94, + 0xe6, 0x7b, 0x41, 0x40, 0x3b, 0x6c, 0xa8, 0x16, 0x10, 0x79, 0xf2, 0xe8, 0xb0, 0x0a, 0x4d, 0x0e, + 0x64, 0x93, 0x2b, 0x41, 0x60, 0x4d, 0xdd, 0x88, 0x9c, 0x20, 0xa2, 0xee, 0xcc, 0xc8, 0x50, 0x4d, + 0xcd, 0xa6, 0xd7, 0x74, 0xc8, 0x49, 0xd2, 0x4d, 0x2d, 0x38, 0x91, 0xfb, 0x30, 0x7e, 0x2f, 0x70, + 0x9a, 0x74, 0x8d, 0x06, 0x9e, 0xef, 0x62, 0x1f, 0xe6, 0xeb, 0xaf, 0x1c, 0x1d, 0x56, 0x2f, 0xec, + 0x32, 0xb0, 0xdd, 0x45, 0x78, 0x42, 0xfd, 0x83, 0xc3, 0x6a, 0x71, 0xa1, 0x17, 0x60, 0xeb, 0x59, + 0x2a, 0x29, 0xf9, 0x09, 0xd6, 0x25, 0x61, 0x84, 0x4d, 0x4b, 0x5d, 0xec, 0xbd, 0xe3, 0x8b, 0x68, + 0x8a, 0x22, 0x5e, 0x68, 0x39, 0x61, 0x64, 0x07, 0x9c, 0x2e, 0x55, 0x4e, 0x95, 0x25, 0x59, 0x85, + 0x62, 0xa3, 0xb9, 0x47, 0xdd, 0x5e, 0x8b, 0xce, 0x14, 0x91, 0xfd, 0x45, 0x31, 0x70, 0x65, 0x7f, + 0xca, 0xe4, 0xfa, 0x65, 0xc1, 0x9b, 0x84, 0x02, 0xa2, 0xb4, 0x7d, 0xcc, 0xe4, 0x0b, 0xc5, 0xdf, + 0xf8, 0x9d, 0xea, 0x99, 0x9f, 0xfb, 0x4f, 0x57, 0xcf, 0x98, 0xff, 0x24, 0x07, 0x95, 0x34, 0x13, + 0xb2, 0x03, 0x13, 0x1b, 0x5d, 0xd7, 0x89, 0xe8, 0x7c, 0xcb, 0xa3, 0x9d, 0x28, 0xc4, 0x41, 0x72, + 0x7c, 0x9d, 0x5e, 0x12, 0xf9, 0xce, 0xf4, 0x90, 0xd0, 0x6e, 0x72, 0xca, 0x54, 0xad, 0x74, 0xb6, + 0x49, 0x3e, 0x0d, 0x94, 0xd3, 0x21, 0x8e, 0xb0, 0xd3, 0xe5, 0xc3, 0x25, 0xfc, 0x80, 0x7c, 0x04, + 0x5b, 0x31, 0x80, 0x3a, 0xee, 0xf6, 0x01, 0x8e, 0xcc, 0xe1, 0x07, 0x10, 0x23, 0xc9, 0x18, 0x40, + 0x0c, 0x6c, 0xfe, 0x57, 0x03, 0x26, 0x2d, 0x1a, 0xfa, 0xbd, 0xa0, 0x49, 0xef, 0x53, 0xc7, 0xa5, + 0x01, 0x1b, 0xfe, 0x0f, 0xbc, 0x8e, 0x2b, 0xe6, 0x14, 0x0e, 0xff, 0x7d, 0xaf, 0xa3, 0x4e, 0x61, + 0x4c, 0x27, 0x9f, 0x83, 0xb1, 0x46, 0x6f, 0x1b, 0x51, 0xf9, 0x9c, 0xba, 0x80, 0x3d, 0xd6, 0xdb, + 0xb6, 0x53, 0xe8, 0x12, 0x8d, 0xcc, 0xc2, 0xd8, 0x26, 0x0d, 0xc2, 0x44, 0xe2, 0xa1, 0x64, 0x7f, + 0xc4, 0x41, 0x2a, 0x81, 0xc0, 0x22, 0xf7, 0x12, 0xa9, 0x2b, 0xd6, 0xa4, 0xa9, 0x94, 0xac, 0x4b, + 0x86, 0x4a, 0x5b, 0x40, 0xd4, 0xa1, 0x22, 0xb1, 0xcc, 0x6f, 0xe5, 0xa0, 0xb2, 0xe0, 0x44, 0xce, + 0xb6, 0x13, 0x8a, 0xf6, 0xdc, 0xbc, 0xcd, 0xe4, 0xb8, 0x52, 0x51, 0x94, 0xe3, 0xac, 0xe4, 0x1f, + 0xb9, 0x7a, 0x2f, 0xa7, 0xab, 0x37, 0xce, 0x16, 0x48, 0x51, 0xbd, 0xa4, 0x52, 0xef, 0x9c, 0x5c, + 0xa9, 0x8a, 0xa8, 0x54, 0x51, 0x56, 0x2a, 0xa9, 0x0a, 0x79, 0x07, 0x0a, 0x8d, 0x2e, 0x6d, 0x0a, + 0x21, 0x22, 0x65, 0xbf, 0x5e, 0x39, 0x86, 0xb0, 0x79, 0xbb, 0x5e, 0x16, 0x6c, 0x0a, 0x61, 0x97, + 0x36, 0x2d, 0x24, 0x53, 0x26, 0xcd, 0xb7, 0x47, 0xe1, 0x5c, 0x16, 0x19, 0x79, 0x47, 0x5f, 0x9c, + 0x78, 0xf3, 0x3c, 0x37, 0x70, 0x71, 0x9a, 0x31, 0xf4, 0xe5, 0xe9, 0x06, 0x14, 0xd7, 0xd8, 0x80, + 0x6c, 0xfa, 0x2d, 0xd1, 0x72, 0x4c, 0x2a, 0x16, 0xbb, 0x12, 0x66, 0x58, 0x71, 0x3a, 0x79, 0x0e, + 0xf2, 0x1b, 0xd6, 0x92, 0x68, 0xae, 0xd2, 0xd1, 0x61, 0x35, 0xdf, 0x0b, 0xbc, 0x19, 0xc3, 0x62, + 0x50, 0x32, 0x0b, 0xa3, 0xf3, 0xb5, 0x79, 0x1a, 0x44, 0xd8, 0x4c, 0xe5, 0xfa, 0x45, 0x36, 0x5a, + 0x9a, 0x8e, 0xdd, 0xa4, 0x41, 0xa4, 0x65, 0x2f, 0xd0, 0xc8, 0x67, 0x21, 0x5f, 0xdb, 0x6a, 0x88, + 0x96, 0x01, 0xd1, 0x32, 0xb5, 0xad, 0x46, 0x7d, 0x42, 0x34, 0x44, 0xde, 0x79, 0x1c, 0x32, 0xee, + 0xb5, 0xad, 0x86, 0xda, 0x5b, 0xa3, 0xc7, 0xf4, 0xd6, 0x35, 0x28, 0x32, 0x3d, 0x83, 0x2d, 0xf0, + 0x28, 0x14, 0x4b, 0x5c, 0x7d, 0xda, 0x13, 0x30, 0x2b, 0x4e, 0x25, 0x2f, 0xc6, 0x6a, 0x4b, 0x31, + 0xe1, 0x27, 0xd4, 0x16, 0xa9, 0xac, 0x90, 0x27, 0x30, 0xb1, 0x70, 0xd0, 0x71, 0xda, 0x5e, 0x53, + 0x2c, 0xe1, 0x25, 0x5c, 0xc2, 0x6f, 0x1e, 0xd3, 0x8d, 0x37, 0x35, 0x02, 0xbe, 0xaa, 0x4b, 0xe1, + 0x3b, 0xe3, 0xf2, 0x34, 0x3b, 0xbd, 0xc2, 0xcf, 0x18, 0x96, 0x9e, 0x11, 0x9b, 0x4b, 0x52, 0x44, + 0xa2, 0x5e, 0x95, 0x0c, 0x3b, 0x09, 0x4e, 0xe6, 0x52, 0x20, 0x20, 0xea, 0x5c, 0x8a, 0x17, 0xdd, + 0x77, 0x20, 0x7f, 0x6f, 0x7e, 0x6d, 0x66, 0x1c, 0x79, 0x10, 0xc1, 0xe3, 0xde, 0xfc, 0xda, 0x7c, + 0xcb, 0xef, 0xb9, 0x8d, 0x0f, 0x96, 0xeb, 0x17, 0x05, 0x9b, 0x89, 0xdd, 0x66, 0x57, 0x2b, 0x11, + 0xa3, 0x23, 0x8b, 0x50, 0x94, 0xb5, 0x9c, 0x29, 0x23, 0x8f, 0xe9, 0x54, 0xe5, 0x37, 0x6f, 0xf3, + 0xb9, 0xe6, 0x8a, 0x6f, 0xb5, 0x14, 0x12, 0xe7, 0xf2, 0x16, 0x90, 0xfe, 0x76, 0xc9, 0xd0, 0x24, + 0x3e, 0xab, 0x6a, 0x12, 0xe3, 0x73, 0xe7, 0x45, 0x5e, 0xf3, 0x7e, 0xbb, 0xed, 0x74, 0x5c, 0xa4, + 0xdd, 0x9c, 0x53, 0x15, 0x8c, 0x1a, 0x4c, 0x26, 0x05, 0x59, 0xf6, 0xc2, 0x88, 0xcc, 0x42, 0x49, + 0x42, 0xd8, 0x22, 0x92, 0xcf, 0x2c, 0xb2, 0x95, 0xe0, 0x98, 0x7f, 0x94, 0x03, 0x48, 0x52, 0x9e, + 0x51, 0x39, 0xf3, 0x23, 0x9a, 0x9c, 0x39, 0x9f, 0x1e, 0xa0, 0x03, 0x25, 0x0c, 0x79, 0x0f, 0x46, + 0x99, 0xca, 0xd5, 0x93, 0x2a, 0xe5, 0xc5, 0x34, 0x29, 0x26, 0x6e, 0xde, 0xae, 0x4f, 0x0a, 0xe2, + 0xd1, 0x10, 0x21, 0x96, 0x20, 0x53, 0x44, 0xd4, 0x7f, 0x2f, 0x24, 0x9d, 0x21, 0x84, 0xd3, 0x35, + 0x45, 0xba, 0x18, 0xc9, 0x7c, 0x94, 0xd2, 0x45, 0x91, 0x2d, 0x97, 0xb8, 0x6c, 0xe1, 0x8d, 0x3a, + 0x26, 0x64, 0x4b, 0x5a, 0xb2, 0xf0, 0x06, 0x3c, 0x51, 0xb2, 0x74, 0xd3, 0xd3, 0xb6, 0x80, 0xc3, + 0xe0, 0x5a, 0x66, 0xab, 0x64, 0x4d, 0xd8, 0xab, 0x27, 0x4d, 0xd8, 0xf4, 0x74, 0xbd, 0x3d, 0x48, + 0x96, 0x9d, 0x97, 0xb3, 0xcb, 0x79, 0xac, 0x92, 0xa3, 0x4c, 0x7b, 0x8b, 0x4f, 0xcd, 0xd1, 0x81, + 0x53, 0xf3, 0x7c, 0xe6, 0xd4, 0xe4, 0x13, 0xf3, 0x2d, 0x18, 0xa9, 0xfd, 0x54, 0x2f, 0xa0, 0x42, + 0xf7, 0x2b, 0xcb, 0x3c, 0x19, 0x2c, 0x9e, 0xd3, 0x53, 0x0e, 0xfb, 0x54, 0x75, 0x66, 0x4c, 0x67, + 0x39, 0xaf, 0x2f, 0x37, 0x84, 0x5e, 0x47, 0x52, 0xcd, 0xb2, 0xbe, 0xac, 0x14, 0x3b, 0xd2, 0x6a, + 0xcd, 0xa8, 0xc8, 0x2c, 0xe4, 0x6a, 0x0b, 0xb8, 0x59, 0x1c, 0x9f, 0x2b, 0xc9, 0x6c, 0x17, 0xea, + 0xe7, 0x04, 0x49, 0xd9, 0xd1, 0xf6, 0x0f, 0xb5, 0x85, 0x4f, 0x6e, 0xf2, 0xb7, 0x14, 0x35, 0x41, + 0x0c, 0x53, 0xb6, 0x1d, 0x15, 0x83, 0xc5, 0x48, 0x94, 0x96, 0xbe, 0xc1, 0x12, 0x0f, 0x95, 0xeb, + 0xbc, 0xe3, 0x72, 0x7d, 0x1d, 0x37, 0xae, 0x2c, 0x42, 0xd8, 0x5d, 0xe6, 0x9f, 0x1b, 0x88, 0x4b, + 0x5e, 0x83, 0x51, 0x8b, 0xee, 0x26, 0x6b, 0x2d, 0xee, 0xd9, 0x02, 0x84, 0xa8, 0x19, 0x70, 0x1c, + 0x14, 0xe4, 0xd4, 0x0d, 0xf7, 0xbc, 0x9d, 0x48, 0xe4, 0x12, 0x0b, 0x72, 0x01, 0x56, 0x04, 0xb9, + 0x80, 0x68, 0x82, 0x5c, 0xc0, 0xd8, 0x10, 0xb3, 0x16, 0x1a, 0x42, 0x99, 0x94, 0x25, 0xb5, 0x16, + 0x94, 0xbe, 0x0a, 0x5c, 0xad, 0xaf, 0xac, 0x85, 0x06, 0xb9, 0x03, 0xa5, 0x5a, 0xb3, 0xe9, 0xf7, + 0x94, 0x4d, 0xcf, 0xcc, 0xd1, 0x61, 0xf5, 0x9c, 0xc3, 0x81, 0xfa, 0x16, 0x3d, 0x41, 0x35, 0xeb, + 0x49, 0xa9, 0x19, 0x8f, 0xf9, 0x56, 0x2f, 0x8c, 0x68, 0xb0, 0xb4, 0x20, 0xaa, 0x8c, 0x3c, 0x9a, + 0x1c, 0x98, 0xe2, 0x11, 0xa3, 0x9a, 0xff, 0xd1, 0xc0, 0x12, 0x93, 0x37, 0x01, 0x96, 0x3a, 0x4c, + 0xb1, 0x6d, 0xd2, 0x98, 0x01, 0x6e, 0x9e, 0x3d, 0x01, 0xd5, 0x39, 0x28, 0xc8, 0x7a, 0xd6, 0xb9, + 0xa1, 0xb3, 0x66, 0x59, 0x4a, 0x35, 0x59, 0xd8, 0x51, 0x44, 0x96, 0x81, 0x80, 0xa6, 0xb2, 0x4c, + 0x90, 0xc9, 0x2b, 0x30, 0xb6, 0x54, 0x7b, 0x58, 0xeb, 0x45, 0x7b, 0xd8, 0x5e, 0x45, 0x2e, 0xb0, + 0x3c, 0xa7, 0x6d, 0x3b, 0xbd, 0x68, 0xcf, 0x92, 0x89, 0xe6, 0xcf, 0x19, 0x30, 0xae, 0xcc, 0x55, + 0x56, 0xd4, 0xb5, 0xc0, 0xff, 0x90, 0x36, 0x23, 0xbd, 0x95, 0xba, 0x1c, 0x98, 0x2a, 0x6a, 0x8c, + 0x9a, 0x6a, 0x9d, 0xdc, 0x29, 0x5a, 0xc7, 0x9c, 0x15, 0x22, 0x80, 0xed, 0x01, 0x14, 0x13, 0x07, + 0xee, 0x01, 0x98, 0x8e, 0xa3, 0xee, 0x01, 0x58, 0xba, 0xf9, 0xfb, 0x06, 0x9b, 0xba, 0x64, 0x16, + 0xe0, 0x01, 0x3d, 0x88, 0x9c, 0xed, 0xbb, 0x5e, 0x4b, 0x33, 0x5d, 0xed, 0x23, 0xd4, 0xde, 0xf1, + 0x5a, 0xd4, 0x52, 0x50, 0xc8, 0x6d, 0x28, 0x3e, 0x08, 0xb6, 0xdf, 0x40, 0xf4, 0x5c, 0x2c, 0x82, + 0xcf, 0xee, 0x07, 0xdb, 0x6f, 0x20, 0xb2, 0x3a, 0x5e, 0x25, 0x22, 0x31, 0x61, 0x74, 0xc1, 0x6f, + 0x3b, 0x9e, 0x5c, 0xf6, 0x80, 0xad, 0x1d, 0x2e, 0x42, 0x2c, 0x91, 0xc2, 0x84, 0x7e, 0x63, 0x6d, + 0x45, 0x0c, 0x4c, 0x14, 0xfa, 0x61, 0xb7, 0x63, 0x31, 0x98, 0xf9, 0x1d, 0x03, 0xc6, 0x15, 0x89, + 0x44, 0x3e, 0x2f, 0xb6, 0xf9, 0x06, 0x1a, 0xa9, 0x2e, 0xf4, 0xcb, 0x2c, 0x96, 0xca, 0x97, 0x6b, + 0xb6, 0xfd, 0x17, 0x9b, 0xfe, 0x44, 0x1a, 0xe4, 0x86, 0x91, 0x06, 0x6f, 0x02, 0x70, 0x5d, 0x0e, + 0x9b, 0x53, 0x19, 0x37, 0x8a, 0x51, 0x4f, 0xed, 0x8c, 0x04, 0xd9, 0xfc, 0xf9, 0x1c, 0x14, 0xc5, + 0x5e, 0x65, 0xee, 0x19, 0xd5, 0x21, 0xde, 0xd0, 0x74, 0x88, 0xb3, 0x82, 0x54, 0x51, 0x6e, 0xe7, + 0x4e, 0xd8, 0xa3, 0xbc, 0x09, 0x65, 0xd9, 0x04, 0xa8, 0x8a, 0x5d, 0x87, 0x31, 0xb9, 0xcb, 0xe6, + 0x8a, 0xd8, 0x94, 0xc6, 0x73, 0x73, 0xce, 0x92, 0xe9, 0xe6, 0xb7, 0x46, 0x24, 0x2d, 0xcf, 0x89, + 0x35, 0x61, 0xcd, 0x75, 0x03, 0xb5, 0x09, 0x1d, 0xd7, 0x0d, 0x2c, 0x84, 0xb2, 0x8e, 0x5a, 0xeb, + 0x6d, 0xb7, 0xbc, 0x26, 0xe2, 0x28, 0xb3, 0xa6, 0x8b, 0x50, 0x9b, 0xa1, 0xaa, 0x1d, 0x95, 0x20, + 0x6b, 0x5b, 0x84, 0xfc, 0xb1, 0x5b, 0x84, 0x1f, 0x87, 0xd2, 0x7c, 0xdb, 0xd5, 0x54, 0x08, 0x33, + 0xa3, 0x51, 0x6e, 0xc6, 0x48, 0x5c, 0x79, 0xb8, 0x22, 0xda, 0xe8, 0x5c, 0xb3, 0xed, 0xf6, 0x2b, + 0x0e, 0x09, 0x4b, 0x4d, 0xc7, 0x1f, 0xf9, 0x38, 0x3a, 0xfe, 0x1d, 0x28, 0x6d, 0x84, 0x74, 0xbd, + 0xd7, 0xe9, 0xd0, 0x16, 0xaa, 0x13, 0x45, 0x2e, 0x7b, 0x7a, 0x21, 0xb5, 0x23, 0x84, 0xaa, 0x05, + 0x88, 0x51, 0xd5, 0x61, 0x35, 0x76, 0xcc, 0xb0, 0xfa, 0x3c, 0x14, 0x6a, 0xdd, 0xae, 0xdc, 0xfc, + 0xc4, 0x8b, 0x64, 0xb7, 0x8b, 0x4b, 0xdf, 0xa4, 0xd3, 0xed, 0xea, 0x5b, 0x19, 0xc4, 0x26, 0x14, + 0xc8, 0x83, 0xde, 0x36, 0x0d, 0x3a, 0x34, 0xa2, 0xa1, 0x10, 0xcd, 0xe1, 0x0c, 0x20, 0x8f, 0x19, + 0x69, 0x63, 0x4e, 0x23, 0xe0, 0xc6, 0xf5, 0xe2, 0x7e, 0x6f, 0x9b, 0xda, 0x42, 0xc6, 0xab, 0x6d, + 0x97, 0xc1, 0xf0, 0x72, 0x03, 0x26, 0xf5, 0xf6, 0x7f, 0x0a, 0x8a, 0xc5, 0xfb, 0x85, 0x62, 0xb1, + 0x52, 0x32, 0x7f, 0x31, 0x07, 0xe3, 0xb5, 0x6e, 0xf7, 0x19, 0xb7, 0x40, 0xfc, 0xa8, 0x36, 0xab, + 0x2f, 0x24, 0xbd, 0x77, 0x0a, 0xe3, 0xc3, 0x5f, 0x18, 0x30, 0x95, 0xa2, 0x50, 0x4b, 0x6f, 0x0c, + 0xb9, 0x23, 0xcf, 0x0d, 0xb9, 0x23, 0xcf, 0x0f, 0xde, 0x91, 0xab, 0x73, 0xa6, 0xf0, 0x71, 0xe6, + 0xcc, 0xab, 0x90, 0xaf, 0x75, 0xbb, 0xa2, 0x55, 0xca, 0x49, 0xab, 0x6c, 0xde, 0xe6, 0x0b, 0x91, + 0xd3, 0xed, 0x5a, 0x0c, 0xc3, 0x7c, 0x1d, 0x4a, 0x08, 0x46, 0x89, 0x76, 0x55, 0x4c, 0x05, 0x2e, + 0xce, 0x34, 0x32, 0x3e, 0xec, 0xcd, 0xff, 0x65, 0xc0, 0x08, 0x7e, 0x3f, 0xa3, 0xc3, 0x65, 0x4e, + 0x1b, 0x2e, 0x15, 0x65, 0xb8, 0x0c, 0x33, 0x50, 0xfe, 0x20, 0x8f, 0xad, 0x25, 0x86, 0x88, 0xd8, + 0xd3, 0x19, 0x19, 0x7b, 0xba, 0x8f, 0x21, 0xc0, 0xf7, 0xd3, 0xbb, 0xbb, 0x3c, 0x76, 0xc6, 0x8b, + 0xe9, 0xa2, 0x3e, 0x95, 0x8d, 0xdd, 0x7d, 0x20, 0x4b, 0x9d, 0x90, 0x36, 0x7b, 0x01, 0x6d, 0xec, + 0x7b, 0xdd, 0x4d, 0x1a, 0x78, 0x3b, 0x07, 0x42, 0x33, 0x44, 0x19, 0xeb, 0x89, 0x54, 0x3b, 0xdc, + 0xf7, 0xba, 0xf6, 0x23, 0x4c, 0xb7, 0x32, 0x68, 0xc8, 0x7b, 0x30, 0x66, 0xd1, 0xc7, 0x81, 0x17, + 0x51, 0xd1, 0xb6, 0x93, 0xf1, 0x3e, 0x00, 0xa1, 0x5c, 0x37, 0x09, 0xf8, 0x87, 0xda, 0xff, 0x22, + 0xfd, 0x93, 0xdb, 0x46, 0x7d, 0x7b, 0x04, 0xe7, 0xc2, 0x09, 0x27, 0x65, 0xc7, 0x6c, 0xd0, 0xf5, + 0xce, 0xcc, 0x9f, 0xa6, 0x33, 0x37, 0xa1, 0xcc, 0xb6, 0x6e, 0xa9, 0x9d, 0xfa, 0x95, 0xa4, 0x2f, + 0x6f, 0xaa, 0xc9, 0xc7, 0x1d, 0x92, 0x69, 0x7c, 0x88, 0x9d, 0x1e, 0x24, 0xfc, 0xf0, 0xed, 0x79, + 0x85, 0x71, 0xc6, 0xf0, 0x88, 0x45, 0x47, 0x93, 0x37, 0xd6, 0xa9, 0x07, 0xc6, 0xe8, 0xc7, 0x1b, + 0x18, 0x63, 0x1f, 0x65, 0x60, 0xa4, 0x8f, 0x27, 0x8b, 0xa7, 0x39, 0x9e, 0xbc, 0xfc, 0x1e, 0x4c, + 0xf7, 0xb5, 0xf0, 0x69, 0x8e, 0xf8, 0x3e, 0xb9, 0x61, 0xf9, 0x33, 0x71, 0xbb, 0x90, 0x39, 0xdc, + 0x8e, 0x7a, 0x01, 0x6d, 0x46, 0x28, 0x7a, 0x85, 0xb4, 0x0c, 0x04, 0x2c, 0xb5, 0x5f, 0x46, 0x18, + 0x79, 0x17, 0xc6, 0xf8, 0x11, 0x49, 0x38, 0x93, 0xc3, 0xbe, 0x9f, 0x10, 0x39, 0x72, 0xa8, 0x38, + 0xa7, 0xe6, 0x18, 0x6a, 0xab, 0x0a, 0x22, 0xf3, 0x1e, 0x8c, 0x8a, 0x23, 0x96, 0xe3, 0xe7, 0x45, + 0x15, 0x46, 0x36, 0x93, 0x96, 0x41, 0xb3, 0x38, 0xaf, 0x84, 0xc5, 0xe1, 0xe6, 0x2f, 0x1b, 0x30, + 0xa9, 0xd7, 0x92, 0xdc, 0x84, 0x51, 0x71, 0x06, 0x68, 0xe0, 0x19, 0x20, 0xab, 0xcd, 0x28, 0x3f, + 0xfd, 0xd3, 0xce, 0xfc, 0x04, 0x16, 0x13, 0xfd, 0x82, 0x03, 0xd6, 0x45, 0x88, 0x7e, 0x31, 0x48, + 0x2d, 0x99, 0xc6, 0xb6, 0x5c, 0x16, 0x0d, 0x7b, 0xad, 0x48, 0xdd, 0x72, 0x05, 0x08, 0xb1, 0x44, + 0x8a, 0x79, 0x68, 0x00, 0x34, 0x1a, 0xf7, 0x1f, 0xd0, 0x83, 0x35, 0xc7, 0x0b, 0x70, 0xdb, 0x8a, + 0xb3, 0xf1, 0x81, 0xe8, 0xad, 0xb2, 0xd8, 0xb6, 0xf2, 0x99, 0xbb, 0x4f, 0x0f, 0xb4, 0x6d, 0xab, + 0x44, 0xc5, 0x29, 0x1f, 0x78, 0x8f, 0x9c, 0x88, 0x32, 0xc2, 0x1c, 0x12, 0xf2, 0x29, 0xcf, 0xa1, + 0x29, 0x4a, 0x05, 0x99, 0x7c, 0x0d, 0x26, 0x93, 0x2f, 0x74, 0x3c, 0xc8, 0xe3, 0x9e, 0x4e, 0x8e, + 0x08, 0x3d, 0xb1, 0xfe, 0xc2, 0xd1, 0x61, 0xf5, 0xb2, 0xc2, 0xd5, 0x66, 0x58, 0x0a, 0xeb, 0x14, + 0x33, 0xf3, 0x77, 0x0d, 0x80, 0xf5, 0xe5, 0x86, 0xac, 0xe0, 0x2b, 0x50, 0x88, 0xad, 0x41, 0x65, + 0xbe, 0x37, 0x4e, 0x6d, 0xfe, 0x30, 0x9d, 0xbc, 0x08, 0xf9, 0xa4, 0x26, 0xd3, 0x47, 0x87, 0xd5, + 0x09, 0xbd, 0x06, 0x2c, 0x95, 0xdc, 0x83, 0xb1, 0xa1, 0xca, 0x8c, 0xa3, 0x33, 0xa3, 0xac, 0x92, + 0x1a, 0x7b, 0xe1, 0xfd, 0xad, 0xf5, 0x4f, 0x6f, 0x2f, 0x7c, 0x23, 0x07, 0x53, 0xac, 0x5d, 0x6b, + 0xbd, 0x68, 0xcf, 0x0f, 0xbc, 0xe8, 0xe0, 0x99, 0xdd, 0x15, 0xbf, 0xad, 0x29, 0x44, 0x97, 0xa5, + 0xd8, 0x52, 0xeb, 0x36, 0xd4, 0xe6, 0xf8, 0xcf, 0xc6, 0xe0, 0x6c, 0x06, 0x15, 0x79, 0x4d, 0x78, + 0xdf, 0x24, 0x36, 0x23, 0xf4, 0xae, 0xf9, 0xc1, 0x61, 0xb5, 0x2c, 0xd1, 0xd7, 0x13, 0x6f, 0x9b, + 0x39, 0x18, 0x17, 0x5b, 0x9f, 0x95, 0x44, 0xa3, 0x46, 0xb7, 0x0d, 0x69, 0x13, 0x43, 0xd1, 0xa4, + 0x22, 0x91, 0x1a, 0x94, 0xe7, 0xf7, 0x68, 0x73, 0xdf, 0xeb, 0xec, 0x3e, 0xa0, 0x07, 0x5c, 0x5f, + 0x2a, 0xd7, 0x9f, 0x67, 0x3b, 0xad, 0xa6, 0x80, 0xb3, 0x2e, 0xd5, 0x37, 0x71, 0x1a, 0x09, 0x79, + 0x17, 0xc6, 0x1b, 0xde, 0x6e, 0x47, 0x72, 0x28, 0x20, 0x87, 0x2b, 0x47, 0x87, 0xd5, 0x0b, 0x21, + 0x07, 0xf7, 0x33, 0x50, 0x09, 0xc8, 0x75, 0x18, 0xb1, 0xfc, 0x16, 0xe5, 0xcb, 0xb0, 0xf0, 0xe7, + 0x08, 0x18, 0x40, 0xb5, 0x4d, 0x23, 0x06, 0xb9, 0x0f, 0x63, 0xec, 0xcf, 0x43, 0xa7, 0x3b, 0x33, + 0x8a, 0x72, 0x9b, 0xc4, 0x0a, 0x3e, 0x42, 0xbb, 0x5e, 0x67, 0x57, 0xd5, 0xf1, 0x5b, 0xd4, 0x6e, + 0x3b, 0x5d, 0x6d, 0x5d, 0xe4, 0x88, 0x64, 0x13, 0xc6, 0x13, 0x41, 0x10, 0xce, 0x8c, 0x69, 0x67, + 0x41, 0x49, 0x4a, 0xfd, 0x33, 0x82, 0xd9, 0xc5, 0xa8, 0x15, 0xe2, 0xd8, 0xee, 0x32, 0x7c, 0xbd, + 0x32, 0x0a, 0x23, 0x6d, 0x0f, 0x52, 0x1c, 0xbc, 0x07, 0x31, 0x4e, 0xdc, 0x83, 0xb8, 0x00, 0xa2, + 0x91, 0x6a, 0xad, 0x5d, 0xe1, 0x7e, 0x75, 0x7d, 0xf0, 0x00, 0xbb, 0x99, 0x20, 0xe3, 0x9c, 0xe4, + 0x96, 0x29, 0xd1, 0xfe, 0x4e, 0x6b, 0x57, 0xb3, 0x4c, 0xc5, 0xa8, 0xac, 0x19, 0x12, 0x51, 0x23, + 0x77, 0xe0, 0xb2, 0x19, 0x92, 0x94, 0xa4, 0x19, 0x3e, 0x7c, 0x1c, 0x0d, 0x6a, 0x06, 0x85, 0x11, + 0x59, 0x01, 0xa8, 0x35, 0x23, 0xef, 0x11, 0xc5, 0x21, 0x31, 0xae, 0x35, 0xc4, 0x7c, 0xed, 0x01, + 0x3d, 0x68, 0xd0, 0x28, 0xf6, 0x6c, 0x38, 0xef, 0x20, 0x6a, 0x6a, 0x98, 0x58, 0x0a, 0x07, 0xd2, + 0x85, 0xf3, 0x35, 0xd7, 0xf5, 0xb8, 0x4b, 0xde, 0x7a, 0xc0, 0xc6, 0xaf, 0x8b, 0xac, 0xcb, 0xd9, + 0xac, 0xaf, 0x0b, 0xd6, 0x9f, 0x71, 0x62, 0x2a, 0x3b, 0xe2, 0x64, 0xe9, 0x6c, 0xb2, 0x19, 0x9b, + 0xab, 0x30, 0xa9, 0x37, 0xa9, 0xee, 0x8c, 0x56, 0x86, 0xa2, 0xd5, 0xa8, 0xd9, 0x8d, 0xfb, 0xb5, + 0x5b, 0x15, 0x83, 0x54, 0xa0, 0x2c, 0xbe, 0xe6, 0xec, 0xb9, 0x37, 0xee, 0x54, 0x72, 0x1a, 0xe4, + 0x8d, 0x5b, 0x73, 0x95, 0xbc, 0xf9, 0x07, 0x06, 0x14, 0x65, 0xf9, 0xc8, 0x1d, 0xc8, 0x37, 0x1a, + 0xf7, 0x53, 0x47, 0x90, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53, 0x17, 0x99, 0x46, 0xe3, + 0x3e, 0xa3, 0x5b, 0x5f, 0x6e, 0x08, 0xa5, 0x25, 0x63, 0xb8, 0x4e, 0x0f, 0x38, 0x97, 0xb9, 0x03, + 0xf9, 0xf7, 0xb7, 0xd6, 0xc5, 0x6e, 0x28, 0xa3, 0x7f, 0x91, 0xee, 0xc3, 0xc7, 0xea, 0xd2, 0xc7, + 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x95, 0x88, 0xb6, 0x1f, 0xbb, 0x69, 0x09, 0x25, 0x82, + 0x41, 0x2c, 0x91, 0xc2, 0x74, 0x9e, 0x65, 0xbf, 0xe9, 0xb4, 0x84, 0x36, 0x82, 0x3a, 0x4f, 0x8b, + 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xd0, 0x80, 0xca, 0x5a, 0xe0, 0x3f, 0xf2, 0x98, 0x04, 0x5e, 0xf7, + 0xf7, 0x69, 0x67, 0xf3, 0x16, 0x79, 0x5d, 0x0a, 0x01, 0xae, 0xc2, 0x5d, 0x64, 0x54, 0x28, 0x04, + 0x7e, 0x70, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x4b, 0x97, 0x82, 0x40, 0xf1, 0x76, 0xcb, + 0x0d, 0xef, 0x41, 0x73, 0x82, 0xb7, 0x5b, 0x15, 0x46, 0xb0, 0x38, 0x8a, 0x13, 0xc3, 0x48, 0xc4, + 0x00, 0x16, 0x87, 0x2b, 0x02, 0xfb, 0x5b, 0xb9, 0xbe, 0x3a, 0xcc, 0x7d, 0xaa, 0xbc, 0x50, 0xf4, + 0xca, 0x0d, 0xb5, 0x88, 0x7d, 0x19, 0xce, 0xa5, 0x9b, 0x04, 0xed, 0x22, 0x35, 0x98, 0xd2, 0xe1, + 0xd2, 0x44, 0x72, 0x31, 0x33, 0xaf, 0xcd, 0x39, 0x2b, 0x8d, 0x6f, 0x7e, 0xcf, 0x80, 0x12, 0xfe, + 0xb5, 0x7a, 0x2d, 0xca, 0x34, 0x9b, 0xda, 0x56, 0x43, 0x1c, 0x48, 0xa9, 0x87, 0x46, 0xce, 0xe3, + 0xd0, 0x16, 0xa7, 0x57, 0x9a, 0x1c, 0x89, 0x91, 0x05, 0x29, 0x3f, 0x7e, 0x0b, 0xc5, 0x08, 0x8d, + 0x49, 0xf9, 0x39, 0x5d, 0x98, 0x22, 0x15, 0xc8, 0xac, 0xff, 0xd8, 0x97, 0xdf, 0x92, 0xa6, 0x61, + 0xec, 0x3f, 0xa4, 0xf3, 0xb5, 0x63, 0x0e, 0x89, 0x46, 0x5e, 0x87, 0x51, 0x96, 0xb5, 0x25, 0x0f, + 0x31, 0x70, 0x57, 0x81, 0x65, 0x0c, 0xb4, 0xd3, 0x40, 0x8e, 0x64, 0xfe, 0xd3, 0x5c, 0xba, 0x01, + 0x85, 0x16, 0x70, 0xca, 0xb9, 0xf1, 0x16, 0x8c, 0xd4, 0x5a, 0x2d, 0xff, 0xb1, 0x90, 0x12, 0xd2, + 0x4c, 0x13, 0xb7, 0x1f, 0x5f, 0x61, 0x1d, 0x86, 0xa2, 0x9d, 0xfe, 0x32, 0x00, 0x99, 0x87, 0x52, + 0x6d, 0xab, 0xb1, 0xb4, 0xb4, 0xb0, 0xbe, 0xbe, 0x2c, 0x9c, 0x8c, 0x5f, 0x96, 0xed, 0xe3, 0x79, + 0xae, 0x1d, 0x45, 0xad, 0x01, 0x3e, 0x88, 0x09, 0x1d, 0x79, 0x07, 0xe0, 0x7d, 0xdf, 0xeb, 0x3c, + 0xa4, 0xd1, 0x9e, 0xef, 0x8a, 0xca, 0x33, 0x95, 0x62, 0xfc, 0x43, 0xdf, 0xeb, 0xd8, 0x6d, 0x04, + 0xb3, 0xb2, 0x27, 0x48, 0x96, 0xf2, 0x9f, 0xb5, 0x74, 0xdd, 0x8f, 0x50, 0x87, 0x19, 0x49, 0x5a, + 0x7a, 0xdb, 0x8f, 0xd2, 0x67, 0x2c, 0x12, 0xcd, 0xfc, 0x95, 0x1c, 0x4c, 0xf2, 0x9d, 0x2a, 0x1f, + 0x30, 0xcf, 0xec, 0x64, 0x7c, 0x4b, 0x9b, 0x8c, 0x97, 0xe4, 0xc2, 0xa0, 0x54, 0x6d, 0xa8, 0xa9, + 0xb8, 0x07, 0xa4, 0x9f, 0x86, 0x58, 0xd2, 0x9e, 0x32, 0xcc, 0x2c, 0xbc, 0x95, 0x9c, 0x1d, 0x87, + 0x48, 0x64, 0xa3, 0x28, 0x0c, 0x2d, 0x8d, 0x87, 0xf9, 0xcb, 0x39, 0x98, 0x50, 0xf4, 0xc9, 0x67, + 0xb6, 0xe1, 0xbf, 0xa0, 0x35, 0xbc, 0x3c, 0x83, 0x50, 0x6a, 0x36, 0x54, 0xbb, 0xf7, 0x60, 0xba, + 0x8f, 0x24, 0xad, 0x96, 0x1b, 0xc3, 0xa8, 0xe5, 0xaf, 0xf5, 0x1f, 0x6e, 0x73, 0x87, 0xe4, 0xf8, + 0x70, 0x5b, 0x3d, 0x4d, 0xff, 0x46, 0x0e, 0xce, 0x89, 0xaf, 0x5a, 0xcf, 0xf5, 0xa2, 0x79, 0xbf, + 0xb3, 0xe3, 0xed, 0x3e, 0xb3, 0x7d, 0x51, 0xd3, 0xfa, 0xa2, 0xaa, 0xf7, 0x85, 0x52, 0xc1, 0xc1, + 0x5d, 0x62, 0xfe, 0x8b, 0x22, 0xcc, 0x0c, 0x22, 0x60, 0xdb, 0x7e, 0x65, 0x57, 0x85, 0xdb, 0xfe, + 0xd4, 0x8e, 0x95, 0xef, 0xa7, 0x12, 0x67, 0x8e, 0xdc, 0x10, 0xce, 0x1c, 0xcb, 0x50, 0xc1, 0xac, + 0x1a, 0x34, 0x64, 0x8d, 0x10, 0x26, 0xde, 0x90, 0x57, 0x8f, 0x0e, 0xab, 0x57, 0x1c, 0x96, 0x66, + 0x87, 0x22, 0xd1, 0xee, 0x05, 0x9e, 0xc2, 0xa3, 0x8f, 0x92, 0xfc, 0xae, 0x01, 0x93, 0x08, 0x5c, + 0x7c, 0x44, 0x3b, 0x11, 0x32, 0x2b, 0x88, 0x43, 0x9a, 0xf8, 0xd2, 0x49, 0x23, 0x0a, 0xbc, 0xce, + 0x2e, 0x1a, 0x92, 0xc2, 0xfa, 0x36, 0x6b, 0x85, 0x3f, 0x3d, 0xac, 0xbe, 0xfd, 0x51, 0x2e, 0xb2, + 0x08, 0x56, 0x21, 0xdb, 0xc8, 0xf3, 0x82, 0x52, 0xcc, 0x36, 0x55, 0xcc, 0x54, 0x89, 0xc8, 0x8f, + 0xc1, 0xc5, 0xc5, 0x8e, 0xb3, 0xdd, 0xa2, 0xf3, 0x7e, 0x27, 0xf2, 0x3a, 0x3d, 0xbf, 0x17, 0xd6, + 0x9d, 0xe6, 0x7e, 0xaf, 0x1b, 0x0a, 0x63, 0x27, 0xd6, 0xbc, 0x19, 0x27, 0xda, 0xdb, 0x3c, 0x55, + 0x61, 0x39, 0x88, 0x01, 0xb9, 0x0f, 0xd3, 0x3c, 0xa9, 0xd6, 0x8b, 0xfc, 0x46, 0xd3, 0x69, 0x79, + 0x9d, 0x5d, 0xb4, 0x81, 0x16, 0xeb, 0x97, 0xd9, 0xde, 0xd2, 0xe9, 0x45, 0xbe, 0x1d, 0x72, 0xb8, + 0xc2, 0xaf, 0x9f, 0x88, 0x2c, 0xc1, 0x94, 0x45, 0x1d, 0xf7, 0xa1, 0xf3, 0x64, 0xde, 0xe9, 0x3a, + 0x4d, 0x2f, 0x3a, 0xc0, 0x9d, 0x59, 0xbe, 0x5e, 0x3d, 0x3a, 0xac, 0x3e, 0x17, 0x50, 0xc7, 0xb5, + 0xdb, 0xce, 0x13, 0xbb, 0x29, 0x12, 0x15, 0x66, 0x69, 0xba, 0x98, 0x95, 0xd7, 0x89, 0x59, 0x95, + 0xd2, 0xac, 0xbc, 0xce, 0x60, 0x56, 0x09, 0x9d, 0x64, 0xb5, 0xee, 0x04, 0xbb, 0x34, 0xe2, 0x46, + 0x42, 0xb8, 0x6a, 0x5c, 0x33, 0x14, 0x56, 0x11, 0xa6, 0xd9, 0x68, 0x30, 0x4c, 0xb3, 0x52, 0xe8, + 0xd8, 0xc8, 0xdb, 0x0a, 0xbc, 0x88, 0xaa, 0x35, 0x1c, 0xc7, 0x62, 0x61, 0xfb, 0xa3, 0x99, 0x74, + 0x50, 0x15, 0xfb, 0x28, 0x13, 0x6e, 0x4a, 0x25, 0xcb, 0x7d, 0xdc, 0xb2, 0x6b, 0xd9, 0x47, 0x19, + 0x73, 0x53, 0xeb, 0x39, 0x81, 0xf5, 0x54, 0xb8, 0x0d, 0xa8, 0x68, 0x1f, 0x25, 0x59, 0x61, 0x8d, + 0x16, 0xd1, 0x0e, 0x1b, 0xd1, 0xc2, 0x48, 0x3a, 0x89, 0x45, 0x7b, 0x49, 0xec, 0xa9, 0x2b, 0x81, + 0x4c, 0xb6, 0x33, 0x4c, 0xa6, 0x69, 0xe2, 0xf7, 0x0b, 0xc5, 0x91, 0xca, 0xa8, 0x55, 0xe1, 0x43, + 0x3e, 0x62, 0x03, 0x07, 0x65, 0xb1, 0xf9, 0x9b, 0x39, 0xb8, 0x24, 0xc5, 0x31, 0x8d, 0x1e, 0xfb, + 0xc1, 0xbe, 0xd7, 0xd9, 0x7d, 0xc6, 0xa5, 0xea, 0x5d, 0x4d, 0xaa, 0xbe, 0x94, 0x5a, 0xe1, 0x52, + 0xb5, 0x3c, 0x46, 0xb4, 0xfe, 0xc9, 0x08, 0x3c, 0x7f, 0x2c, 0x15, 0xf9, 0x80, 0xad, 0x82, 0x1e, + 0xed, 0x44, 0x4b, 0x6e, 0x8b, 0xb2, 0x6d, 0x98, 0xdf, 0x8b, 0x84, 0x31, 0xfb, 0xc5, 0xa3, 0xc3, + 0xea, 0x59, 0x7e, 0x17, 0xc3, 0xf6, 0xdc, 0x16, 0xb5, 0x23, 0x9e, 0xac, 0x75, 0x53, 0x3f, 0x35, + 0x63, 0x19, 0xdf, 0x0c, 0x5b, 0xea, 0x44, 0x34, 0x78, 0xe4, 0x70, 0x97, 0x74, 0xc1, 0x72, 0x9f, + 0xd2, 0xae, 0xed, 0xb0, 0x54, 0xdb, 0x13, 0xc9, 0x3a, 0xcb, 0x3e, 0x6a, 0x72, 0x57, 0x61, 0x39, + 0xcf, 0x36, 0x07, 0x0f, 0x9d, 0x27, 0x42, 0xe3, 0x45, 0xfb, 0xaa, 0xc2, 0x92, 0xfb, 0xc3, 0xb5, + 0x9d, 0x27, 0x56, 0x3f, 0x09, 0xf9, 0x1a, 0x9c, 0x17, 0x82, 0x9b, 0x09, 0xb1, 0xc0, 0x6f, 0xc9, + 0x1a, 0x17, 0x90, 0xd7, 0xab, 0x47, 0x87, 0xd5, 0x8b, 0x42, 0xec, 0xdb, 0x4d, 0x8e, 0x91, 0x59, + 0xeb, 0x6c, 0x2e, 0x64, 0x9d, 0x2d, 0x64, 0xa9, 0xe6, 0x78, 0x48, 0xc3, 0xd0, 0xd9, 0x95, 0xda, + 0x31, 0x3f, 0x51, 0x52, 0x1a, 0xd3, 0x6e, 0xf3, 0x74, 0x6b, 0x20, 0x25, 0xb9, 0x0f, 0x93, 0x5b, + 0x74, 0x5b, 0xed, 0x9f, 0xd1, 0x78, 0x8a, 0x57, 0x1e, 0xd3, 0xed, 0xc1, 0x9d, 0x93, 0xa2, 0x23, + 0x1e, 0x4c, 0xaf, 0x05, 0xfe, 0x93, 0x03, 0xb6, 0xd5, 0xa3, 0x1d, 0x1a, 0xa0, 0x23, 0xd6, 0x18, + 0x9a, 0xab, 0x66, 0x12, 0xcd, 0x52, 0x4f, 0xaf, 0x7f, 0xe6, 0xe8, 0xb0, 0xfa, 0x7c, 0x97, 0x81, + 0xed, 0x96, 0x80, 0xdb, 0xa9, 0x8b, 0x59, 0xfd, 0x5c, 0xc9, 0x4f, 0xc0, 0x94, 0xe5, 0xf7, 0x22, + 0xaf, 0xb3, 0xdb, 0x88, 0x02, 0x27, 0xa2, 0xbb, 0x5c, 0x90, 0x27, 0x1e, 0x5f, 0xa9, 0x54, 0x6e, + 0x98, 0x0e, 0x38, 0xd0, 0x0e, 0x05, 0x54, 0x93, 0xa4, 0x3a, 0x81, 0xf9, 0xeb, 0x39, 0x98, 0x11, + 0xdd, 0x60, 0xd1, 0xa6, 0x1f, 0xb8, 0xcf, 0xfe, 0xb4, 0x5f, 0xd4, 0xa6, 0xfd, 0x8b, 0xb1, 0x8f, + 0x52, 0x56, 0x25, 0x8f, 0x99, 0xf5, 0xff, 0xd0, 0x80, 0x2b, 0xc7, 0x11, 0xb1, 0xd6, 0x89, 0x7d, + 0xf0, 0x4a, 0x7d, 0xbe, 0x76, 0x5d, 0x38, 0x8b, 0xfd, 0x89, 0x86, 0xe3, 0xf0, 0xbe, 0x1f, 0x46, + 0x68, 0xbd, 0xcb, 0x69, 0x8e, 0x04, 0x75, 0xdf, 0x6f, 0xa1, 0x9c, 0xaf, 0xbf, 0xc6, 0xc4, 0xf9, + 0x9f, 0x1e, 0x56, 0x81, 0x81, 0x56, 0xf1, 0x30, 0x92, 0xad, 0xf9, 0x7c, 0xc4, 0xa0, 0x5d, 0x3a, + 0xb4, 0xd1, 0xfb, 0x63, 0x9f, 0x1e, 0x84, 0x56, 0x16, 0x6b, 0xb4, 0xd0, 0xd4, 0x7a, 0xd1, 0xde, + 0x5a, 0x40, 0x77, 0x68, 0x40, 0x3b, 0x4d, 0xfa, 0x29, 0xb3, 0xd0, 0xe8, 0x95, 0x1b, 0x6a, 0x7b, + 0xf2, 0x7f, 0x46, 0xe1, 0x5c, 0x16, 0x19, 0x6b, 0x17, 0x45, 0x23, 0x4e, 0xdf, 0xe2, 0xfd, 0xff, + 0x0d, 0x28, 0x37, 0x68, 0xd3, 0xef, 0xb8, 0x77, 0x9d, 0x66, 0xe4, 0x4b, 0x97, 0x0c, 0x9b, 0x4b, + 0x36, 0x06, 0xb7, 0x77, 0x30, 0x41, 0xb3, 0x0c, 0x7c, 0x71, 0x38, 0x45, 0xb4, 0xe9, 0xa3, 0xd3, + 0x6a, 0xc4, 0xc6, 0x64, 0x92, 0x05, 0x9e, 0x6a, 0x68, 0x99, 0x92, 0x3a, 0x4c, 0xcc, 0xfb, 0x9d, + 0x0e, 0x65, 0x1f, 0x8a, 0x0b, 0xe6, 0x95, 0xa3, 0xc3, 0xea, 0x4c, 0x53, 0x26, 0xa4, 0x2d, 0x04, + 0x3a, 0x09, 0xb9, 0x0d, 0xf9, 0x8d, 0xb9, 0xbb, 0xa2, 0x0f, 0xa4, 0xb3, 0xda, 0xc6, 0xdc, 0x5d, + 0xdc, 0xeb, 0x32, 0xfd, 0x61, 0xa2, 0x37, 0xb7, 0xa3, 0xda, 0x40, 0x37, 0xe6, 0xee, 0x92, 0x55, + 0x98, 0xb6, 0xe8, 0x4f, 0xf6, 0xbc, 0x80, 0x8a, 0x09, 0xf0, 0xf0, 0x6e, 0x0d, 0xfb, 0xa2, 0xc8, + 0xe5, 0x58, 0xc0, 0x13, 0xa5, 0x6e, 0x6f, 0xb7, 0x77, 0xd4, 0x9b, 0x6b, 0xfd, 0xb4, 0xe4, 0x67, + 0xe1, 0xfc, 0x82, 0x17, 0x8a, 0x32, 0x73, 0xe3, 0xa3, 0x8b, 0xe7, 0x90, 0xa3, 0x03, 0xa6, 0xc3, + 0x8f, 0x64, 0x4e, 0x87, 0xcf, 0xb8, 0x31, 0x13, 0x9b, 0x5b, 0x36, 0xdd, 0xb4, 0xef, 0x6a, 0x76, + 0x3e, 0xe4, 0x43, 0x98, 0x44, 0x6b, 0x0f, 0xda, 0x63, 0xd1, 0x9d, 0x79, 0x6c, 0x40, 0xce, 0x9f, + 0xcb, 0xcc, 0xf9, 0x32, 0x1a, 0x8f, 0x6c, 0xb4, 0xea, 0xa2, 0xeb, 0xb3, 0xb6, 0x47, 0xd0, 0x38, + 0x93, 0xf7, 0x61, 0x4a, 0x2c, 0x3a, 0xab, 0x3b, 0xeb, 0x7b, 0x74, 0xc1, 0x39, 0x10, 0x4e, 0x08, + 0xa8, 0xff, 0x89, 0x95, 0xca, 0xf6, 0x77, 0xec, 0x68, 0x8f, 0xda, 0xae, 0xa3, 0x89, 0xe7, 0x14, + 0x21, 0xf9, 0x69, 0x18, 0x5f, 0xf6, 0xf1, 0xe0, 0x09, 0x45, 0x4d, 0x09, 0xf9, 0x7c, 0x19, 0x6f, + 0xae, 0x72, 0x70, 0x6a, 0x11, 0xf9, 0xc1, 0x61, 0xf5, 0xad, 0xd3, 0x8e, 0x42, 0x25, 0x03, 0x4b, + 0xcd, 0x8d, 0xcc, 0x43, 0x71, 0x8b, 0x6e, 0xb3, 0xda, 0xa6, 0x6f, 0x5d, 0x49, 0x30, 0x97, 0x17, + 0x8f, 0xc5, 0x97, 0x7a, 0xaa, 0x23, 0x31, 0xcc, 0x7f, 0x66, 0xe0, 0x08, 0x24, 0x37, 0xd0, 0x11, + 0x2c, 0xf6, 0x06, 0xc7, 0x9d, 0xa5, 0xd3, 0xed, 0xea, 0xfe, 0xdc, 0x1c, 0x85, 0x6d, 0x43, 0xef, + 0x3a, 0x4d, 0x1a, 0x49, 0x7b, 0x25, 0x22, 0xef, 0x20, 0x44, 0xdd, 0x86, 0x72, 0x1c, 0xf2, 0x25, + 0x38, 0xb7, 0x40, 0x1f, 0x79, 0x4d, 0x5a, 0x8b, 0x22, 0x1a, 0xf2, 0xda, 0xce, 0xd7, 0xf8, 0xc1, + 0x5e, 0xa9, 0xfe, 0xd2, 0xd1, 0x61, 0xf5, 0xaa, 0x8b, 0xe9, 0xb6, 0x93, 0x20, 0xd8, 0x4d, 0x47, + 0xe5, 0x95, 0xc9, 0xc1, 0xfc, 0x1f, 0x46, 0xd2, 0x02, 0xe4, 0x55, 0x28, 0x58, 0x6b, 0x71, 0xf9, + 0xf9, 0x99, 0x5d, 0xaa, 0xf8, 0x88, 0x40, 0xbe, 0x02, 0xe7, 0x15, 0x3e, 0x38, 0x38, 0xa8, 0xcb, + 0x0a, 0xc4, 0x2b, 0xf3, 0x32, 0x1e, 0xd2, 0x28, 0x25, 0x71, 0x38, 0x46, 0xaa, 0x44, 0xd9, 0x3c, + 0x58, 0x65, 0x95, 0x84, 0x05, 0xda, 0xf1, 0x38, 0x6f, 0xa5, 0xb2, 0x2a, 0x6f, 0x17, 0x11, 0xd2, + 0x95, 0xcd, 0xe2, 0xf0, 0x7e, 0xa1, 0x58, 0xa8, 0x8c, 0x98, 0x7f, 0x61, 0x28, 0x21, 0x00, 0x9e, + 0xd1, 0xd5, 0xe3, 0x8e, 0xb6, 0x7a, 0x9c, 0x13, 0xa4, 0x71, 0xad, 0x58, 0x5a, 0xe6, 0x8a, 0x3f, + 0x05, 0x13, 0x1a, 0x12, 0xba, 0xbc, 0x6e, 0x84, 0x34, 0xe0, 0xf6, 0xc1, 0x4f, 0x97, 0xcb, 0x6b, + 0x5c, 0xaf, 0xa1, 0x3c, 0x19, 0xff, 0xcc, 0x80, 0xa9, 0x14, 0x05, 0x6b, 0x0d, 0x06, 0x52, 0x5b, + 0xa3, 0x17, 0xd2, 0xc0, 0x42, 0x28, 0x77, 0x90, 0x5b, 0xd6, 0x1d, 0xe4, 0x5a, 0x16, 0x83, 0x91, + 0x2f, 0xc2, 0xc8, 0x06, 0x6a, 0xf3, 0xba, 0x8f, 0x45, 0xcc, 0x1f, 0x13, 0xf9, 0x0c, 0xeb, 0xb1, + 0xbf, 0xaa, 0x80, 0xc0, 0x34, 0xd2, 0x80, 0xb1, 0xf9, 0x80, 0xe2, 0x65, 0xff, 0xc2, 0xf0, 0x87, + 0x61, 0x4d, 0x4e, 0x92, 0x3e, 0x0c, 0x13, 0x9c, 0xcc, 0x5f, 0xcb, 0x01, 0x49, 0xea, 0x48, 0x9b, + 0x01, 0x8d, 0xc2, 0x67, 0xb6, 0xd3, 0xdf, 0xd3, 0x3a, 0xfd, 0xf9, 0xbe, 0x4e, 0xe7, 0xd5, 0x1b, + 0xaa, 0xef, 0xff, 0xd0, 0x80, 0x0b, 0xd9, 0x84, 0xe4, 0x45, 0x18, 0x5d, 0x5d, 0x5f, 0x93, 0x6e, + 0x3a, 0xa2, 0x2a, 0x7e, 0x17, 0xb5, 0x54, 0x4b, 0x24, 0x91, 0xd7, 0x61, 0xf4, 0x03, 0x6b, 0x9e, + 0x2d, 0x5f, 0xca, 0xad, 0x93, 0x9f, 0x0c, 0xec, 0xa6, 0xbe, 0xfd, 0x11, 0x48, 0x6a, 0xdf, 0xe6, + 0x9f, 0x5a, 0xdf, 0x7e, 0x23, 0x07, 0x53, 0xb5, 0x66, 0x93, 0x86, 0x21, 0x53, 0x4e, 0x68, 0x18, + 0x3d, 0xb3, 0x1d, 0x9b, 0xed, 0x80, 0xa3, 0xd5, 0x6d, 0xa8, 0x5e, 0xfd, 0x23, 0x03, 0xce, 0x4b, + 0xaa, 0x47, 0x1e, 0x7d, 0xbc, 0xbe, 0x17, 0xd0, 0x70, 0xcf, 0x6f, 0xb9, 0xc3, 0xde, 0x9f, 0xc2, + 0x55, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x8d, 0xc5, 0x3b, 0x08, 0xd1, 0x56, 0x69, 0x84, 0x90, 0x59, + 0x18, 0xab, 0x75, 0xbb, 0x81, 0xff, 0x88, 0x4f, 0xfb, 0x09, 0x71, 0x36, 0xc8, 0x41, 0xda, 0x59, + 0x22, 0x07, 0xb1, 0x62, 0x2c, 0xd0, 0x0e, 0xf7, 0x2e, 0x9e, 0xe0, 0xc5, 0x70, 0x69, 0x47, 0xd5, + 0x96, 0x30, 0xdd, 0xfc, 0x7a, 0x01, 0xca, 0x6a, 0x45, 0x88, 0x09, 0xa3, 0xdc, 0x55, 0x44, 0x3d, + 0xb2, 0x77, 0x10, 0x62, 0x89, 0x94, 0xc4, 0x03, 0x27, 0x77, 0xa2, 0x07, 0xce, 0x16, 0x4c, 0xac, + 0x05, 0x7e, 0xd7, 0x0f, 0xa9, 0xcb, 0xe3, 0xb5, 0x70, 0xa9, 0x75, 0x36, 0x76, 0x4b, 0xe5, 0x6d, + 0xce, 0x92, 0xb8, 0x6a, 0xde, 0x15, 0xd8, 0x76, 0x3a, 0x9a, 0x8b, 0xce, 0x87, 0x1b, 0xdb, 0x9d, + 0x50, 0xb8, 0xee, 0xc7, 0xc6, 0x76, 0x06, 0xd1, 0x8d, 0xed, 0x0c, 0xa2, 0x4e, 0x8b, 0x91, 0xa7, + 0x35, 0x2d, 0xc8, 0xaf, 0x19, 0x30, 0x5e, 0xeb, 0x74, 0x84, 0x07, 0x8e, 0xbc, 0xf4, 0x7c, 0x3e, + 0x31, 0xb8, 0x73, 0x17, 0x4d, 0x6e, 0x6f, 0xff, 0xaa, 0xb0, 0xb7, 0xbf, 0xf5, 0x91, 0xec, 0xed, + 0xeb, 0x81, 0xe3, 0x45, 0x21, 0x1e, 0xac, 0x26, 0x19, 0xaa, 0x6e, 0xb8, 0x4a, 0x39, 0xc8, 0x5b, + 0x50, 0x89, 0xc7, 0xe3, 0x52, 0xc7, 0xa5, 0x4f, 0x28, 0x77, 0x58, 0x9a, 0xe0, 0x37, 0xf3, 0xb4, + 0x83, 0x84, 0x34, 0xa2, 0xf9, 0x0d, 0x03, 0x2e, 0xa8, 0x03, 0xa2, 0xd1, 0xdb, 0x6e, 0x7b, 0xb8, + 0x15, 0x21, 0x37, 0xa1, 0x24, 0xfa, 0x2b, 0x56, 0xe4, 0xfa, 0x83, 0xfc, 0x24, 0x28, 0x64, 0x91, + 0x75, 0x11, 0xe3, 0x21, 0xf6, 0xed, 0x67, 0x53, 0xd3, 0x8d, 0x25, 0xd5, 0x67, 0x44, 0x63, 0x57, + 0x02, 0xfc, 0xd6, 0xfb, 0x8e, 0x41, 0xcc, 0x77, 0x61, 0x5a, 0x2f, 0x65, 0x83, 0xe2, 0x75, 0x30, + 0x59, 0x35, 0x23, 0xbb, 0x6a, 0x32, 0xdd, 0xdc, 0x02, 0xd2, 0x47, 0x1f, 0xe2, 0xa1, 0x11, 0x8d, + 0xe4, 0xa1, 0xa6, 0x34, 0x3d, 0xf5, 0x21, 0xc6, 0xe1, 0xae, 0xc6, 0xd5, 0xe6, 0x46, 0x52, 0xf3, + 0x2f, 0x4b, 0x70, 0x36, 0x43, 0x74, 0x9c, 0xb0, 0xb4, 0x57, 0xf5, 0xc9, 0x53, 0x8a, 0x4f, 0xe7, + 0xe5, 0x94, 0x79, 0x57, 0x86, 0x36, 0x3a, 0x66, 0xaa, 0x1c, 0x17, 0xef, 0xe8, 0x93, 0x58, 0xde, + 0x55, 0x07, 0x9a, 0x91, 0xa7, 0xe6, 0x40, 0x53, 0x87, 0x09, 0x51, 0x2b, 0x31, 0x95, 0x47, 0x93, + 0x2d, 0x7a, 0xc0, 0x13, 0xec, 0xbe, 0x29, 0xad, 0x93, 0x70, 0x1e, 0xa1, 0xdf, 0x7a, 0x44, 0x05, + 0x8f, 0x31, 0x95, 0x07, 0x26, 0x64, 0xf2, 0x50, 0x48, 0xc8, 0x3f, 0x30, 0x80, 0x08, 0x88, 0x3a, + 0x9f, 0x8b, 0xc7, 0xcd, 0x67, 0xf7, 0xe9, 0xcc, 0xe7, 0xe7, 0x65, 0x19, 0xb3, 0xe7, 0x75, 0x46, + 0xb1, 0xc8, 0xdf, 0x33, 0x60, 0x9a, 0x7b, 0x71, 0xa8, 0x85, 0x2d, 0x1d, 0x57, 0xd8, 0xe6, 0xd3, + 0x29, 0xec, 0x95, 0x10, 0xb3, 0x1d, 0x50, 0xd6, 0xfe, 0x42, 0x91, 0x1f, 0x03, 0x88, 0x67, 0x94, + 0xf4, 0x16, 0xbc, 0x92, 0x21, 0x05, 0x62, 0xa4, 0xe4, 0xc2, 0x63, 0x14, 0xd3, 0xa9, 0xfe, 0x35, + 0x09, 0x37, 0xf2, 0xb3, 0x70, 0x8e, 0xcd, 0x97, 0x18, 0x22, 0x7c, 0xce, 0x66, 0xc6, 0x31, 0x97, + 0xcf, 0x0f, 0x5e, 0xda, 0x6f, 0x66, 0x91, 0xf1, 0x3b, 0x1b, 0xc9, 0xf5, 0xf7, 0xa8, 0xad, 0x6e, + 0xf9, 0xb2, 0x28, 0xd0, 0xb9, 0x14, 0x4b, 0x1f, 0xce, 0x94, 0x31, 0xcf, 0x4c, 0xf9, 0x76, 0x49, + 0xce, 0x05, 0x2e, 0xdf, 0x42, 0xfd, 0xd2, 0x05, 0x82, 0xc8, 0x07, 0x40, 0x1a, 0xbd, 0xdd, 0x5d, + 0x1a, 0x46, 0xd4, 0xe5, 0x30, 0x1a, 0x84, 0x33, 0x13, 0x28, 0x1f, 0xd0, 0x64, 0x14, 0xca, 0x54, + 0x3b, 0x90, 0xc9, 0xea, 0x20, 0xe9, 0x27, 0xbe, 0xbc, 0x0d, 0x97, 0x06, 0x56, 0x33, 0xe3, 0x42, + 0xc5, 0xac, 0x7e, 0xa1, 0xe2, 0xd2, 0x20, 0x71, 0x18, 0xaa, 0x97, 0x2a, 0x7e, 0xdb, 0x48, 0xc9, + 0x3f, 0xa1, 0xac, 0xf0, 0x28, 0x70, 0x83, 0x16, 0x88, 0x1c, 0x5e, 0x8c, 0xe7, 0x12, 0x32, 0x97, + 0x28, 0x49, 0x4c, 0x42, 0xaa, 0x12, 0x16, 0x65, 0xe5, 0xc7, 0x14, 0x85, 0xe6, 0x3f, 0x36, 0x80, + 0xf0, 0x12, 0xce, 0x3b, 0x5d, 0x67, 0xdb, 0x6b, 0x79, 0x91, 0x47, 0x43, 0xf2, 0x00, 0x2a, 0x82, + 0x85, 0xb3, 0xdd, 0xa2, 0xaa, 0xaf, 0x94, 0x38, 0x4c, 0x8d, 0xd3, 0xec, 0xb4, 0x5a, 0xd3, 0x47, + 0x38, 0xa0, 0xf3, 0x72, 0x1f, 0xa3, 0xf3, 0xcc, 0xef, 0x1b, 0x70, 0xa9, 0xbf, 0xd8, 0x22, 0xe7, + 0xb8, 0xf1, 0x8c, 0x13, 0x1a, 0x2f, 0xab, 0x96, 0x39, 0x34, 0x43, 0x3e, 0xb5, 0x5a, 0xe6, 0x13, + 0xab, 0xe6, 0xe9, 0x6b, 0xf9, 0x4b, 0x39, 0x28, 0xaf, 0xb5, 0x7a, 0xbb, 0x5e, 0x67, 0xc1, 0x89, + 0x9c, 0x67, 0x76, 0x4b, 0xf1, 0xa6, 0xb6, 0xa5, 0x88, 0xbd, 0xa3, 0xe2, 0x8a, 0x0d, 0x17, 0x91, + 0xcb, 0x80, 0xa9, 0x84, 0x84, 0xcf, 0xd2, 0xfb, 0x50, 0x60, 0x1f, 0x42, 0x43, 0xb9, 0xda, 0xc7, + 0x18, 0xb1, 0x6e, 0xc6, 0xff, 0x84, 0x92, 0xaf, 0xc7, 0x41, 0x43, 0x0e, 0x97, 0x7f, 0x84, 0x87, + 0x31, 0x3a, 0x7d, 0xc8, 0xc5, 0x7f, 0x64, 0x40, 0x25, 0x5d, 0x13, 0xf2, 0x00, 0xc6, 0x18, 0x27, + 0x2f, 0x0e, 0x89, 0xf4, 0xd2, 0x80, 0x3a, 0xdf, 0x14, 0x68, 0xbc, 0x78, 0xd8, 0xf8, 0x94, 0x43, + 0x2c, 0xc9, 0xe1, 0xb2, 0x05, 0x65, 0x15, 0x2b, 0xa3, 0x74, 0xaf, 0xe9, 0xa2, 0xe9, 0x42, 0x76, + 0x3b, 0xa8, 0xa5, 0xfe, 0x2d, 0xad, 0xd4, 0x42, 0x28, 0x0d, 0x1b, 0xdb, 0x0e, 0xaf, 0x87, 0xf1, + 0x08, 0x1e, 0xea, 0x38, 0x93, 0xc1, 0x3e, 0xf4, 0xeb, 0x61, 0x1c, 0xc6, 0xf6, 0x22, 0x3c, 0x3f, + 0x31, 0xce, 0x70, 0x2f, 0xd2, 0x45, 0x88, 0xaa, 0xcf, 0x72, 0x1c, 0xf3, 0x6f, 0xe6, 0xe1, 0x42, + 0x52, 0x3c, 0x1e, 0xe9, 0x6f, 0xcd, 0x09, 0x9c, 0x76, 0x78, 0xc2, 0x0c, 0xb8, 0xd6, 0x57, 0x34, + 0xbc, 0xfe, 0x2c, 0x8b, 0xa6, 0x14, 0xc8, 0x4c, 0x15, 0x08, 0x37, 0x71, 0xbc, 0x40, 0xb2, 0x18, + 0xe4, 0x01, 0xe4, 0x1b, 0x34, 0x12, 0x97, 0x24, 0x5f, 0xe9, 0x6b, 0x55, 0xb5, 0x5c, 0x37, 0x1b, + 0x34, 0xe2, 0x9d, 0xc8, 0xfd, 0xcc, 0xa9, 0xe6, 0xf7, 0xcd, 0xd4, 0xf1, 0x2d, 0x18, 0x5d, 0x7c, + 0xd2, 0xa5, 0xcd, 0x48, 0xdc, 0x8d, 0xbc, 0x7e, 0x3c, 0x3f, 0x8e, 0xab, 0xdc, 0xc0, 0xa4, 0x08, + 0x50, 0x1b, 0x8b, 0xa3, 0x5c, 0xbe, 0x03, 0x45, 0x99, 0xf9, 0xa9, 0x6e, 0x12, 0xbe, 0x09, 0xe3, + 0x4a, 0x26, 0xa7, 0x1a, 0xf4, 0x7f, 0x69, 0xc0, 0x28, 0x13, 0x7a, 0x9b, 0x6f, 0x3c, 0xa3, 0x12, + 0xe9, 0xb6, 0x26, 0x91, 0xa6, 0x95, 0x2b, 0x2f, 0x38, 0x2f, 0xdf, 0x38, 0x41, 0x16, 0x1d, 0x1a, + 0x00, 0x09, 0x32, 0xb9, 0x07, 0x63, 0xfc, 0x20, 0x47, 0x86, 0xd1, 0x54, 0xef, 0xd0, 0x88, 0x94, + 0x44, 0xcb, 0xf1, 0xbb, 0x69, 0xb5, 0x50, 0x52, 0x93, 0x85, 0xc4, 0xcf, 0x58, 0xbd, 0xb4, 0xc9, + 0xd8, 0xcc, 0xfb, 0x1d, 0x7e, 0xa7, 0x22, 0x54, 0xc2, 0x4d, 0x65, 0x3b, 0x1c, 0xd7, 0x84, 0x61, + 0x23, 0x7f, 0x1c, 0x93, 0x0b, 0x82, 0x49, 0xb6, 0xcd, 0xe3, 0x9b, 0xe3, 0xfc, 0x96, 0x82, 0x2c, + 0xd8, 0x3b, 0x50, 0xbe, 0xeb, 0x07, 0x8f, 0x9d, 0xc0, 0xad, 0xed, 0x52, 0xe1, 0x21, 0x5e, 0x44, + 0x37, 0xef, 0x89, 0x1d, 0x0e, 0xb7, 0x1d, 0x96, 0xf0, 0x83, 0xc3, 0x6a, 0xa1, 0xee, 0xfb, 0x2d, + 0x4b, 0x43, 0x27, 0xab, 0x30, 0xf1, 0xd0, 0x79, 0x22, 0xce, 0xeb, 0xd6, 0xd7, 0x97, 0x85, 0x9f, + 0xc9, 0xf5, 0xa3, 0xc3, 0xea, 0xa5, 0xb6, 0xf3, 0x24, 0x3e, 0xe7, 0x1b, 0xec, 0x0a, 0xad, 0xd3, + 0x13, 0x0f, 0x26, 0xd7, 0xfc, 0x20, 0x12, 0x99, 0x30, 0x9d, 0x36, 0x3f, 0xe0, 0xb8, 0x6d, 0x36, + 0xf3, 0xb8, 0xed, 0x12, 0x53, 0xe4, 0xed, 0x9d, 0x98, 0x5c, 0xbb, 0x5a, 0xa7, 0x31, 0x26, 0xef, + 0xc0, 0xf4, 0x3c, 0x0d, 0x22, 0x6f, 0xc7, 0x6b, 0x3a, 0x11, 0xbd, 0xeb, 0x07, 0x6d, 0x27, 0x12, + 0x06, 0x15, 0xdc, 0x50, 0x37, 0x29, 0xe7, 0xd4, 0x76, 0x22, 0xab, 0x1f, 0x93, 0x7c, 0x25, 0xcb, + 0x73, 0x67, 0x04, 0xab, 0xff, 0x3a, 0x53, 0x0a, 0x32, 0x3c, 0x77, 0x06, 0x34, 0x41, 0x86, 0x0f, + 0xcf, 0xee, 0x71, 0xc7, 0x9e, 0xc5, 0xfa, 0x2d, 0x71, 0x04, 0x7b, 0xf2, 0xb1, 0x66, 0xdc, 0x6f, + 0x03, 0x8e, 0x37, 0xe7, 0x20, 0x5f, 0x5f, 0xbb, 0x8b, 0x26, 0x12, 0x71, 0xcc, 0x48, 0x3b, 0x7b, + 0x4e, 0xa7, 0x89, 0xba, 0x8c, 0xf0, 0x5d, 0x50, 0x05, 0x5e, 0x7d, 0xed, 0x2e, 0x71, 0xe0, 0xec, + 0x1a, 0x0d, 0xda, 0x5e, 0xf4, 0xa5, 0x5b, 0xb7, 0x94, 0x8e, 0x2a, 0x62, 0xd1, 0x66, 0x45, 0xd1, + 0xaa, 0x5d, 0x44, 0xb1, 0x9f, 0xdc, 0xba, 0x95, 0xd9, 0x1d, 0x71, 0xc1, 0xb2, 0x78, 0x91, 0x45, + 0x98, 0x7c, 0xe8, 0x3c, 0x11, 0x07, 0xd2, 0xf1, 0x1e, 0x2f, 0x8f, 0x9e, 0xf1, 0x38, 0xb0, 0x9a, + 0x49, 0x92, 0xda, 0xc5, 0x3a, 0x11, 0x79, 0x1b, 0xc6, 0x93, 0xe1, 0x15, 0xe2, 0x51, 0x64, 0x9e, + 0xbb, 0x44, 0x2a, 0x83, 0x53, 0xb3, 0x25, 0x29, 0xe8, 0x64, 0x23, 0xde, 0xa2, 0x73, 0x85, 0x14, + 0x1d, 0x05, 0x4b, 0xf5, 0x59, 0x75, 0x8b, 0xee, 0x60, 0x8a, 0x56, 0xad, 0xa9, 0x58, 0x45, 0xe7, + 0x9e, 0x32, 0x96, 0xce, 0x45, 0xd9, 0xf9, 0xaf, 0x05, 0x7e, 0xbb, 0x1b, 0xa1, 0xc7, 0x60, 0x6a, + 0xe7, 0xdf, 0xc5, 0x94, 0x8c, 0x9d, 0x3f, 0x27, 0xc9, 0x3e, 0x67, 0x9f, 0xf8, 0x18, 0xe7, 0xec, + 0x14, 0x0a, 0xcb, 0x7e, 0x73, 0x1f, 0x5d, 0x04, 0x4b, 0xf5, 0x0f, 0x98, 0xfc, 0x68, 0xf9, 0xcd, + 0xfd, 0xa7, 0x77, 0x3e, 0x8c, 0xec, 0xc9, 0x0a, 0xab, 0x3b, 0x1b, 0x56, 0x22, 0xeb, 0x99, 0x29, + 0xed, 0xa4, 0x4d, 0x4b, 0xe3, 0x8a, 0x0a, 0x1f, 0x85, 0xb2, 0x22, 0x96, 0x4e, 0x4e, 0x28, 0x54, + 0x16, 0x68, 0xb8, 0x1f, 0xf9, 0xdd, 0xf9, 0x96, 0xd7, 0xdd, 0xf6, 0x9d, 0xc0, 0x9d, 0xa9, 0x0c, + 0x10, 0x18, 0xaf, 0x66, 0x0a, 0x8c, 0x69, 0x97, 0xd3, 0xdb, 0x4d, 0xc9, 0xc0, 0xea, 0x63, 0x49, + 0xbe, 0x02, 0x93, 0x6c, 0xb6, 0x2c, 0x3e, 0x89, 0x68, 0x87, 0x0f, 0xa5, 0x69, 0x5c, 0xea, 0xcf, + 0x29, 0x97, 0x0c, 0xe3, 0x44, 0x3e, 0x48, 0x51, 0x7a, 0xd0, 0x98, 0x40, 0x1d, 0xa4, 0x3a, 0x2b, + 0xf3, 0xc7, 0x52, 0x6d, 0x42, 0x96, 0x60, 0x4c, 0x94, 0x40, 0xac, 0x3a, 0xfd, 0x75, 0x79, 0x3e, + 0xb3, 0x2e, 0x63, 0xa2, 0x2e, 0x96, 0xa4, 0x37, 0xff, 0xa5, 0x01, 0x13, 0x5a, 0x76, 0xe4, 0x8e, + 0xe2, 0xbe, 0x92, 0xb8, 0x9d, 0x69, 0x38, 0x99, 0xe1, 0xe9, 0xef, 0x08, 0x9f, 0xa5, 0xdc, 0x60, + 0xba, 0xcc, 0xc8, 0x61, 0xf2, 0xd2, 0x7f, 0xfe, 0xf8, 0x4b, 0xff, 0x85, 0x01, 0x97, 0xfe, 0xbf, + 0x39, 0x01, 0x93, 0xfa, 0x02, 0xc7, 0x34, 0xce, 0x65, 0x7f, 0xd7, 0xeb, 0xc8, 0x7d, 0x2b, 0x0f, + 0x63, 0x81, 0x10, 0x2d, 0xd6, 0x3b, 0x42, 0xc8, 0xcb, 0x00, 0xf1, 0xd1, 0xac, 0xdc, 0x9a, 0x8a, + 0xc8, 0xf4, 0x4a, 0x02, 0xf9, 0x71, 0x80, 0x15, 0xdf, 0xa5, 0x71, 0x24, 0x94, 0x63, 0x0c, 0x4a, + 0xaf, 0x0a, 0x83, 0x92, 0x88, 0x26, 0x7f, 0x74, 0x58, 0x3d, 0xdf, 0xf1, 0x5d, 0xda, 0x1f, 0x02, + 0x45, 0xe1, 0x48, 0xbe, 0x00, 0x23, 0x56, 0xaf, 0x45, 0x65, 0x60, 0x8e, 0x71, 0x39, 0xe0, 0x7b, + 0x2d, 0x25, 0xca, 0x64, 0xd0, 0x4b, 0x9f, 0x23, 0x30, 0x00, 0x79, 0x0f, 0xe0, 0x41, 0x6f, 0x9b, + 0xde, 0x0b, 0xfc, 0x5e, 0x57, 0xde, 0xfc, 0xc5, 0x6d, 0xec, 0x7e, 0x1c, 0xc6, 0xc9, 0xde, 0xc5, + 0x44, 0x35, 0xf3, 0x84, 0x84, 0xac, 0xc2, 0x98, 0x10, 0x1f, 0xc2, 0x4e, 0xff, 0x42, 0x96, 0x85, + 0x48, 0xd1, 0x21, 0x44, 0xa4, 0x0c, 0x04, 0xeb, 0x46, 0x1b, 0xbe, 0x0d, 0x7f, 0x1b, 0x4a, 0x8c, + 0x3d, 0xdb, 0x6a, 0x87, 0x62, 0xed, 0x40, 0xff, 0x41, 0xa5, 0x40, 0x6c, 0x5b, 0xae, 0xc5, 0xeb, + 0x8a, 0x09, 0xc8, 0x57, 0x30, 0xb6, 0x8d, 0x68, 0xea, 0x63, 0x0d, 0x8d, 0xaf, 0xf4, 0x35, 0xf5, + 0x39, 0xa7, 0xdb, 0xcd, 0x08, 0x06, 0x16, 0xf3, 0x23, 0xbb, 0xf1, 0x1d, 0x9b, 0x38, 0xd4, 0xf0, + 0x31, 0x19, 0xdc, 0xe8, 0xcb, 0x60, 0x46, 0x5e, 0x1b, 0xe9, 0x8f, 0x68, 0xa3, 0xf1, 0x25, 0x5d, + 0xa8, 0x24, 0x61, 0xb4, 0x44, 0x5e, 0x70, 0x5c, 0x5e, 0xaf, 0xf7, 0xe5, 0xa5, 0x76, 0x60, 0x5f, + 0x76, 0x7d, 0xdc, 0x89, 0x9b, 0x84, 0x85, 0x15, 0xf9, 0x8d, 0x1f, 0x97, 0xdf, 0xcb, 0x7d, 0xf9, + 0x9d, 0x75, 0xb7, 0xfb, 0xf3, 0x49, 0xf1, 0x24, 0x6f, 0xc3, 0x84, 0x84, 0xe0, 0xfc, 0x40, 0x03, + 0x9f, 0xd0, 0xef, 0xdd, 0x6d, 0x74, 0x1a, 0xd3, 0xc3, 0xb9, 0xa8, 0xc8, 0x2a, 0x35, 0x1f, 0x1d, + 0x13, 0x1a, 0x75, 0x7a, 0x54, 0xe8, 0xc8, 0xe4, 0xcb, 0x30, 0xbe, 0xd4, 0x66, 0x15, 0xf1, 0x3b, + 0x4e, 0x44, 0x71, 0x31, 0x4a, 0x8c, 0xa6, 0x4a, 0x8a, 0x32, 0x54, 0x79, 0x8c, 0xc7, 0x24, 0x49, + 0x5d, 0xcc, 0x15, 0x0a, 0xd6, 0x78, 0xdc, 0xfc, 0x22, 0xc6, 0x70, 0x28, 0x96, 0x9e, 0xe7, 0x33, + 0x0c, 0x97, 0x0a, 0x7b, 0x94, 0xe5, 0xdc, 0xaa, 0x63, 0x8b, 0x09, 0xa1, 0x35, 0x9e, 0xce, 0x93, + 0xbc, 0x03, 0xe3, 0xe2, 0x46, 0x63, 0xcd, 0x5a, 0x09, 0x67, 0x2a, 0x58, 0x79, 0x8c, 0xc5, 0x26, + 0x2f, 0x3f, 0xda, 0x4e, 0x90, 0x3a, 0xbd, 0x4a, 0xf0, 0xc9, 0x97, 0xe0, 0xdc, 0x96, 0xd7, 0x71, + 0xfd, 0xc7, 0xa1, 0x10, 0xe0, 0x42, 0xd0, 0x4d, 0x27, 0x3e, 0x3a, 0x8f, 0x79, 0xba, 0x2d, 0x97, + 0xad, 0x3e, 0xc1, 0x97, 0xc9, 0x81, 0xfc, 0x4c, 0x1f, 0x67, 0x3e, 0x82, 0xc8, 0x71, 0x23, 0x68, + 0xae, 0x6f, 0x04, 0xf5, 0x67, 0x9f, 0x1e, 0x4e, 0x99, 0xd9, 0x10, 0x1f, 0x88, 0xae, 0x73, 0xbc, + 0xef, 0x7b, 0x9d, 0x99, 0xb3, 0xda, 0x43, 0x1e, 0xb1, 0xcb, 0x2c, 0xe2, 0xad, 0xf9, 0x2d, 0xaf, + 0x79, 0x50, 0x37, 0x8f, 0x0e, 0xab, 0x2f, 0xa4, 0xb5, 0x99, 0x0f, 0x7d, 0xcd, 0xb8, 0x90, 0xc1, + 0x9a, 0x7c, 0x19, 0xca, 0xec, 0x37, 0x56, 0xfd, 0xce, 0x69, 0x47, 0x5d, 0x0a, 0xa6, 0xc8, 0x07, + 0xfb, 0x08, 0xaf, 0x5c, 0x66, 0x68, 0x85, 0x1a, 0x2b, 0xf3, 0xfb, 0x06, 0x9c, 0xcb, 0x2a, 0xeb, + 0x09, 0xf1, 0x6d, 0xcc, 0xd4, 0xa1, 0x37, 0xda, 0x25, 0xf8, 0xa1, 0x77, 0x7c, 0xd4, 0x5d, 0x85, + 0x11, 0xb6, 0x57, 0x96, 0x4e, 0x59, 0xb8, 0x1c, 0xb2, 0xfd, 0x74, 0x68, 0x71, 0x38, 0x43, 0x40, + 0x67, 0x7a, 0x5c, 0x2f, 0x47, 0x38, 0x02, 0x7a, 0xdc, 0x5b, 0x1c, 0xce, 0x10, 0xd8, 0xb2, 0x2b, + 0x97, 0x09, 0x44, 0x60, 0xab, 0x71, 0x68, 0x71, 0x38, 0x79, 0x05, 0xc6, 0x56, 0x3b, 0xcb, 0xd4, + 0x79, 0x44, 0xc5, 0x89, 0x13, 0xda, 0x51, 0xfc, 0x8e, 0xdd, 0x62, 0x30, 0x4b, 0x26, 0x9a, 0xdf, + 0x36, 0x60, 0xba, 0xaf, 0x99, 0x4e, 0x0e, 0xe1, 0x73, 0xfc, 0xf1, 0xde, 0x30, 0xf5, 0xe3, 0xc5, + 0x2f, 0x64, 0x17, 0xdf, 0xfc, 0xf3, 0x3c, 0x5c, 0x1c, 0xb0, 0x6a, 0x25, 0x47, 0xf3, 0xc6, 0x89, + 0x47, 0xf3, 0x5f, 0x65, 0xab, 0x84, 0xe3, 0xb5, 0xc3, 0x75, 0x3f, 0x29, 0x71, 0x72, 0x8a, 0x81, + 0x69, 0x32, 0x46, 0x86, 0x8c, 0xe7, 0x70, 0xa9, 0x89, 0x14, 0x76, 0xe4, 0xf7, 0xd9, 0x8c, 0x75, + 0x66, 0x7d, 0x87, 0xe3, 0xf9, 0x1f, 0x92, 0xc3, 0x71, 0xfd, 0x48, 0xaa, 0xf0, 0x54, 0x8f, 0xa4, + 0xb2, 0x8d, 0xe4, 0x23, 0x1f, 0xe7, 0x28, 0xe0, 0xdf, 0xa6, 0x8e, 0xe3, 0x7f, 0x18, 0xbb, 0xfa, + 0x3a, 0x8c, 0x6c, 0xed, 0xd1, 0x40, 0xea, 0xb7, 0x58, 0x90, 0xc7, 0x0c, 0xa0, 0x16, 0x04, 0x31, + 0xcc, 0x9f, 0x86, 0xb2, 0x9a, 0x19, 0xce, 0x65, 0xf6, 0x2d, 0x26, 0x13, 0x9f, 0xcb, 0x0c, 0x60, + 0x71, 0xf8, 0x89, 0x11, 0xb1, 0x92, 0x56, 0xc8, 0x9f, 0xd4, 0x0a, 0x2c, 0x73, 0x1c, 0x2a, 0x4a, + 0xe6, 0xf8, 0xad, 0x66, 0x1e, 0x31, 0x80, 0xc5, 0xe1, 0x4f, 0x35, 0xf3, 0x7f, 0x63, 0x40, 0x01, + 0xa3, 0x11, 0xbc, 0x01, 0x25, 0x69, 0xa7, 0x55, 0x6f, 0xe8, 0x9f, 0x95, 0x66, 0xdc, 0x50, 0x77, + 0xa6, 0x10, 0x40, 0x96, 0xd5, 0x26, 0x0d, 0xb6, 0x35, 0x9f, 0x9b, 0x47, 0x0c, 0xa0, 0x66, 0x85, + 0x18, 0xa7, 0xe8, 0x0f, 0xf4, 0x2b, 0x12, 0xc6, 0x05, 0x2e, 0x6d, 0xb8, 0x5f, 0x51, 0x9f, 0x51, + 0x41, 0x62, 0x99, 0xbf, 0x61, 0xc0, 0xf9, 0x4c, 0x25, 0x84, 0xe5, 0xca, 0xb5, 0x1d, 0x65, 0x38, + 0xa6, 0x55, 0x1d, 0x8e, 0x71, 0x1a, 0xff, 0xa1, 0x53, 0x8c, 0xad, 0xcf, 0x40, 0x29, 0xde, 0x1c, + 0x92, 0x73, 0xb2, 0xeb, 0xd0, 0x98, 0x27, 0x77, 0x52, 0x7f, 0x69, 0xc0, 0x28, 0x2b, 0xc2, 0x33, + 0x7b, 0xb5, 0x23, 0xdb, 0xb4, 0xcb, 0xaa, 0x34, 0xd4, 0x85, 0x8e, 0xdf, 0x1d, 0x05, 0x48, 0x90, + 0xc9, 0x36, 0x4c, 0xae, 0x2e, 0x2d, 0xcc, 0x2f, 0xb9, 0xb4, 0x13, 0xe1, 0x11, 0x63, 0xea, 0x8a, + 0x3f, 0xdb, 0xd5, 0x06, 0x1d, 0xa7, 0x25, 0x10, 0x0e, 0x12, 0xd9, 0xe0, 0x7b, 0x6e, 0xd3, 0xf6, + 0x62, 0x3a, 0x55, 0x1b, 0xd4, 0x39, 0xb2, 0x3c, 0x1a, 0xb5, 0x87, 0xcb, 0x4a, 0x1e, 0xb9, 0x21, + 0xf3, 0x08, 0x9d, 0x76, 0x6b, 0x40, 0x1e, 0x3a, 0x47, 0xb2, 0x07, 0x95, 0x7b, 0xb8, 0x70, 0x28, + 0xb9, 0xe4, 0x8f, 0xcf, 0xe5, 0x45, 0x91, 0xcb, 0x73, 0x7c, 0xc5, 0xc9, 0xce, 0xa7, 0x8f, 0x6b, + 0x32, 0x72, 0x0b, 0x27, 0x8e, 0xdc, 0xbf, 0x6a, 0xc0, 0x28, 0x5f, 0x99, 0xe2, 0x87, 0x34, 0x32, + 0xd7, 0xbe, 0xad, 0xa7, 0xb3, 0xf6, 0x55, 0x50, 0x72, 0x69, 0xbb, 0x7f, 0x9e, 0x46, 0x16, 0x52, + 0xaf, 0x72, 0x48, 0xfb, 0x3d, 0x6a, 0xc5, 0x3c, 0x25, 0xf1, 0xc2, 0xe2, 0x0f, 0x72, 0xa8, 0x5c, + 0x38, 0x86, 0xfa, 0x46, 0xe0, 0xd8, 0xc7, 0x7c, 0x23, 0x70, 0x19, 0x4a, 0xc2, 0xad, 0xa8, 0x7e, + 0x20, 0xf6, 0xbe, 0xd2, 0xba, 0x13, 0xc3, 0x95, 0xc8, 0xd7, 0x1c, 0x64, 0x6f, 0x6b, 0x71, 0xeb, + 0x62, 0x44, 0xb2, 0x0a, 0xa5, 0xe4, 0x5e, 0x4a, 0x49, 0x3b, 0x84, 0x8d, 0xe1, 0xc2, 0xef, 0x96, + 0x5f, 0x7d, 0xcc, 0xbc, 0x86, 0x92, 0xf0, 0x30, 0xbf, 0x6e, 0x40, 0x25, 0x3d, 0x5e, 0xc8, 0xdb, + 0x30, 0x1e, 0x5f, 0x0d, 0x8a, 0x9d, 0x1b, 0xd0, 0x8a, 0x9a, 0xdc, 0x25, 0xd2, 0xdc, 0x1c, 0x54, + 0x74, 0x32, 0x07, 0x45, 0x36, 0xed, 0x94, 0xc0, 0xc5, 0x28, 0x4f, 0x7a, 0x02, 0xa6, 0x1e, 0x2a, + 0x4a, 0x3c, 0x65, 0xd6, 0xfe, 0xfb, 0x3c, 0x8c, 0x2b, 0x9d, 0x45, 0xae, 0x43, 0x71, 0x29, 0x5c, + 0xf6, 0x9b, 0xfb, 0xd4, 0x15, 0x67, 0x15, 0xf8, 0x04, 0xa4, 0x17, 0xda, 0x2d, 0x04, 0x5a, 0x71, + 0x32, 0xa9, 0xc3, 0x04, 0xff, 0x27, 0xaf, 0x80, 0xe6, 0x12, 0x3b, 0x2b, 0x47, 0x96, 0x97, 0x3f, + 0xd5, 0xe5, 0x5d, 0x23, 0x21, 0x5f, 0x03, 0xe0, 0x00, 0xd6, 0xbf, 0x43, 0x78, 0x15, 0xcb, 0x09, + 0x7c, 0x5e, 0x64, 0x10, 0x79, 0x6a, 0x0d, 0x71, 0x28, 0x28, 0x0c, 0xf1, 0xf9, 0x39, 0xbf, 0xb9, + 0x3f, 0xfc, 0x03, 0x94, 0xc9, 0xf3, 0x73, 0x7e, 0x73, 0xdf, 0xce, 0x76, 0x31, 0x53, 0x59, 0x92, + 0x6f, 0x18, 0x70, 0xd9, 0xa2, 0x4d, 0xff, 0x11, 0x0d, 0x0e, 0x6a, 0x11, 0x62, 0xa9, 0x39, 0x9e, + 0xec, 0xcf, 0x76, 0x5b, 0xe4, 0xf8, 0x6a, 0x20, 0xb8, 0xe0, 0x5d, 0x98, 0x76, 0x37, 0xb2, 0x8f, + 0x29, 0xc2, 0x31, 0x59, 0x9a, 0x7f, 0x62, 0x28, 0x53, 0x80, 0xac, 0x40, 0x29, 0x1e, 0x2c, 0xc2, + 0xda, 0x19, 0x6b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xfa, 0x73, 0xe2, 0x58, 0xe1, 0x6c, 0x3c, 0xe4, + 0xb4, 0x19, 0x21, 0x81, 0xe4, 0x8b, 0x50, 0xc0, 0xae, 0x3a, 0x39, 0xd2, 0x95, 0x5c, 0x6a, 0x0a, + 0xac, 0x8f, 0xb0, 0xd4, 0x48, 0x49, 0x3e, 0x27, 0x5c, 0x4c, 0xf2, 0x5a, 0x0c, 0x59, 0x06, 0x62, + 0xe5, 0x88, 0xd7, 0x98, 0xc4, 0xab, 0x51, 0x19, 0xad, 0x7f, 0x2d, 0x07, 0x95, 0xf4, 0xc4, 0x23, + 0xef, 0x41, 0x79, 0xcd, 0x09, 0xc3, 0xc7, 0x7e, 0xe0, 0xde, 0x77, 0xc2, 0x3d, 0x11, 0x97, 0x12, + 0x37, 0x9c, 0x5d, 0x01, 0xb7, 0xf7, 0x1c, 0x2d, 0x7e, 0x99, 0x46, 0xc0, 0x16, 0xe4, 0x75, 0xe1, + 0x2c, 0xaf, 0x4c, 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0xb8, 0x94, 0x12, 0x8d, 0xbc, 0x01, 0x79, 0x7e, + 0xf1, 0x4e, 0x0d, 0x6a, 0xf4, 0xf0, 0x6e, 0x8d, 0xdf, 0x55, 0xe2, 0x27, 0xd9, 0xfa, 0x91, 0x00, + 0xc3, 0x27, 0xcb, 0xca, 0xb5, 0xad, 0x51, 0x2d, 0xb8, 0x8b, 0x04, 0xc7, 0x95, 0x3b, 0xf9, 0xfe, + 0xd6, 0xfb, 0x85, 0x62, 0xbe, 0x52, 0x10, 0x97, 0x83, 0x7e, 0x3f, 0x0f, 0xa5, 0x38, 0x7f, 0x42, + 0x00, 0xf5, 0x0d, 0x71, 0x24, 0x8d, 0xff, 0xc9, 0x25, 0x28, 0x4a, 0x15, 0x43, 0x1c, 0x4b, 0x8f, + 0x85, 0x42, 0xbd, 0x98, 0x01, 0xa9, 0x4b, 0x70, 0xf5, 0xc2, 0x92, 0x9f, 0xe4, 0x16, 0xc4, 0x8a, + 0xc2, 0x20, 0x8d, 0xa2, 0xc0, 0x3a, 0xcc, 0x8a, 0xd1, 0xc8, 0x24, 0xe4, 0x3c, 0xee, 0x08, 0x5d, + 0xb2, 0x72, 0x9e, 0x4b, 0xde, 0x83, 0xa2, 0xe3, 0xba, 0xd4, 0xb5, 0x9d, 0x68, 0x88, 0xc7, 0x40, + 0x8b, 0x8c, 0x1b, 0x97, 0xe8, 0x48, 0x55, 0x8b, 0x48, 0x0d, 0x4a, 0xf8, 0x16, 0x64, 0x2f, 0x1c, + 0xea, 0x01, 0xc9, 0x84, 0x43, 0x91, 0x91, 0x6d, 0x84, 0xd4, 0x25, 0xaf, 0x42, 0x81, 0xf5, 0xa6, + 0x58, 0x0f, 0xe2, 0x50, 0x75, 0xab, 0xeb, 0x6b, 0xbc, 0xc1, 0xee, 0x9f, 0xb1, 0x10, 0x81, 0xbc, + 0x04, 0xf9, 0xde, 0xdc, 0x8e, 0x90, 0xf4, 0x95, 0xe4, 0x4e, 0x66, 0x8c, 0xc6, 0x92, 0xc9, 0x6d, + 0x28, 0x3e, 0xd6, 0x6f, 0xdf, 0x9d, 0x4f, 0x75, 0x63, 0x8c, 0x1f, 0x23, 0xd6, 0x8b, 0x30, 0xca, + 0xef, 0xba, 0x99, 0x2f, 0x00, 0x24, 0x59, 0xf7, 0x7b, 0x0f, 0x98, 0x5f, 0x83, 0x52, 0x9c, 0x25, + 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0x6f, 0xa0, 0x94, 0xad, 0xd2, 0x3e, + 0x3d, 0xb8, 0x8f, 0x00, 0x72, 0x11, 0xc6, 0xba, 0xac, 0x57, 0x65, 0x54, 0x55, 0x6b, 0xb4, 0xdb, + 0xdb, 0x66, 0x23, 0x74, 0x06, 0xc6, 0xd0, 0x6e, 0x21, 0x26, 0xda, 0x84, 0x25, 0x3f, 0xcd, 0xdf, + 0xce, 0xe1, 0x7d, 0x7b, 0xa5, 0x9c, 0xe4, 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0xa9, + 0x45, 0x22, 0x9f, 0x72, 0x02, 0x5c, 0x72, 0xc9, 0x2b, 0x30, 0x95, 0x84, 0x79, 0xb5, 0x9b, 0xdb, + 0xe2, 0xee, 0x6d, 0xd9, 0x9a, 0xe8, 0xca, 0x38, 0xaf, 0xf3, 0xdb, 0xe8, 0xc0, 0x5f, 0x51, 0xef, + 0xb9, 0x45, 0x32, 0x64, 0x6b, 0xc9, 0x9a, 0x52, 0xe0, 0x78, 0xe6, 0x71, 0x01, 0x46, 0x1d, 0x67, + 0xb7, 0xe7, 0x71, 0x67, 0xe2, 0xb2, 0x25, 0xbe, 0xc8, 0x67, 0x61, 0x3a, 0xf4, 0x76, 0x3b, 0x4e, + 0xd4, 0x0b, 0x44, 0xc0, 0x03, 0x1a, 0xe0, 0x90, 0x9a, 0xb0, 0x2a, 0x71, 0xc2, 0x3c, 0x87, 0x93, + 0xd7, 0x81, 0xa8, 0xf9, 0xf9, 0xdb, 0x1f, 0xd2, 0x26, 0x1f, 0x6a, 0x65, 0x6b, 0x5a, 0x49, 0x59, + 0xc5, 0x04, 0xf2, 0x19, 0x28, 0x07, 0x34, 0x44, 0x95, 0x0c, 0x9b, 0x0d, 0xc3, 0xb8, 0x58, 0xe3, + 0x12, 0xf6, 0x80, 0x1e, 0x98, 0x75, 0x98, 0xee, 0x9b, 0x8f, 0xe4, 0x75, 0xae, 0xdd, 0x8b, 0xf5, + 0xb9, 0xcc, 0x37, 0x33, 0x4c, 0x48, 0xa5, 0x9e, 0x0f, 0xe6, 0x48, 0x66, 0x07, 0xca, 0xaa, 0x7c, + 0x3d, 0xe1, 0x56, 0xf3, 0x05, 0xf4, 0x6a, 0xe4, 0xc2, 0x67, 0xf4, 0xe8, 0xb0, 0x9a, 0xf3, 0x5c, + 0xf4, 0x65, 0xbc, 0x06, 0x45, 0xa9, 0x25, 0xa8, 0x6f, 0x80, 0x08, 0x85, 0xf2, 0xc0, 0x8a, 0x53, + 0xcd, 0x57, 0x61, 0x4c, 0x88, 0xd0, 0xe3, 0x6d, 0x48, 0xe6, 0x2f, 0xe4, 0x60, 0xca, 0xa2, 0x6c, + 0x82, 0x8b, 0xd7, 0x35, 0x3e, 0x65, 0x01, 0x6f, 0xb5, 0xba, 0x1d, 0x13, 0x44, 0xe0, 0x3b, 0x06, + 0x9c, 0xcd, 0xc0, 0xfd, 0x48, 0x11, 0xb2, 0xee, 0x40, 0x69, 0xc1, 0x73, 0x5a, 0x35, 0xd7, 0x8d, + 0xbd, 0x33, 0x51, 0x1b, 0x74, 0xd9, 0x74, 0x72, 0x18, 0x54, 0x5d, 0x4c, 0x63, 0x54, 0x72, 0x43, + 0x0c, 0x8a, 0x24, 0x86, 0x9f, 0x0c, 0xa9, 0x0b, 0xbc, 0x4c, 0x49, 0x40, 0x5d, 0xbc, 0x03, 0xc7, + 0x81, 0xc9, 0x01, 0xfc, 0x33, 0xdb, 0x75, 0xd9, 0x77, 0xe0, 0xd2, 0xd5, 0x1b, 0x6a, 0xdb, 0xf9, + 0xf5, 0x1c, 0x5c, 0xc8, 0x26, 0xfc, 0xa8, 0xc1, 0xce, 0x30, 0x82, 0x83, 0x12, 0xb5, 0x18, 0x83, + 0x9d, 0xf1, 0x70, 0x0f, 0x88, 0x9f, 0x20, 0x90, 0x1d, 0x98, 0x58, 0x76, 0xc2, 0xe8, 0x3e, 0x75, + 0x82, 0x68, 0x9b, 0x3a, 0xd1, 0x10, 0x1a, 0x6c, 0xfc, 0x48, 0x2f, 0x2e, 0x6a, 0x7b, 0x92, 0x32, + 0xfd, 0x48, 0xaf, 0xc6, 0x36, 0x1e, 0x28, 0x85, 0x21, 0x06, 0xca, 0x4f, 0xc2, 0x54, 0x83, 0xb6, + 0x9d, 0xee, 0x9e, 0x1f, 0x50, 0x61, 0xf6, 0xbe, 0x09, 0x13, 0x31, 0x28, 0x73, 0xb4, 0xe8, 0xc9, + 0x1a, 0xbe, 0xd2, 0x10, 0x89, 0x28, 0xd1, 0x93, 0xcd, 0xdf, 0xcc, 0xc1, 0xc5, 0x5a, 0x53, 0x9c, + 0x11, 0x88, 0x04, 0x79, 0x94, 0xf9, 0x09, 0xe7, 0x4d, 0x66, 0xa1, 0xf4, 0xd0, 0x79, 0x82, 0xaf, + 0xcd, 0x87, 0x22, 0x64, 0x0e, 0x57, 0xbf, 0x9c, 0x27, 0x76, 0x6c, 0xf6, 0xb2, 0x12, 0x9c, 0xa7, + 0xf9, 0x20, 0xbd, 0x09, 0xa3, 0xf7, 0xfd, 0x96, 0x2b, 0x16, 0x27, 0x71, 0xe4, 0xb0, 0x87, 0x10, + 0x4b, 0xa4, 0x98, 0xdf, 0x37, 0x60, 0x32, 0x2e, 0x31, 0x16, 0xe1, 0x13, 0x6f, 0x92, 0xd4, 0xd3, + 0xfc, 0xa5, 0x21, 0x9e, 0xe6, 0x1f, 0xf9, 0x78, 0x2d, 0x61, 0xfe, 0x7d, 0x3c, 0xcd, 0x50, 0x6b, + 0xc9, 0x56, 0x22, 0xa5, 0x20, 0xc6, 0x90, 0x05, 0xc9, 0x3d, 0xb5, 0x2e, 0xc9, 0x0f, 0xec, 0x92, + 0x5f, 0xcc, 0xc1, 0x78, 0x5c, 0xd8, 0x4f, 0xd9, 0xe5, 0xf1, 0xb8, 0x5e, 0x43, 0xb9, 0x86, 0x37, + 0x14, 0x59, 0x21, 0x3c, 0xb0, 0xbf, 0x08, 0xa3, 0x62, 0x32, 0x19, 0xa9, 0x23, 0xbd, 0x54, 0xef, + 0x26, 0x0f, 0xad, 0x62, 0x87, 0x86, 0x96, 0xa0, 0x43, 0xdf, 0xfb, 0x2d, 0xba, 0x2d, 0x0e, 0xb7, + 0x9e, 0xd9, 0x35, 0x2a, 0xdb, 0xf7, 0x3e, 0xa9, 0xd8, 0x50, 0xab, 0xd3, 0xdf, 0x2e, 0x40, 0x25, + 0x4d, 0x72, 0xf2, 0xf5, 0xfc, 0xb5, 0xde, 0xb6, 0x78, 0x24, 0x01, 0xaf, 0xe7, 0x77, 0x7b, 0xdb, + 0x16, 0x83, 0x91, 0x57, 0xa0, 0xb0, 0x16, 0x78, 0x8f, 0xb0, 0xd6, 0xe2, 0x8d, 0x88, 0x6e, 0xe0, + 0x3d, 0x52, 0x9d, 0x50, 0x59, 0x3a, 0x6e, 0x68, 0x97, 0x1b, 0xca, 0x1b, 0xd7, 0x7c, 0x43, 0xdb, + 0x0a, 0xd3, 0x31, 0x59, 0x24, 0x1a, 0x5b, 0x2a, 0xeb, 0xd4, 0x09, 0xc4, 0x55, 0x72, 0x21, 0xce, + 0x70, 0xa9, 0xdc, 0x46, 0x30, 0x0f, 0xb8, 0x6a, 0xa9, 0x48, 0xa4, 0x05, 0x44, 0xf9, 0x94, 0x13, + 0xf8, 0xe4, 0x3d, 0x9e, 0x7c, 0xdb, 0xe8, 0x9c, 0xca, 0xda, 0x56, 0x67, 0x73, 0x06, 0xdf, 0xa7, + 0x69, 0x23, 0x5c, 0x83, 0x12, 0x9a, 0xbc, 0xd0, 0x90, 0x51, 0x3c, 0x91, 0x99, 0x74, 0xf8, 0x05, + 0x74, 0x05, 0xb0, 0x63, 0x73, 0x46, 0xc2, 0x84, 0xbc, 0x0b, 0xe3, 0xaa, 0x97, 0x2a, 0xf7, 0xa5, + 0xbc, 0xc2, 0xaf, 0x27, 0x0d, 0x88, 0x5d, 0xa6, 0x12, 0x98, 0x9f, 0x53, 0x47, 0x89, 0x58, 0xb4, + 0x8f, 0x1d, 0x25, 0xe6, 0xaf, 0xa3, 0x1a, 0xdf, 0xf6, 0x23, 0x2a, 0xb4, 0x97, 0x67, 0x56, 0x8e, + 0x25, 0x26, 0xe4, 0x11, 0xcd, 0x1d, 0x45, 0xab, 0xdd, 0x29, 0x5e, 0x77, 0xfe, 0x3d, 0x03, 0xce, + 0x67, 0xd2, 0x92, 0x9b, 0x00, 0x89, 0x8e, 0x28, 0x5a, 0x89, 0x47, 0xb2, 0x8d, 0xa1, 0x96, 0x82, + 0x41, 0xbe, 0x9a, 0xd6, 0xee, 0x4e, 0x5e, 0x9c, 0xe4, 0x7b, 0x0f, 0x93, 0xba, 0x76, 0x97, 0xa1, + 0xd3, 0x99, 0xdf, 0xc9, 0xc3, 0x74, 0xdf, 0x3b, 0x81, 0x27, 0x38, 0x00, 0xec, 0xa7, 0x5e, 0xa1, + 0xe2, 0xc7, 0x1d, 0x37, 0x06, 0xbd, 0x52, 0x98, 0xf1, 0x26, 0x15, 0x9a, 0xc5, 0x44, 0x10, 0xe5, + 0x13, 0x9e, 0xa6, 0x0a, 0xb3, 0xdf, 0x2f, 0xfb, 0xec, 0xc0, 0xdc, 0x9e, 0xc2, 0x3b, 0x66, 0x3f, + 0xc4, 0xcf, 0x3c, 0xfd, 0x7a, 0x0e, 0xce, 0xf6, 0xd5, 0xf9, 0x99, 0x9d, 0x75, 0x5f, 0xd4, 0x56, + 0xb7, 0x17, 0x06, 0xf5, 0xe9, 0x50, 0x5a, 0xc4, 0x7f, 0x33, 0xe0, 0xe2, 0x00, 0x4a, 0x72, 0x90, + 0x1e, 0x44, 0x5c, 0xab, 0xb8, 0x75, 0x7c, 0x86, 0x4f, 0x65, 0x28, 0x7d, 0x62, 0x23, 0xe1, 0x17, + 0x72, 0x00, 0x5b, 0x74, 0xfb, 0xd9, 0x8e, 0x3d, 0x94, 0xfd, 0x10, 0xbf, 0xac, 0xd6, 0x50, 0xfd, + 0xbe, 0x8a, 0x86, 0xc4, 0xe1, 0x03, 0x0f, 0xc5, 0x6f, 0x5a, 0xe4, 0xb2, 0xdf, 0xb4, 0x30, 0xb7, + 0xe1, 0xdc, 0x3d, 0x1a, 0x25, 0x2b, 0xa1, 0xdc, 0x43, 0x1e, 0xcf, 0xf6, 0x35, 0x28, 0x09, 0x7c, + 0x3d, 0x3e, 0xb9, 0xf4, 0x66, 0xf3, 0x5c, 0x2b, 0x41, 0x30, 0x29, 0x5c, 0x5c, 0xa0, 0x2d, 0x1a, + 0xd1, 0x4f, 0x36, 0x9b, 0x06, 0x10, 0x5e, 0x15, 0xfe, 0xd4, 0xc1, 0x50, 0x39, 0x9c, 0xd8, 0x3e, + 0x9b, 0x70, 0x3e, 0x2e, 0xfb, 0xd3, 0xe4, 0x3b, 0xcb, 0x74, 0x09, 0x71, 0xd1, 0x2f, 0xe1, 0x78, + 0x8c, 0x11, 0xf1, 0x09, 0x5c, 0x96, 0x04, 0x5b, 0x5e, 0x7c, 0x12, 0x33, 0x14, 0x2d, 0x79, 0x1b, + 0xc6, 0x15, 0x1a, 0x71, 0x6b, 0x18, 0x4f, 0x3b, 0x1f, 0x7b, 0xd1, 0x9e, 0x1d, 0x72, 0xb8, 0x7a, + 0xda, 0xa9, 0xa0, 0x9b, 0x5f, 0x81, 0xe7, 0x62, 0xbf, 0x95, 0x8c, 0xac, 0x53, 0xcc, 0x8d, 0xd3, + 0x31, 0x5f, 0x49, 0xaa, 0xb5, 0xd4, 0x89, 0x9d, 0xd7, 0x25, 0x6f, 0xa2, 0x56, 0x4b, 0x54, 0xe6, + 0x8a, 0x12, 0x93, 0x4d, 0xac, 0x45, 0x09, 0xc0, 0x7c, 0x4b, 0x29, 0x6c, 0x06, 0x43, 0x8d, 0xd8, + 0x48, 0x13, 0xff, 0x42, 0x0e, 0xa6, 0x56, 0x97, 0x16, 0xe6, 0x63, 0x33, 0xf2, 0xa7, 0x2c, 0x30, + 0x92, 0x56, 0xb7, 0xc1, 0xf2, 0xc6, 0xdc, 0x80, 0xb3, 0xa9, 0x66, 0xc0, 0x97, 0x5c, 0xde, 0xe5, + 0xfe, 0x25, 0x31, 0x58, 0xae, 0x2c, 0x17, 0xb2, 0xd8, 0x6f, 0xde, 0xb6, 0x52, 0xd8, 0xe6, 0x77, + 0x46, 0x53, 0x7c, 0x85, 0x08, 0x7b, 0x0d, 0x4a, 0x4b, 0x61, 0xd8, 0xa3, 0xc1, 0x86, 0xb5, 0xac, + 0xea, 0x88, 0x1e, 0x02, 0xed, 0x5e, 0xd0, 0xb2, 0x12, 0x04, 0x72, 0x1d, 0x8a, 0xe2, 0x72, 0x99, + 0x94, 0x09, 0x78, 0x5c, 0x1e, 0xdf, 0x4d, 0xb3, 0xe2, 0x64, 0xf2, 0x06, 0x94, 0xf9, 0x7f, 0x3e, + 0xda, 0x44, 0x83, 0xa3, 0xad, 0x4a, 0xa0, 0xf3, 0xd1, 0x69, 0x69, 0x68, 0x6c, 0x67, 0x26, 0x9f, + 0x8a, 0x64, 0x25, 0x2a, 0x24, 0x3b, 0x33, 0xf9, 0xaa, 0x24, 0x96, 0x49, 0x45, 0x22, 0x37, 0x20, + 0x5f, 0x9b, 0xb7, 0xd4, 0x90, 0xcc, 0x4e, 0x33, 0xe0, 0x21, 0xcd, 0xb5, 0xd7, 0x98, 0x6a, 0xf3, + 0x16, 0x99, 0x83, 0x22, 0xbe, 0xb6, 0xe1, 0xd2, 0x40, 0x38, 0xac, 0xe2, 0xa8, 0xe9, 0x0a, 0x98, + 0x7a, 0xf2, 0x28, 0xf1, 0xc8, 0x2c, 0x8c, 0x2d, 0x78, 0x61, 0xb7, 0xe5, 0x1c, 0x88, 0x88, 0x28, + 0x78, 0x18, 0xe2, 0x72, 0x90, 0x3a, 0xce, 0x04, 0x16, 0xb9, 0x0e, 0x23, 0x8d, 0xa6, 0xdf, 0x65, + 0xbb, 0xad, 0xd8, 0xb5, 0x25, 0x64, 0x00, 0x2d, 0xac, 0x02, 0x03, 0xe0, 0x7d, 0x67, 0x7e, 0x6d, + 0xab, 0xa4, 0xdc, 0x77, 0x4e, 0x5f, 0xd7, 0x12, 0x38, 0xfd, 0xce, 0x87, 0xf0, 0x34, 0x9d, 0x0f, + 0xb7, 0xe1, 0xe2, 0x3d, 0x54, 0xf5, 0x1b, 0x34, 0xc0, 0x20, 0x94, 0xfc, 0xe5, 0x9e, 0x0d, 0x6b, + 0x49, 0x5c, 0x55, 0xbb, 0x76, 0x74, 0x58, 0x7d, 0x89, 0xef, 0x06, 0xec, 0x90, 0xe3, 0xc8, 0x47, + 0x7f, 0x52, 0xcf, 0x15, 0x0c, 0x62, 0x44, 0xbe, 0x04, 0xe7, 0xb2, 0x92, 0xc4, 0xa5, 0x35, 0x74, + 0x49, 0xcf, 0xce, 0x40, 0xf5, 0x09, 0xcf, 0xe2, 0x40, 0x96, 0xa1, 0xc2, 0xe1, 0x35, 0xb7, 0xed, + 0x75, 0x16, 0xdb, 0x8e, 0xd7, 0xc2, 0x2b, 0x6c, 0xe2, 0x1e, 0xa2, 0xe0, 0xea, 0xb0, 0x44, 0x9b, + 0xb2, 0x54, 0xcd, 0x3b, 0x29, 0x45, 0x89, 0xe2, 0xa8, 0x51, 0x7b, 0xb8, 0x9c, 0xcc, 0xa9, 0x4f, + 0xd7, 0xb9, 0x91, 0x56, 0xb7, 0x63, 0xce, 0x8d, 0x36, 0xe0, 0x6c, 0xaa, 0x19, 0xa4, 0x38, 0xd2, + 0xc0, 0x69, 0x71, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x18, 0x4d, 0xf1, 0x15, 0xb6, 0x22, + 0x13, 0x46, 0xb9, 0xb4, 0x51, 0x43, 0xa6, 0x71, 0x59, 0x64, 0x89, 0x14, 0x72, 0x09, 0xf2, 0x8d, + 0xc6, 0xaa, 0x1a, 0xd0, 0x31, 0x0c, 0x7d, 0x8b, 0xc1, 0x58, 0x0f, 0xa1, 0x19, 0x48, 0xb9, 0x1d, + 0xd6, 0xa4, 0x41, 0x24, 0xde, 0x12, 0x7d, 0x39, 0x99, 0xc7, 0x85, 0xa4, 0xbd, 0xc5, 0x3c, 0x4e, + 0x66, 0xef, 0x3c, 0xcc, 0xd4, 0xc2, 0x90, 0x06, 0x11, 0x8f, 0x08, 0x1f, 0xf6, 0xda, 0x34, 0x10, + 0x63, 0x4d, 0xc8, 0x18, 0xfe, 0x12, 0x79, 0x33, 0xb4, 0x06, 0x22, 0x92, 0x6b, 0x50, 0xac, 0xf5, + 0x5c, 0x8f, 0x76, 0x9a, 0x9a, 0x63, 0xbc, 0x23, 0x60, 0x56, 0x9c, 0x4a, 0x3e, 0x80, 0xf3, 0x82, + 0x48, 0x0a, 0x1c, 0xd1, 0x02, 0x5c, 0xd6, 0xf0, 0x1d, 0xac, 0x98, 0x0b, 0x52, 0x4c, 0xd9, 0xa2, + 0x49, 0xb2, 0x29, 0x49, 0x0d, 0x2a, 0x8b, 0x78, 0x4e, 0x2a, 0x5f, 0x14, 0xf6, 0x03, 0x11, 0xf9, + 0x17, 0x25, 0x17, 0x3f, 0x43, 0xb5, 0xdd, 0x38, 0xd1, 0xea, 0x43, 0x27, 0x0f, 0xe0, 0x6c, 0x1a, + 0xc6, 0xe4, 0x71, 0x29, 0x79, 0xf1, 0xab, 0x8f, 0x0b, 0x0a, 0xe6, 0x2c, 0x2a, 0xb2, 0x0d, 0xd3, + 0xb5, 0x28, 0x0a, 0xbc, 0xed, 0x5e, 0x44, 0x53, 0xa2, 0x4b, 0x1a, 0x1a, 0xe3, 0x74, 0x29, 0xbe, + 0x9e, 0x13, 0x83, 0xf1, 0xac, 0x13, 0x53, 0xc6, 0x22, 0xcc, 0xea, 0x67, 0x47, 0xdc, 0xf8, 0xd1, + 0x40, 0xf1, 0xb0, 0x9e, 0xb8, 0xcd, 0x24, 0x0d, 0xba, 0xb5, 0xf0, 0xa0, 0xdd, 0xa6, 0x51, 0x80, + 0x27, 0xf7, 0xf8, 0xf0, 0x9e, 0x29, 0x7c, 0x80, 0x2e, 0x2b, 0x6f, 0x65, 0xe2, 0xe3, 0x8a, 0x9a, + 0x7b, 0xa4, 0xc6, 0x53, 0x5b, 0x3e, 0xca, 0x43, 0x2e, 0x1f, 0x2d, 0x98, 0x5e, 0xec, 0x34, 0x83, + 0x03, 0xbc, 0x56, 0x29, 0x0b, 0x37, 0x71, 0x42, 0xe1, 0xe4, 0xab, 0x1a, 0x57, 0x1c, 0x39, 0xc2, + 0xb2, 0x8a, 0xd7, 0xcf, 0xd8, 0xfc, 0xff, 0xa0, 0x92, 0x6e, 0xcb, 0x8f, 0xf9, 0x52, 0xf2, 0x69, + 0x5c, 0xb3, 0x59, 0x4f, 0xa7, 0xeb, 0x42, 0x66, 0xb5, 0xe7, 0x70, 0x8d, 0xe4, 0x4a, 0xbc, 0xf2, + 0x70, 0xad, 0xf6, 0x08, 0xae, 0x9c, 0xc6, 0xb9, 0xac, 0x69, 0x6c, 0xfe, 0x52, 0x0e, 0xa6, 0xb9, + 0x37, 0xe9, 0xb3, 0xaf, 0x2b, 0xbe, 0xab, 0x09, 0x67, 0x69, 0x0b, 0x4c, 0xd5, 0xee, 0x18, 0x6d, + 0xf1, 0x6b, 0x70, 0xbe, 0xaf, 0x29, 0x50, 0x40, 0x2f, 0x48, 0x3f, 0xde, 0x3e, 0x11, 0x3d, 0x93, + 0x9d, 0xc9, 0xe6, 0x6d, 0xab, 0x8f, 0xc2, 0xfc, 0xbb, 0xb9, 0x3e, 0xfe, 0x42, 0x6f, 0x54, 0x35, + 0x41, 0xe3, 0x74, 0x9a, 0x60, 0xee, 0x23, 0x69, 0x82, 0xf9, 0x61, 0x34, 0xc1, 0x0f, 0x60, 0x62, + 0x9d, 0x3a, 0x4c, 0xa3, 0x11, 0x37, 0xdd, 0x0a, 0xda, 0x53, 0xb5, 0x2c, 0x4d, 0xca, 0x97, 0xf8, + 0x96, 0x6c, 0xc4, 0x08, 0x98, 0x68, 0xe1, 0x57, 0xdf, 0x2c, 0x9d, 0x83, 0xba, 0x68, 0x8c, 0x0c, + 0x5e, 0x34, 0xcc, 0xbf, 0x62, 0xc0, 0xf3, 0x6c, 0x41, 0xeb, 0x13, 0x4c, 0x5b, 0x4e, 0xc0, 0x04, + 0x48, 0xc8, 0xb4, 0x48, 0xe9, 0x39, 0x6a, 0x24, 0xb2, 0xb8, 0xdf, 0x65, 0x54, 0x62, 0x31, 0x59, + 0x23, 0x89, 0x85, 0x97, 0x05, 0x77, 0x92, 0x13, 0x30, 0xcd, 0x49, 0x4e, 0xc0, 0xcc, 0xbf, 0x53, + 0x80, 0x0a, 0xf7, 0x86, 0x64, 0x5b, 0x61, 0x11, 0x0a, 0xa7, 0x2f, 0x7c, 0xbf, 0x71, 0xfa, 0xf0, + 0xfd, 0x1f, 0xc1, 0xed, 0x56, 0xb9, 0x59, 0x9d, 0x1f, 0xe2, 0x66, 0xf5, 0x9b, 0xda, 0xb5, 0xe4, + 0x42, 0xf2, 0x3e, 0xe4, 0x7e, 0x6f, 0x9b, 0x1e, 0x7f, 0x21, 0xf9, 0x8e, 0x7a, 0x7f, 0x78, 0x24, + 0x71, 0x48, 0x41, 0xca, 0x63, 0x6e, 0x0e, 0xc7, 0x82, 0x6d, 0xf4, 0x34, 0x2e, 0xe8, 0x63, 0xff, + 0x4f, 0x5d, 0xd0, 0x17, 0x01, 0x94, 0xf8, 0x28, 0xc5, 0xe4, 0x99, 0xc8, 0x93, 0x63, 0xa3, 0x28, + 0x84, 0xe6, 0xbf, 0x2e, 0xc2, 0x74, 0xa3, 0xb1, 0xba, 0xe0, 0x39, 0xbb, 0x1d, 0x3f, 0x8c, 0xbc, + 0xe6, 0x52, 0x67, 0xc7, 0x67, 0x4b, 0xc1, 0x62, 0x10, 0xc4, 0x01, 0x6b, 0x71, 0x29, 0xa0, 0x0c, + 0x60, 0x71, 0x38, 0x9b, 0x0d, 0x8d, 0x1e, 0x8f, 0x5e, 0x91, 0x4b, 0x66, 0x43, 0xc8, 0x41, 0x96, + 0x4c, 0x23, 0xb4, 0x7f, 0x14, 0x0a, 0x5f, 0x91, 0x8b, 0x9a, 0x77, 0x7a, 0x92, 0x2c, 0xde, 0x2b, + 0x43, 0x28, 0x76, 0x99, 0xdd, 0x45, 0xb8, 0xaa, 0xa4, 0xf7, 0x0d, 0xec, 0x08, 0xce, 0x67, 0xce, + 0x39, 0x31, 0xed, 0x07, 0xea, 0x16, 0x2f, 0x8b, 0xb9, 0xff, 0x7c, 0x86, 0x6e, 0xa1, 0x46, 0xbe, + 0xcf, 0x64, 0x4e, 0xfe, 0xc6, 0x49, 0x53, 0x3d, 0xf5, 0xce, 0xd3, 0xb1, 0xb8, 0x18, 0xfe, 0xe3, + 0xb3, 0x78, 0x3f, 0x23, 0xa3, 0x30, 0x76, 0xc6, 0x64, 0x3f, 0x41, 0xcc, 0xfc, 0x73, 0x03, 0x2e, + 0x6a, 0x18, 0x18, 0xbe, 0xaf, 0x4d, 0x3b, 0xd1, 0x09, 0x51, 0x75, 0x3f, 0x7c, 0x3a, 0x23, 0xf7, + 0x45, 0xbd, 0x2e, 0x3c, 0xf6, 0x30, 0x66, 0xaf, 0x6e, 0x0f, 0x07, 0x94, 0x90, 0xec, 0xc2, 0x34, + 0x26, 0x49, 0xa5, 0x87, 0x8d, 0x4a, 0x9c, 0x70, 0xe5, 0xfa, 0x9b, 0x7f, 0x7a, 0x58, 0x3d, 0xa7, + 0x25, 0x6c, 0xf1, 0xcc, 0xf1, 0x36, 0x20, 0x66, 0x1a, 0xab, 0x4a, 0x5e, 0x67, 0xc7, 0xd7, 0xc2, + 0x69, 0xa6, 0x79, 0x92, 0x7f, 0x65, 0xc0, 0x0c, 0x83, 0xf2, 0x72, 0xdf, 0x0d, 0xfc, 0x76, 0x9c, + 0x7e, 0x42, 0x10, 0x81, 0xd6, 0xd3, 0x69, 0xa7, 0x97, 0xb1, 0xc8, 0x7c, 0x9a, 0xdb, 0x3b, 0x81, + 0xdf, 0x4e, 0x8a, 0xaf, 0xb6, 0xd4, 0xc0, 0x42, 0x92, 0x9f, 0x37, 0xe0, 0x92, 0xb6, 0x85, 0x52, + 0x2f, 0xe4, 0xcd, 0x94, 0x34, 0xc3, 0x80, 0x9a, 0x54, 0xbf, 0x29, 0x46, 0xff, 0x2b, 0x58, 0x82, + 0x64, 0x01, 0xc0, 0xb2, 0xd8, 0x6d, 0x8e, 0xa5, 0x14, 0x61, 0x70, 0x2e, 0xe6, 0xd7, 0x73, 0x30, + 0xae, 0x2c, 0xaa, 0xe4, 0xf3, 0x50, 0x5e, 0x0d, 0x76, 0x9d, 0x8e, 0xf7, 0x53, 0x8e, 0x72, 0xe8, + 0x88, 0x8b, 0xb6, 0xaf, 0xc0, 0x2d, 0x0d, 0x0b, 0x9d, 0x45, 0xa9, 0xd3, 0x56, 0xd5, 0x3d, 0xb6, + 0x28, 0x5b, 0x08, 0x3d, 0xe5, 0x2a, 0xf2, 0x5e, 0xc6, 0x2a, 0x72, 0xaa, 0xe0, 0x16, 0x6f, 0xf7, + 0xaf, 0x25, 0xc3, 0xc7, 0xa2, 0x30, 0x7f, 0x25, 0x07, 0x15, 0xf1, 0x94, 0xb9, 0x3c, 0x32, 0xfb, + 0x74, 0x3d, 0x7d, 0xa4, 0x57, 0xee, 0x18, 0xa7, 0x90, 0xc2, 0x6f, 0xfc, 0x4e, 0x15, 0x1f, 0xa6, + 0x4e, 0x37, 0x87, 0x7c, 0x98, 0x5a, 0x87, 0xa7, 0xef, 0xcb, 0xa5, 0xa9, 0xac, 0x34, 0xbe, 0xf9, + 0xc7, 0xb9, 0x34, 0x6f, 0x61, 0x43, 0x78, 0x19, 0xc6, 0xf8, 0x4b, 0x94, 0xf2, 0x4a, 0x8f, 0x08, + 0x97, 0x88, 0x20, 0x4b, 0xa6, 0x9d, 0xe6, 0xe6, 0xe4, 0x49, 0xaf, 0x93, 0x93, 0x3b, 0x50, 0x46, + 0x2f, 0xc9, 0x9a, 0xeb, 0x06, 0x6c, 0x6d, 0x2c, 0x24, 0x91, 0x11, 0x1f, 0xd3, 0x6d, 0x9b, 0x7b, + 0x53, 0x3a, 0xae, 0x1b, 0x58, 0x1a, 0x1e, 0x99, 0x87, 0x73, 0x9a, 0x53, 0xae, 0xa4, 0x1f, 0x49, + 0xf6, 0x48, 0x11, 0x26, 0x70, 0xe2, 0x4c, 0x64, 0x0c, 0x9e, 0xcb, 0x1f, 0x8a, 0x47, 0x3d, 0x46, + 0x8f, 0x2a, 0x27, 0x27, 0xbd, 0x3c, 0xa9, 0x27, 0x18, 0x34, 0xa2, 0xed, 0x74, 0xb5, 0x38, 0x2c, + 0x1c, 0xd1, 0xfc, 0x9f, 0x06, 0x9b, 0x6b, 0xcd, 0xfd, 0x4f, 0xd9, 0x9d, 0x4e, 0x56, 0xa5, 0x63, + 0x4c, 0x5c, 0xff, 0xce, 0xe0, 0xb7, 0xb2, 0xc4, 0xf0, 0x79, 0x13, 0x46, 0xf9, 0xbb, 0x97, 0xe2, + 0xfe, 0x90, 0xca, 0x85, 0x27, 0x24, 0x5e, 0x19, 0xfc, 0xf5, 0x4c, 0x4b, 0x10, 0xa8, 0x2a, 0x7e, + 0x6e, 0x28, 0x15, 0x5f, 0x09, 0x05, 0x3e, 0xdc, 0x13, 0x13, 0xc6, 0xc9, 0xa1, 0xc0, 0xcd, 0xff, + 0x9d, 0xe3, 0xf5, 0x11, 0x85, 0x1a, 0x36, 0xc6, 0xed, 0x2b, 0x50, 0xc0, 0x17, 0xd6, 0x95, 0x40, + 0xc2, 0xa9, 0xd7, 0xd5, 0x31, 0x9d, 0xcd, 0x1b, 0x94, 0xb5, 0xea, 0x35, 0x62, 0x14, 0xc7, 0xea, + 0xbc, 0x41, 0x0c, 0x7c, 0xc0, 0xc1, 0x77, 0xa9, 0x3a, 0x1d, 0x3a, 0xfa, 0x5b, 0x1b, 0x98, 0xce, + 0xf4, 0xf7, 0xf8, 0x36, 0x8f, 0x6a, 0xc6, 0x6f, 0xef, 0x38, 0x36, 0xbf, 0x45, 0xa2, 0x4a, 0xdb, + 0xe4, 0xe2, 0xcf, 0x22, 0x4c, 0xea, 0xe1, 0x41, 0x84, 0xa9, 0x0d, 0xa3, 0xac, 0xa4, 0x42, 0x8b, + 0xa8, 0x46, 0x1d, 0x9d, 0x88, 0xed, 0x8f, 0xb4, 0x18, 0x10, 0x6a, 0xdc, 0x73, 0x1e, 0x90, 0xcd, + 0xee, 0x0f, 0x5e, 0xa4, 0x93, 0x28, 0xc7, 0xc4, 0x9f, 0x83, 0x8a, 0x98, 0x99, 0xf1, 0x8d, 0x6e, + 0x34, 0x68, 0x2c, 0x2d, 0x58, 0xea, 0x6c, 0x6a, 0x7a, 0x6e, 0x60, 0x21, 0xd4, 0xfc, 0xb6, 0x01, + 0x97, 0xc4, 0x7b, 0x9e, 0x16, 0x0d, 0xa3, 0xc0, 0xe3, 0x17, 0xc4, 0x71, 0x3c, 0x7e, 0x9e, 0xbc, + 0x2d, 0x63, 0x3d, 0xea, 0x02, 0x32, 0x9d, 0x47, 0x7d, 0x42, 0x0c, 0xca, 0x11, 0x8c, 0xf6, 0x28, + 0x63, 0x3c, 0xbe, 0x29, 0x62, 0x3c, 0xe6, 0x8e, 0x27, 0x8e, 0xe7, 0x85, 0x4b, 0x3b, 0x32, 0xb6, + 0xe3, 0xb7, 0x72, 0x70, 0x3e, 0xa3, 0x58, 0x9b, 0x9f, 0x7f, 0x46, 0x85, 0x43, 0x5d, 0x13, 0x0e, + 0x32, 0x08, 0xf0, 0xc0, 0x86, 0xcf, 0x94, 0x15, 0xbf, 0x65, 0xc0, 0x45, 0x7d, 0xf4, 0x08, 0x0b, + 0xec, 0xe6, 0x6d, 0xf2, 0x16, 0x8c, 0xde, 0xa7, 0x8e, 0x4b, 0xe5, 0xc5, 0xc3, 0x38, 0xa0, 0xa6, + 0x38, 0x13, 0xe5, 0x89, 0x9c, 0xed, 0x1f, 0xf3, 0xa9, 0x7c, 0xc6, 0x12, 0x24, 0x64, 0x41, 0x14, + 0x8e, 0x3b, 0x65, 0x98, 0xd2, 0x3f, 0x21, 0x2b, 0xab, 0x63, 0xcc, 0x41, 0xbf, 0x67, 0xc0, 0x73, + 0xc7, 0xd0, 0xb0, 0x8e, 0x63, 0x5d, 0xaf, 0x76, 0x1c, 0x2e, 0x2c, 0x08, 0x25, 0xef, 0xc2, 0xd4, + 0xba, 0x50, 0x5d, 0x65, 0x77, 0x28, 0x0f, 0xaa, 0x48, 0xad, 0xd6, 0x96, 0xfd, 0x92, 0x46, 0x26, + 0xd7, 0xa0, 0x78, 0xdf, 0x0f, 0xa3, 0x4e, 0x12, 0x9f, 0x0d, 0x6d, 0xde, 0x7b, 0x02, 0x66, 0xc5, + 0xa9, 0x4c, 0x2d, 0xd0, 0x8b, 0x29, 0x9c, 0x00, 0x5f, 0x84, 0x51, 0x86, 0x13, 0xdb, 0x94, 0x70, + 0x1c, 0xe0, 0x6b, 0x93, 0x9e, 0x6b, 0x89, 0xa4, 0xd8, 0x9a, 0x99, 0xcb, 0x3c, 0xab, 0xff, 0xba, + 0x01, 0x15, 0x9d, 0xf7, 0xc7, 0xed, 0x9a, 0x77, 0xb4, 0xae, 0x79, 0x2e, 0xbb, 0x6b, 0x06, 0xf7, + 0x49, 0x5f, 0xa8, 0xa4, 0xa1, 0xfa, 0xc2, 0x84, 0xd1, 0x05, 0xbf, 0xed, 0x78, 0x1d, 0x35, 0xbc, + 0x8f, 0x8b, 0x10, 0x4b, 0xa4, 0x28, 0xad, 0x95, 0x1f, 0xd8, 0x5a, 0xe6, 0x37, 0x0b, 0x70, 0xc9, + 0xa2, 0xbb, 0x1e, 0x53, 0x90, 0x36, 0x42, 0xaf, 0xb3, 0xab, 0x79, 0x52, 0x98, 0xa9, 0x06, 0x17, + 0xfe, 0xe3, 0x0c, 0x12, 0xb7, 0xf7, 0x75, 0x28, 0x32, 0x29, 0xad, 0xb4, 0x39, 0x9a, 0xfa, 0x30, + 0x48, 0x1d, 0xef, 0x57, 0x99, 0x4c, 0x6e, 0x88, 0x35, 0x44, 0xb9, 0xe1, 0xc3, 0xd6, 0x90, 0x1f, + 0x1c, 0x56, 0x81, 0xbf, 0x68, 0xc0, 0x52, 0xc5, 0x3a, 0x12, 0x2b, 0x55, 0x85, 0x01, 0x4a, 0xd5, + 0x43, 0x38, 0x57, 0x73, 0xb9, 0x7c, 0x72, 0x5a, 0x6b, 0x81, 0xd7, 0x69, 0x7a, 0x5d, 0xa7, 0x25, + 0x95, 0x72, 0x34, 0x0d, 0x39, 0x71, 0xba, 0xdd, 0x8d, 0x11, 0xac, 0x4c, 0x32, 0x56, 0x8d, 0x85, + 0x95, 0x06, 0x8f, 0x41, 0xc6, 0xed, 0x3d, 0x58, 0x0d, 0xb7, 0x13, 0xf2, 0x20, 0x64, 0x56, 0x9c, + 0x8c, 0xea, 0x1c, 0x5e, 0xf2, 0x5b, 0x5f, 0x6e, 0x3c, 0x10, 0x97, 0xe6, 0xa4, 0x03, 0x32, 0xbf, + 0x13, 0x18, 0xb5, 0x42, 0xb4, 0x5a, 0x6b, 0x78, 0x09, 0x5d, 0xa3, 0x71, 0x9f, 0xd1, 0x15, 0xfb, + 0xe8, 0xc2, 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0x64, 0x16, 0x80, 0xbb, 0x70, 0xe2, 0x80, 0x28, 0x25, + 0xca, 0x5f, 0x80, 0x50, 0xae, 0xfc, 0x29, 0x28, 0xe4, 0x6d, 0x38, 0xbb, 0x38, 0x3f, 0x27, 0x6f, + 0xc3, 0x2d, 0xf8, 0xcd, 0x1e, 0xdb, 0x3e, 0xe3, 0xed, 0xcc, 0x32, 0xef, 0x43, 0xda, 0x9c, 0x63, + 0xa3, 0x20, 0x0b, 0x4d, 0xdc, 0x89, 0xe3, 0x37, 0xaa, 0xe7, 0x7d, 0x97, 0x86, 0x9b, 0xb7, 0x3e, + 0x65, 0x77, 0xe2, 0x94, 0xba, 0xe1, 0x6c, 0xbb, 0x95, 0x39, 0x33, 0xff, 0x3a, 0xde, 0x89, 0xeb, + 0xc3, 0x25, 0x3f, 0x0a, 0x23, 0xf8, 0x29, 0x56, 0xdc, 0xb3, 0x19, 0x6c, 0x93, 0xd5, 0xb6, 0xc9, + 0xc3, 0x49, 0x21, 0x01, 0x59, 0x4a, 0xde, 0x8b, 0x39, 0xc5, 0xcd, 0x0e, 0x11, 0x96, 0x41, 0x7f, + 0x28, 0xcc, 0x85, 0xb2, 0x9a, 0x21, 0x1b, 0x23, 0xf7, 0x9d, 0x70, 0x8f, 0xba, 0xf3, 0xf2, 0xa9, + 0xdf, 0x32, 0x1f, 0x23, 0x7b, 0x08, 0xc5, 0x47, 0xcc, 0x2c, 0x05, 0x85, 0x49, 0x87, 0xa5, 0x70, + 0x23, 0x14, 0x45, 0x11, 0xbb, 0x20, 0x0f, 0x77, 0xaf, 0xae, 0x25, 0x92, 0x50, 0x5a, 0x4a, 0xab, + 0x60, 0xe0, 0x34, 0xf7, 0x69, 0xb0, 0x79, 0xeb, 0x93, 0x90, 0x96, 0x7a, 0x1e, 0xc7, 0xf4, 0xc9, + 0xaf, 0x16, 0xe3, 0x68, 0x68, 0x1a, 0x32, 0xd3, 0x11, 0x13, 0x7f, 0x34, 0x23, 0xd1, 0x11, 0x13, + 0x7f, 0x34, 0x55, 0x47, 0x8c, 0x51, 0xe3, 0x60, 0xf5, 0xb9, 0x13, 0x82, 0xd5, 0x0f, 0x78, 0x1f, + 0x43, 0x5e, 0x65, 0xf8, 0x14, 0x3d, 0x15, 0xf4, 0x05, 0x28, 0xd7, 0xa2, 0xc8, 0x69, 0xee, 0x51, + 0x17, 0x1f, 0x45, 0x50, 0xdc, 0x60, 0x1c, 0x01, 0x57, 0x9d, 0xa4, 0x55, 0x5c, 0xe5, 0xa9, 0xb0, + 0xb1, 0x21, 0x9e, 0x0a, 0x9b, 0x85, 0xb1, 0xa5, 0xce, 0x23, 0x8f, 0xb5, 0x49, 0x31, 0x09, 0x89, + 0xe4, 0x71, 0x90, 0xfe, 0xbe, 0x14, 0x82, 0xc8, 0x9b, 0x8a, 0x06, 0x51, 0x4a, 0x54, 0x79, 0xbe, + 0xcd, 0xb2, 0xa5, 0x22, 0xa1, 0x1e, 0x36, 0x48, 0x74, 0x72, 0x07, 0xc6, 0xe4, 0xee, 0x19, 0x12, + 0xf5, 0x5d, 0x50, 0x3a, 0x3c, 0x45, 0x8b, 0xc2, 0x24, 0x76, 0xcf, 0x6f, 0xeb, 0xb7, 0x26, 0xc7, + 0x95, 0x68, 0x24, 0xca, 0xad, 0x49, 0x2d, 0x1a, 0x89, 0x72, 0x7f, 0x32, 0xde, 0x0c, 0x95, 0x4f, + 0xdc, 0x0c, 0x6d, 0x42, 0x79, 0xcd, 0x09, 0x22, 0x8f, 0x2d, 0x47, 0x9d, 0x88, 0x47, 0xb2, 0x4c, + 0xf6, 0xea, 0x4a, 0x52, 0xfd, 0x05, 0x19, 0x95, 0xa3, 0xab, 0xe0, 0xeb, 0xe1, 0x1c, 0x12, 0x38, + 0x59, 0xc9, 0xf0, 0xab, 0x17, 0x71, 0x97, 0xd1, 0xa6, 0xae, 0x18, 0xae, 0x44, 0x8d, 0x54, 0xcb, + 0x68, 0xbf, 0x4b, 0xfe, 0x6d, 0xde, 0x07, 0xb8, 0x67, 0x9c, 0x42, 0x36, 0x18, 0x53, 0x0b, 0xf5, + 0x8a, 0xd4, 0xc6, 0x31, 0x46, 0x24, 0x5f, 0x85, 0x32, 0xfb, 0x8f, 0x61, 0xfd, 0x3c, 0xca, 0x23, + 0x55, 0x26, 0x7e, 0xd6, 0xfa, 0x84, 0xe6, 0xb1, 0xff, 0x1a, 0x34, 0xe2, 0x13, 0x18, 0x19, 0xa7, + 0x0d, 0x2f, 0x1a, 0x37, 0xf3, 0xfb, 0x06, 0x5c, 0x1c, 0xc0, 0x63, 0xe8, 0x47, 0x02, 0x67, 0x93, + 0x05, 0x49, 0xd9, 0x9b, 0x8b, 0x05, 0x49, 0x1d, 0x18, 0x72, 0x69, 0xca, 0x8e, 0x31, 0x99, 0xff, + 0xc4, 0x62, 0x4c, 0x9a, 0x87, 0x06, 0x8c, 0x2b, 0x3d, 0xfb, 0x14, 0xdf, 0xfe, 0x79, 0x45, 0x04, + 0x5b, 0xce, 0x27, 0x78, 0xa9, 0x27, 0xff, 0x79, 0x70, 0xe5, 0xaf, 0x01, 0x2c, 0x3b, 0x61, 0x54, + 0x6b, 0x46, 0xde, 0x23, 0x3a, 0x84, 0x18, 0x4b, 0xc2, 0xd3, 0x38, 0x18, 0xbb, 0x9c, 0x91, 0xf5, + 0x85, 0xa7, 0x89, 0x19, 0x9a, 0x2b, 0x30, 0xda, 0xf0, 0x83, 0xa8, 0x7e, 0xc0, 0xd7, 0xa6, 0x05, + 0x1a, 0x36, 0x55, 0x0b, 0x9d, 0x87, 0x7b, 0xf5, 0xa6, 0x25, 0x92, 0x98, 0x82, 0x78, 0xd7, 0xa3, + 0x2d, 0x57, 0xf5, 0x4b, 0xd8, 0x61, 0x00, 0x8b, 0xc3, 0x6f, 0xbc, 0x07, 0x53, 0x32, 0xde, 0xeb, + 0xfa, 0x72, 0x03, 0x6b, 0x30, 0x05, 0xe3, 0x9b, 0x8b, 0xd6, 0xd2, 0xdd, 0x2f, 0xdb, 0x77, 0x37, + 0x96, 0x97, 0x2b, 0x67, 0xc8, 0x04, 0x94, 0x04, 0x60, 0xbe, 0x56, 0x31, 0x48, 0x19, 0x8a, 0x4b, + 0x2b, 0x8d, 0xc5, 0xf9, 0x0d, 0x6b, 0xb1, 0x92, 0xbb, 0xf1, 0x32, 0x4c, 0x26, 0x5e, 0x07, 0x18, + 0x99, 0x60, 0x0c, 0xf2, 0x56, 0x6d, 0xab, 0x72, 0x86, 0x00, 0x8c, 0xae, 0x3d, 0x98, 0x6f, 0xdc, + 0xba, 0x55, 0x31, 0x6e, 0x7c, 0x0e, 0xa6, 0xd1, 0x6a, 0xb7, 0xcc, 0x94, 0xe8, 0x0e, 0x0d, 0x30, + 0xa7, 0x32, 0x14, 0x1b, 0xb4, 0xeb, 0x04, 0x4e, 0x44, 0x79, 0x36, 0x0f, 0x7b, 0xad, 0xc8, 0xeb, + 0xb6, 0xe8, 0x93, 0x8a, 0x71, 0xe3, 0x4d, 0x98, 0xb2, 0xfc, 0x5e, 0xe4, 0x75, 0x76, 0x65, 0xd4, + 0x76, 0x72, 0x1e, 0xa6, 0x37, 0x56, 0x6a, 0x0f, 0xeb, 0x4b, 0xf7, 0x36, 0x56, 0x37, 0x1a, 0xf6, + 0xc3, 0xda, 0xfa, 0xfc, 0xfd, 0xca, 0x19, 0x56, 0xe0, 0x87, 0xab, 0x8d, 0x75, 0xdb, 0x5a, 0x9c, + 0x5f, 0x5c, 0x59, 0xaf, 0x18, 0x37, 0x7e, 0xd9, 0x80, 0x49, 0xfd, 0x01, 0x5a, 0x72, 0x15, 0xae, + 0x6c, 0x34, 0x16, 0x2d, 0x7b, 0x7d, 0xf5, 0xc1, 0xe2, 0x8a, 0xbd, 0xd1, 0xa8, 0xdd, 0x5b, 0xb4, + 0x37, 0x56, 0x1a, 0x6b, 0x8b, 0xf3, 0x4b, 0x77, 0x97, 0x16, 0x17, 0x2a, 0x67, 0x48, 0x15, 0x9e, + 0x53, 0x30, 0xac, 0xc5, 0xf9, 0xd5, 0xcd, 0x45, 0xcb, 0x5e, 0xab, 0x35, 0x1a, 0x5b, 0xab, 0xd6, + 0x42, 0xc5, 0x20, 0x97, 0xe1, 0x42, 0x06, 0xc2, 0xc3, 0xbb, 0xb5, 0x4a, 0xae, 0x2f, 0x6d, 0x65, + 0x71, 0xab, 0xb6, 0x6c, 0xd7, 0x57, 0xd7, 0x2b, 0xf9, 0x1b, 0xef, 0x31, 0x2d, 0x24, 0x79, 0x21, + 0x8a, 0x14, 0xa1, 0xb0, 0xb2, 0xba, 0xb2, 0x58, 0x39, 0x43, 0xc6, 0x61, 0x6c, 0x6d, 0x71, 0x65, + 0x61, 0x69, 0xe5, 0x1e, 0x6f, 0xd6, 0xda, 0xda, 0x9a, 0xb5, 0xba, 0xb9, 0xb8, 0x50, 0xc9, 0xb1, + 0xb6, 0x5b, 0x58, 0x5c, 0x61, 0x25, 0xcb, 0xdf, 0x30, 0xf9, 0xab, 0x08, 0x5a, 0x50, 0x6f, 0xd6, + 0x5a, 0x8b, 0x5f, 0x5a, 0x5f, 0x5c, 0x69, 0x2c, 0xad, 0xae, 0x54, 0xce, 0xdc, 0xb8, 0x92, 0xc2, + 0x91, 0x3d, 0xd1, 0x68, 0xdc, 0xaf, 0x9c, 0xb9, 0xf1, 0x55, 0x28, 0xab, 0x8b, 0x30, 0xb9, 0x08, + 0x67, 0xd5, 0xef, 0x35, 0xda, 0x71, 0xbd, 0xce, 0x6e, 0xe5, 0x4c, 0x3a, 0xc1, 0xea, 0x75, 0x3a, + 0x2c, 0x01, 0x2b, 0xaf, 0x26, 0xac, 0xd3, 0xa0, 0xed, 0x75, 0xd8, 0xfa, 0x5a, 0xc9, 0xd5, 0x2b, + 0xdf, 0xfd, 0xb3, 0x17, 0xce, 0x7c, 0xf7, 0x7b, 0x2f, 0x18, 0x7f, 0xfc, 0xbd, 0x17, 0x8c, 0xff, + 0xf2, 0xbd, 0x17, 0x8c, 0xed, 0x51, 0x1c, 0xe8, 0xb7, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x39, 0xc0, 0xed, 0x7b, 0xe2, 0xbc, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -15785,6 +15903,56 @@ func (m *ClaimMapping) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TraitMapping) 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 *TraitMapping) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TraitMapping) 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 len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Roles[iNdEx]) + copy(dAtA[i:], m.Roles[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Trait) > 0 { + i -= len(m.Trait) + copy(dAtA[i:], m.Trait) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Trait))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Rule) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -19059,6 +19227,141 @@ func (m *GithubConnectorSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SAMLAttributesToRolesWarnings) 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 *SAMLAttributesToRolesWarnings) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SAMLAttributesToRolesWarnings) 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 len(m.Warnings) > 0 { + for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Warnings[iNdEx]) + copy(dAtA[i:], m.Warnings[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Warnings[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateUserParams) 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 *CreateUserParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CreateUserParams) 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.SessionTTL != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.SessionTTL)) + i-- + dAtA[i] = 0x40 + } + { + size := m.Traits.Size() + i -= size + if _, err := m.Traits.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Roles[iNdEx]) + copy(dAtA[i:], m.Roles[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } + if len(m.KubeUsers) > 0 { + for iNdEx := len(m.KubeUsers) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.KubeUsers[iNdEx]) + copy(dAtA[i:], m.KubeUsers[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeUsers[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.KubeGroups) > 0 { + for iNdEx := len(m.KubeGroups) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.KubeGroups[iNdEx]) + copy(dAtA[i:], m.KubeGroups[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeGroups[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Logins) > 0 { + for iNdEx := len(m.Logins) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Logins[iNdEx]) + copy(dAtA[i:], m.Logins[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Logins[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Username) > 0 { + i -= len(m.Username) + copy(dAtA[i:], m.Username) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Username))) + i-- + dAtA[i] = 0x12 + } + if len(m.ConnectorName) > 0 { + i -= len(m.ConnectorName) + copy(dAtA[i:], m.ConnectorName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ConnectorName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *SSODiagnosticInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -19083,17 +19386,103 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + if len(m.SAMLConnectorTraitMapping) > 0 { + for iNdEx := len(m.SAMLConnectorTraitMapping) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SAMLConnectorTraitMapping[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } + { + size := m.SAMLTraitsFromAssertions.Size() + i -= size + if _, err := m.SAMLTraitsFromAssertions.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + if m.SAMLAssertionInfo != nil { + { + size := m.SAMLAssertionInfo.Size() + i -= size + if _, err := m.SAMLAssertionInfo.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + { + size := m.SAMLAttributeStatements.Size() + i -= size + if _, err := m.SAMLAttributeStatements.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + if m.SAMLAttributesToRolesWarnings != nil { + { + size, err := m.SAMLAttributesToRolesWarnings.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.SAMLAttributesToRoles) > 0 { + for iNdEx := len(m.SAMLAttributesToRoles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SAMLAttributesToRoles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if m.CreateUserParams != nil { + { + size, err := m.CreateUserParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Success) > 0 { + i -= len(m.Success) + copy(dAtA[i:], m.Success) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Success))) i-- dAtA[i] = 0x12 } - if m.InfoType != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.InfoType)) + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -19449,12 +19838,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n169, err169 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err169 != nil { - return 0, err169 + n174, err174 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err174 != nil { + return 0, err174 } - i -= n169 - i = encodeVarintTypes(dAtA, i, uint64(n169)) + i -= n174 + i = encodeVarintTypes(dAtA, i, uint64(n174)) i-- dAtA[i] = 0x1a } @@ -20135,12 +20524,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n179, err179 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err179 != nil { - return 0, err179 + n184, err184 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err184 != nil { + return 0, err184 } - i -= n179 - i = encodeVarintTypes(dAtA, i, uint64(n179)) + i -= n184 + i = encodeVarintTypes(dAtA, i, uint64(n184)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -20370,20 +20759,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err182 != nil { - return 0, err182 + n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err187 != nil { + return 0, err187 } - i -= n182 - i = encodeVarintTypes(dAtA, i, uint64(n182)) + i -= n187 + i = encodeVarintTypes(dAtA, i, uint64(n187)) i-- dAtA[i] = 0x2a - n183, err183 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err183 != nil { - return 0, err183 + n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err188 != nil { + return 0, err188 } - i -= n183 - i = encodeVarintTypes(dAtA, i, uint64(n183)) + i -= n188 + i = encodeVarintTypes(dAtA, i, uint64(n188)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -20487,12 +20876,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n184, err184 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err184 != nil { - return 0, err184 + n189, err189 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err189 != nil { + return 0, err189 } - i -= n184 - i = encodeVarintTypes(dAtA, i, uint64(n184)) + i -= n189 + i = encodeVarintTypes(dAtA, i, uint64(n189)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -23208,6 +23597,32 @@ func (m *ClaimMapping) Size() (n int) { return n } +func (m *TraitMapping) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Trait) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Rule) Size() (n int) { if m == nil { return 0 @@ -24692,19 +25107,119 @@ func (m *GithubConnectorSpecV3) Size() (n int) { return n } +func (m *SAMLAttributesToRolesWarnings) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CreateUserParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ConnectorName) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Username) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Logins) > 0 { + for _, s := range m.Logins { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.KubeGroups) > 0 { + for _, s := range m.KubeGroups { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.KubeUsers) > 0 { + for _, s := range m.KubeUsers { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = m.Traits.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SessionTTL != 0 { + n += 1 + sovTypes(uint64(m.SessionTTL)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *SSODiagnosticInfo) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.InfoType != 0 { - n += 1 + sovTypes(uint64(m.InfoType)) + l = len(m.Error) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) } - l = len(m.Value) + l = len(m.Success) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.CreateUserParams != nil { + l = m.CreateUserParams.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.SAMLAttributesToRoles) > 0 { + for _, e := range m.SAMLAttributesToRoles { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.SAMLAttributesToRolesWarnings != nil { + l = m.SAMLAttributesToRolesWarnings.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = m.SAMLAttributeStatements.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.SAMLAssertionInfo != nil { + l = m.SAMLAssertionInfo.Size() + n += 1 + l + sovTypes(uint64(l)) + } + l = m.SAMLTraitsFromAssertions.Size() + n += 1 + l + sovTypes(uint64(l)) + if len(m.SAMLConnectorTraitMapping) > 0 { + for _, e := range m.SAMLConnectorTraitMapping { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -43532,7 +44047,7 @@ func (m *ClaimMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *Rule) Unmarshal(dAtA []byte) error { +func (m *TraitMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -43555,15 +44070,15 @@ func (m *Rule) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Rule: wiretype end group for non-group") + return fmt.Errorf("proto: TraitMapping: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TraitMapping: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Trait", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43591,11 +44106,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex])) + m.Trait = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43623,43 +44138,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex])) + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Where = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43687,7 +44170,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -43711,7 +44194,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { } return nil } -func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { +func (m *Rule) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -43734,15 +44217,15 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group") + return fmt.Errorf("proto: Rule: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43770,11 +44253,11 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) + m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43802,7 +44285,7 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: if wireType != 2 { @@ -43836,62 +44319,11 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { } m.Where = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - 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 *BoolValue) 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 ErrIntOverflowTypes - } - 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: BoolValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -43901,12 +44333,24 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Value = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -43929,7 +44373,7 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserV2) Unmarshal(dAtA []byte) error { +func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -43952,15 +44396,15 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserV2: wiretype end group for non-group") + return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -43988,11 +44432,11 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -44020,11 +44464,11 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SubKind = string(dAtA[iNdEx:postIndex]) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -44052,46 +44496,64 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.Where = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - if msglen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BoolValue) 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 ErrIntOverflowTypes + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BoolValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44101,25 +44563,12 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.Value = bool(v != 0) default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -44142,7 +44591,7 @@ func (m *UserV2) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserSpecV2) Unmarshal(dAtA []byte) error { +func (m *UserV2) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -44165,17 +44614,17 @@ func (m *UserSpecV2) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserSpecV2: wiretype end group for non-group") + return fmt.Errorf("proto: UserV2: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserSpecV2: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OIDCIdentities", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44185,31 +44634,29 @@ func (m *UserSpecV2) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.OIDCIdentities = append(m.OIDCIdentities, ExternalIdentity{}) - if err := m.OIDCIdentities[len(m.OIDCIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Kind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SAMLIdentities", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44219,31 +44666,29 @@ func (m *UserSpecV2) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.SAMLIdentities = append(m.SAMLIdentities, ExternalIdentity{}) - if err := m.SAMLIdentities[len(m.SAMLIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.SubKind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GithubIdentities", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44253,31 +44698,29 @@ func (m *UserSpecV2) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.GithubIdentities = append(m.GithubIdentities, ExternalIdentity{}) - if err := m.GithubIdentities[len(m.GithubIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Version = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -44287,27 +44730,246 @@ func (m *UserSpecV2) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *UserSpecV2) 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 ErrIntOverflowTypes + } + 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: UserSpecV2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserSpecV2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OIDCIdentities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OIDCIdentities = append(m.OIDCIdentities, ExternalIdentity{}) + if err := m.OIDCIdentities[len(m.OIDCIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SAMLIdentities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SAMLIdentities = append(m.SAMLIdentities, ExternalIdentity{}) + if err := m.SAMLIdentities[len(m.SAMLIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GithubIdentities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GithubIdentities = append(m.GithubIdentities, ExternalIdentity{}) + if err := m.GithubIdentities[len(m.GithubIdentities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -51995,8 +52657,485 @@ func (m *SAMLConnectorV2List) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SAMLConnectors = append(m.SAMLConnectors, &SAMLConnectorV2{}) - if err := m.SAMLConnectors[len(m.SAMLConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.SAMLConnectors = append(m.SAMLConnectors, &SAMLConnectorV2{}) + if err := m.SAMLConnectors[len(m.SAMLConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *SAMLConnectorSpecV2) 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 ErrIntOverflowTypes + } + 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: SAMLConnectorSpecV2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SAMLConnectorSpecV2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Issuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSO", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SSO = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Cert = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Display = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AssertionConsumerService", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AssertionConsumerService = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Audience", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Audience = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceProviderIssuer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceProviderIssuer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptorURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EntityDescriptorURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AttributesToRoles", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AttributesToRoles = append(m.AttributesToRoles, AttributeMapping{}) + if err := m.AttributesToRoles[len(m.AttributesToRoles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SigningKeyPair", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SigningKeyPair == nil { + m.SigningKeyPair = &AsymmetricKeyPair{} + } + if err := m.SigningKeyPair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Provider = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKeyPair", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.EncryptionKeyPair == nil { + m.EncryptionKeyPair = &AsymmetricKeyPair{} + } + if err := m.EncryptionKeyPair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -52022,7 +53161,7 @@ func (m *SAMLConnectorV2List) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { +func (m *AttributeMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -52045,15 +53184,15 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLConnectorSpecV2: wiretype end group for non-group") + return fmt.Errorf("proto: AttributeMapping: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLConnectorSpecV2: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AttributeMapping: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Issuer", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52081,11 +53220,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Issuer = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SSO", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52113,11 +53252,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SSO = string(dAtA[iNdEx:postIndex]) + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52145,43 +53284,62 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Cert = string(dAtA[iNdEx:postIndex]) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AsymmetricKeyPair) 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 ErrIntOverflowTypes + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.Display = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: + 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: AsymmetricKeyPair: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AssertionConsumerService", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52209,11 +53367,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AssertionConsumerService = string(dAtA[iNdEx:postIndex]) + m.PrivateKey = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Audience", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52241,11 +53399,62 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Audience = string(dAtA[iNdEx:postIndex]) + m.Cert = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *GithubConnectorV3) 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 ErrIntOverflowTypes + } + 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: GithubConnectorV3: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServiceProviderIssuer", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52273,11 +53482,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ServiceProviderIssuer = string(dAtA[iNdEx:postIndex]) + m.Kind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 8: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52305,11 +53514,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) + m.SubKind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 9: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptorURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52337,11 +53546,11 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EntityDescriptorURL = string(dAtA[iNdEx:postIndex]) + m.Version = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 10: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AttributesToRoles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -52368,14 +53577,13 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AttributesToRoles = append(m.AttributesToRoles, AttributeMapping{}) - if err := m.AttributesToRoles[len(m.AttributesToRoles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 11: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SigningKeyPair", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -52402,48 +53610,64 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SigningKeyPair == nil { - m.SigningKeyPair = &AsymmetricKeyPair{} - } - if err := m.SigningKeyPair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GithubConnectorV3List) 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 ErrIntOverflowTypes + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.Provider = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 13: + 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: GithubConnectorV3List: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKeyPair", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -52470,10 +53694,8 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.EncryptionKeyPair == nil { - m.EncryptionKeyPair = &AsymmetricKeyPair{} - } - if err := m.EncryptionKeyPair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{}) + if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -52499,7 +53721,7 @@ func (m *SAMLConnectorSpecV2) Unmarshal(dAtA []byte) error { } return nil } -func (m *AttributeMapping) Unmarshal(dAtA []byte) error { +func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -52522,15 +53744,15 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AttributeMapping: wiretype end group for non-group") + return fmt.Errorf("proto: GithubConnectorSpecV3: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AttributeMapping: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52558,11 +53780,11 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.ClientID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52590,11 +53812,11 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.ClientSecret = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52622,7 +53844,73 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.RedirectURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{}) + if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Display = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -52646,7 +53934,7 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { +func (m *SAMLAttributesToRolesWarnings) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -52669,15 +53957,15 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AsymmetricKeyPair: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLAttributesToRolesWarnings: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLAttributesToRolesWarnings: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52705,11 +53993,11 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.PrivateKey = string(dAtA[iNdEx:postIndex]) + m.Message = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52737,7 +54025,7 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Cert = string(dAtA[iNdEx:postIndex]) + m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -52761,7 +54049,7 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error { } return nil } -func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { +func (m *CreateUserParams) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -52784,15 +54072,15 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GithubConnectorV3: wiretype end group for non-group") + return fmt.Errorf("proto: CreateUserParams: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CreateUserParams: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectorName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52820,11 +54108,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.ConnectorName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52852,11 +54140,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SubKind = string(dAtA[iNdEx:postIndex]) + m.Username = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -52884,13 +54172,13 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubeGroups", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -52900,30 +54188,29 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.KubeGroups = append(m.KubeGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubeUsers", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -52933,79 +54220,59 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.KubeUsers = append(m.KubeUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GithubConnectorV3List) 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 ErrIntOverflowTypes + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes } - if iNdEx >= l { + if postIndex > 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: GithubConnectorV3List: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -53032,11 +54299,29 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{}) - if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionTTL", wireType) + } + m.SessionTTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SessionTTL |= Duration(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -53059,7 +54344,7 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error { } return nil } -func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { +func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -53082,15 +54367,15 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GithubConnectorSpecV3: wiretype end group for non-group") + return fmt.Errorf("proto: SSODiagnosticInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SSODiagnosticInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53118,11 +54403,11 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientID = string(dAtA[iNdEx:postIndex]) + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -53150,13 +54435,13 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientSecret = string(dAtA[iNdEx:postIndex]) + m.Success = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateUserParams", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53166,27 +54451,31 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.RedirectURL = string(dAtA[iNdEx:postIndex]) + if m.CreateUserParams == nil { + m.CreateUserParams = &CreateUserParams{} + } + if err := m.CreateUserParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRoles", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -53213,16 +54502,16 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{}) - if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.SAMLAttributesToRoles = append(m.SAMLAttributesToRoles, AttributeMapping{}) + if err := m.SAMLAttributesToRoles[len(m.SAMLAttributesToRoles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRolesWarnings", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53232,80 +54521,101 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Display = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { + if m.SAMLAttributesToRolesWarnings == nil { + m.SAMLAttributesToRolesWarnings = &SAMLAttributesToRolesWarnings{} + } + if err := m.SAMLAttributesToRolesWarnings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributeStatements", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthTypes } - if (iNdEx + skippy) > l { + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > 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 *SSODiagnosticInfo) 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 ErrIntOverflowTypes + if err := m.SAMLAttributeStatements.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SAMLAssertionInfo", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + var v AssertionInfoWrapper + m.SAMLAssertionInfo = &v + if err := m.SAMLAssertionInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SSODiagnosticInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SSODiagnosticInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InfoType", wireType) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SAMLTraitsFromAssertions", wireType) } - m.InfoType = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53315,16 +54625,30 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.InfoType |= SSOInfoType(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 2: + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SAMLTraitsFromAssertions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAMLConnectorTraitMapping", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -53334,24 +54658,24 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) - if m.Value == nil { - m.Value = []byte{} + m.SAMLConnectorTraitMapping = append(m.SAMLConnectorTraitMapping, TraitMapping{}) + if err := m.SAMLConnectorTraitMapping[len(m.SAMLConnectorTraitMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex default: diff --git a/api/types/types.proto b/api/types/types.proto index b21ec33254398..2a0ae9688420c 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -1810,6 +1810,16 @@ message ClaimMapping { repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ]; } +// TraitMapping maps a trait to teleport roles. +message TraitMapping { + // Trait is a trait name. + string Trait = 1 [ (gogoproto.jsontag) = "trait" ]; + // Value is a trait value to match. + string Value = 2 [ (gogoproto.jsontag) = "value" ]; + // Roles is a list of static teleport roles to match. + repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ]; +} + // Rule represents allow or deny rule that is executed to check // if user or service have access to resource message Rule { @@ -2609,39 +2619,88 @@ message GithubConnectorSpecV3 { string Display = 5 [ (gogoproto.jsontag) = "display" ]; } -// SSOInfoType represents the SSO diagnostic info type. -enum SSOInfoType { - // Unknown info type. - UNKNOWN = 0; - - // Error info type, used for reporting errors. - ERROR = 1; - // Success info type, used for marking successful flows. - SUCCESS = 2; - // Create user params, contains info about attempted user creation parameters. - CREATE_USER_PARAMS = 3; - - // [SAML] Attributes to roles mapping. - SAML_ATTRIBUTES_TO_ROLES = 101; - // [SAML] Attributes to roles warnings. - SAML_ATTRIBUTES_TO_ROLES_WARNINGS = 102; - // [SAML] Assertion info. - SAML_ASSERTION_INFO = 103; - // [SAML] Attribute statements. - SAML_ATTRIBUTE_STATEMENTS = 104; - // [SAML] Traits calculated from assertions. - SAML_TRAITS_FROM_ASSERTIONS = 105; - // [SAML] Assertion-to-trait mapping as specified in the connector. - SAML_CONNECTOR_TRAIT_MAPPING = 106; +// SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the SAML +// attributes to roles. +message SAMLAttributesToRolesWarnings { + // Message is main user-facing message to be shown. + string Message = 1 [ (gogoproto.jsontag) = "message,omitempty" ]; + // Warnings is a set of distinct warnings to be reported. + repeated string Warnings = 2 [ (gogoproto.jsontag) = "warnings,omitempty" ]; +} + +// CreateUserParams represents the user creation parameters as called during SSO login flow. +message CreateUserParams { + // ConnectorName is the name of the connector used for SSO login flow. + string ConnectorName = 1 [ (gogoproto.jsontag) = "connector_name,omitempty" ]; + // Username is the name of the user to be created. + string Username = 2 [ (gogoproto.jsontag) = "username,omitempty" ]; + // Logins is a list of available unix logins. + repeated string Logins = 3 [ (gogoproto.jsontag) = "logins,omitempty" ]; + // KubeGroups is a list of assigned kube groups. + repeated string KubeGroups = 4 [ (gogoproto.jsontag) = "kube_groups,omitempty" ]; + // KubeUsers is a list of available kube users. + repeated string KubeUsers = 5 [ (gogoproto.jsontag) = "kube_users,omitempty" ]; + // Roles is a list of assigned roles. + repeated string Roles = 6 [ (gogoproto.jsontag) = "roles,omitempty" ]; + + // Traits is the set of traits the user is assigned. + wrappers.LabelValues Traits = 7 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "traits,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SessionTTL determines the TTL. + int64 SessionTTL = 8 + [ (gogoproto.jsontag) = "session_ttl,omitempty", (gogoproto.casttype) = "Duration" ]; } // SSODiagnosticInfo is a single SSO diagnostic info entry. message SSODiagnosticInfo { - // SSO Diagnostic info type. - SSOInfoType InfoType = 1 [ (gogoproto.jsontag) = "info_type" ]; - // Value is arbitrary string encoding of particular value. The meaning depends on particular SSO - // diagnostic info type. - bytes Value = 2 [ (gogoproto.jsontag) = "value" ]; + // Error stores user-friendly error message. + string Error = 1 [ (gogoproto.jsontag) = "error" ]; + + // Success if present, marks the flow as finished with success. + string Success = 2 [ (gogoproto.jsontag) = "success" ]; + + // CreateUserParams represents the user creation parameters as called during SSO login flow. + CreateUserParams CreateUserParams = 3 [ (gogoproto.jsontag) = "create_user_params,omitempty" ]; + + // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login + // flow. + repeated AttributeMapping SAMLAttributesToRoles = 4 + [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes_to_roles,omitempty" ]; + + // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the + // SAML attributes to roles. + SAMLAttributesToRolesWarnings SAMLAttributesToRolesWarnings = 5 + [ (gogoproto.jsontag) = "saml_attributes_to_roles_warnings,omitempty" ]; + + // SAMLAttributeStatements represents SAML attribute statements. + wrappers.LabelValues SAMLAttributeStatements = 6 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_attribute_statements,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. + bytes SAMLAssertionInfo = 7 [ + (gogoproto.jsontag) = "saml_assertion_info,omitempty", + (gogoproto.customtype) = "AssertionInfoWrapper" + ]; + + // SAMLTraitsFromAssertions represents traits translated from SAML assertions. + wrappers.LabelValues SAMLTraitsFromAssertions = 8 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_traits_from_assertions,omitempty", + (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" + ]; + + // SAMLConnectorTraitMapping represents connector-specific trait mapping. + repeated TraitMapping SAMLConnectorTraitMapping = 9 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "saml_connector_trait_mapping,omitempty" + ]; } // TeamMapping represents a single team membership mapping. From 171cd7d1813ef48cf10b838af0b6800d17382c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 21 Apr 2022 14:16:55 +0200 Subject: [PATCH 36/50] Switch to structured SSO diag info, store it as single object, submit in one shot. --- lib/auth/auth_with_roles.go | 2 +- lib/auth/clt.go | 8 +-- lib/auth/github.go | 26 -------- lib/auth/saml.go | 124 ++++++++++++++++++------------------ lib/services/identity.go | 2 +- lib/services/local/users.go | 38 ++++------- 6 files changed, 78 insertions(+), 122 deletions(-) diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index ab3a0ca1743a4..a469012140bf5 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -2362,7 +2362,7 @@ func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*s } // GetSSODiagnosticInfo returns SSO diagnostic info records. -func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { +func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { var resource string switch authKind { diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 457315fdd003c..bfbca8337af7c 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -1176,16 +1176,16 @@ func (c *Client) GetSAMLAuthRequest(ctx context.Context, id string) (*services.S } // GetSSODiagnosticInfo returns SSO diagnostic info records. -func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { +func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { out, err := c.Get(ctx, c.Endpoint("sso", "diag", authKind, authRequestID), url.Values{}) if err != nil { return nil, trace.Wrap(err) } - var response []types.SSODiagnosticInfo + var response types.SSODiagnosticInfo if err := json.Unmarshal(out.Bytes(), &response); err != nil { return nil, trace.Wrap(err) } - return response, nil + return &response, nil } // ValidateSAMLResponse validates response returned by SAML identity provider @@ -1783,7 +1783,7 @@ type IdentityService interface { GetSAMLAuthRequest(ctx context.Context, authRequestID string) (*services.SAMLAuthRequest, error) // GetSSODiagnosticInfo returns SSO diagnostic info records. - GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/auth/github.go b/lib/auth/github.go index cb6ca2060f7c1..2872aeee55bfb 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -334,32 +334,6 @@ type createUserParams struct { sessionTTL time.Duration } -func (cup createUserParams) MarshalJSON() ([]byte, error) { - j, err := json.Marshal(struct { - ConnectorName string `json:"connector_name"` - Username string `json:"username"` - Logins []string `json:"logins"` - KubeGroups []string `json:"kube_groups,omitempty"` - KubeUsers []string `json:"kube_users,omitempty"` - Roles []string `json:"roles"` - Traits map[string][]string `json:"traits"` - SessionTTL time.Duration `json:"session_ttl"` - }{ - ConnectorName: cup.connectorName, - Username: cup.username, - Logins: cup.logins, - KubeGroups: cup.kubeGroups, - KubeUsers: cup.kubeUsers, - Roles: cup.roles, - Traits: cup.traits, - SessionTTL: cup.sessionTTL, - }) - if err != nil { - return nil, trace.Wrap(err) - } - return j, nil -} - func (a *Server) calculateGithubUser(connector types.GithubConnector, claims *types.GithubClaims, request *services.GithubAuthRequest) (*createUserParams, error) { p := createUserParams{ connectorName: connector.GetName(), diff --git a/lib/auth/saml.go b/lib/auth/saml.go index c098458bf18dd..0cc68e61a0452 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -178,21 +178,30 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } -func (a *Server) createSSODiagInfo(ctx context.Context, authKind string, id string, infoType types.SSOInfoType, value interface{}) { - entry, err := types.NewSSODiagnosticInfo(infoType, value) - if err != nil { - log.WithError(err).Warn("Failed to serialize SSO diag info.") - } +type ssoDiagContext struct { + authKind string + createSSODiagnosticInfo func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error + + requestID string + testFlow bool + info types.SSODiagnosticInfo +} - err = a.Identity.CreateSSODiagnosticInfo(ctx, authKind, id, *entry) +func (c *ssoDiagContext) Write(ctx context.Context) { + err := c.createSSODiagnosticInfo(ctx, c.authKind, c.requestID, c.info) if err != nil { - log.WithError(err).Warn("Failed to create SSO diag info.") + log.WithError(err).WithField("requestID", c.requestID).Warn("failed to write SSO diag info data") } } -func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { - var err error +func (a *Server) newSSODiagContext(authKind string) *ssoDiagContext { + return &ssoDiagContext{ + authKind: authKind, + createSSODiagnosticInfo: a.Identity.CreateSSODiagnosticInfo, + } +} +func (a *Server) calculateSAMLUser(diagCtx *ssoDiagContext, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { p := createUserParams{ connectorName: connector.GetName(), username: assertionInfo.NameID, @@ -200,30 +209,22 @@ func (a *Server) calculateSAMLUser(ctx context.Context, connector types.SAMLConn p.traits = services.SAMLAssertionsToTraits(assertionInfo) - writeDiagInfo := func(infoType types.SSOInfoType, value interface{}) { - if request.SSOTestFlow { - a.createSSODiagInfo(ctx, types.KindSAML, request.ID, infoType, value) - } - } - - writeDiagInfo(types.SSOInfoType_SAML_TRAITS_FROM_ASSERTIONS, p.traits) - writeDiagInfo(types.SSOInfoType_SAML_CONNECTOR_TRAIT_MAPPING, connector.GetTraitMappings()) + diagCtx.info.SAMLTraitsFromAssertions = p.traits + diagCtx.info.SAMLConnectorTraitMapping = connector.GetTraitMappings() var warnings []string warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits) if len(p.roles) == 0 { - type warn struct { - Message string `json:"message"` - Warnings []string `json:"warnings,omitempty"` - } - if len(warnings) != 0 { - writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{ - Message: "No roles mapped for the user", - Warnings: warnings}) log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SAMLAttributesToRolesWarnings{ + Message: "No roles mapped for the user", + Warnings: warnings, + } } else { - writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES_WARNINGS, warn{Message: "No roles mapped for the user. The mappings may contain typos."}) + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SAMLAttributesToRolesWarnings{ + Message: "No roles mapped for the user. The mappings may contain typos.", + } } return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName()) } @@ -381,12 +382,18 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) Method: events.LoginMethodSAML, } - var auxInfo validateSAMLAuxInfo + diagCtx := a.newSSODiagContext(types.KindSAML) + + auth, err := a.validateSAMLResponse(ctx, diagCtx, samlResponse) + if err != nil { + diagCtx.info.Error = trace.UserMessage(err) + } - auth, err := a.validateSAMLResponse(ctx, samlResponse, &auxInfo) + diagCtx.Write(ctx) - if auxInfo.attributeStatements != nil { - attributes, err := apievents.EncodeMapStrings(auxInfo.attributeStatements) + attributeStatements := diagCtx.info.SAMLAttributeStatements + if attributeStatements != nil { + attributes, err := apievents.EncodeMapStrings(attributeStatements) if err != nil { event.Status.UserMessage = fmt.Sprintf("Failed to encode identity attributes: %v", err.Error()) log.WithError(err).Debug("Failed to encode identity attributes.") @@ -396,12 +403,8 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) } if err != nil { - if auxInfo.ssoTestFlow { - a.createSSODiagInfo(ctx, types.KindSAML, auxInfo.requestID, types.SSOInfoType_ERROR, trace.UserMessage(err)) - } - event.Code = events.UserSSOLoginFailureCode - if auxInfo.ssoTestFlow { + if diagCtx.testFlow { event.Code = events.UserSSOTestFlowLoginFailureCode } event.Status.Success = false @@ -416,7 +419,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) event.Status.Success = true event.User = auth.Username event.Code = events.UserSSOLoginCode - if auxInfo.ssoTestFlow { + if diagCtx.testFlow { event.Code = events.UserSSOTestFlowLoginCode } @@ -430,30 +433,18 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) return auth, nil } -type validateSAMLAuxInfo struct { - attributeStatements map[string][]string - ssoTestFlow bool - requestID string -} - -func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, auxInfo *validateSAMLAuxInfo) (*SAMLAuthResponse, error) { +func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagContext, samlResponse string) (*SAMLAuthResponse, error) { requestID, err := ParseSAMLInResponseTo(samlResponse) if err != nil { return nil, trace.Wrap(err) } - auxInfo.requestID = requestID + diagCtx.requestID = requestID request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID) if err != nil { return nil, trace.Wrap(err).AddUserMessage("Failed to get SAML Auth Request") } - auxInfo.ssoTestFlow = request.SSOTestFlow - - writeDiagInfo := func(infoType types.SSOInfoType, value interface{}) { - if request.SSOTestFlow { - a.createSSODiagInfo(ctx, types.KindSAML, requestID, infoType, value) - } - } + diagCtx.testFlow = request.SSOTestFlow connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { @@ -465,7 +456,9 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, return nil, trace.AccessDenied("received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err).AddUserMessage("Failed to retrieve assertion info. This may indicate IdP configuration error.") } - writeDiagInfo(types.SSOInfoType_SAML_ASSERTION_INFO, assertionInfo) + if diagCtx.testFlow { + diagCtx.info.SAMLAssertionInfo = (*types.AssertionInfoWrapper)(assertionInfo) + } if assertionInfo.WarningInfo.InvalidTime { return nil, trace.AccessDenied("invalid time in SAML assertion info").AddUserMessage("SAML assertion info contained warning: invalid time.") @@ -476,6 +469,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, } log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID) + log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) attributeStatements := map[string][]string{} @@ -488,13 +482,8 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, attributeStatements[key] = vals } - auxInfo.attributeStatements = attributeStatements - - writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTE_STATEMENTS, attributeStatements) - - log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo) - - writeDiagInfo(types.SSOInfoType_SAML_ATTRIBUTES_TO_ROLES, connector.GetAttributesToRoles()) + diagCtx.info.SAMLAttributeStatements = attributeStatements + diagCtx.info.SAMLAttributesToRoles = connector.GetAttributesToRoles() if len(connector.GetAttributesToRoles()) == 0 { return nil, trace.BadParameter("no attributes to roles mapping, check connector documentation").AddUserMessage("Attributes-to-roles mapping is empty, SSO user will never have any roles.") @@ -504,12 +493,21 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, // Calculate (figure out name, roles, traits, session TTL) of user and // create the user in the backend. - params, err := a.calculateSAMLUser(ctx, connector, *assertionInfo, request) + params, err := a.calculateSAMLUser(diagCtx, connector, *assertionInfo, request) if err != nil { return nil, trace.Wrap(err, "Failed to calculate user attributes.") } - writeDiagInfo(types.SSOInfoType_CREATE_USER_PARAMS, params) + diagCtx.info.CreateUserParams = &types.CreateUserParams{ + ConnectorName: params.connectorName, + Username: params.username, + Logins: params.logins, + KubeGroups: params.kubeGroups, + KubeUsers: params.kubeUsers, + Roles: params.roles, + Traits: params.traits, + SessionTTL: types.Duration(params.sessionTTL), + } user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { @@ -528,7 +526,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, // In test flow skip signing and creating web sessions. if request.SSOTestFlow { - writeDiagInfo(types.SSOInfoType_SUCCESS, "test flow") + diagCtx.info.Success = "test flow" return auth, nil } @@ -573,6 +571,6 @@ func (a *Server) validateSAMLResponse(ctx context.Context, samlResponse string, auth.HostSigners = append(auth.HostSigners, authority) } - writeDiagInfo(types.SSOInfoType_SUCCESS, "full flow") + diagCtx.info.Success = "regular flow" return auth, nil } diff --git a/lib/services/identity.go b/lib/services/identity.go index 66f513ddcda02..d8590ee1db242 100644 --- a/lib/services/identity.go +++ b/lib/services/identity.go @@ -209,7 +209,7 @@ type Identity interface { CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error // GetSSODiagnosticInfo returns SSO diagnostic info records. - GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) + GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) // CreateGithubConnector creates a new Github connector CreateGithubConnector(connector types.GithubConnector) error diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 4b6be5be4d8e7..ff7768e29f481 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1221,15 +1221,9 @@ func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind return trace.BadParameter("missing parameter authRequestID") } - var prefix string - switch authKind { - case types.KindSAML: - prefix = samlPrefix - case types.KindGithub: - prefix = githubPrefix - case types.KindOIDC: - prefix = oidcPrefix + case types.KindSAML, types.KindGithub, types.KindOIDC: + // nothing to do default: return trace.BadParameter("unsupported authKind %q", authKind) } @@ -1240,7 +1234,7 @@ func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind } item := backend.Item{ - Key: backend.Key(webPrefix, connectorsPrefix, prefix, requestsTracePrefix, authRequestID, uuid.New().String()), + Key: backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID), Value: jsonValue, Expires: backend.Expiry(s.Clock(), time.Minute*15), } @@ -1252,39 +1246,29 @@ func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind } // GetSSODiagnosticInfo returns SSO diagnostic info records. -func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) ([]types.SSODiagnosticInfo, error) { +func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { if authRequestID == "" { return nil, trace.BadParameter("missing parameter id") } - var prefix string switch authKind { - case types.KindSAML: - prefix = samlPrefix - case types.KindGithub: - prefix = githubPrefix - case types.KindOIDC: - prefix = oidcPrefix + case types.KindSAML, types.KindGithub, types.KindOIDC: + // nothing to do default: return nil, trace.BadParameter("unsupported authKind %q", authKind) } - startKey := backend.Key(webPrefix, connectorsPrefix, prefix, requestsTracePrefix, authRequestID) - result, err := s.GetRange(ctx, startKey, backend.RangeEnd(startKey), backend.NoLimit) + item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID)) if err != nil { return nil, trace.Wrap(err) } - var out []types.SSODiagnosticInfo - for _, item := range result.Items { - var req types.SSODiagnosticInfo - if err := json.Unmarshal(item.Value, &req); err != nil { - return nil, trace.Wrap(err) - } - out = append(out, req) + var req types.SSODiagnosticInfo + if err := json.Unmarshal(item.Value, &req); err != nil { + return nil, trace.Wrap(err) } - return out, nil + return &req, nil } // CreateGithubConnector creates a new Github connector From d262d2f40f49954d65a16ab4fba8e632ad5501bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 21 Apr 2022 15:21:42 +0200 Subject: [PATCH 37/50] Fix import. --- api/types/assertion_info_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/types/assertion_info_wrapper.go b/api/types/assertion_info_wrapper.go index 35aa7e398af1d..1347db5ac9616 100644 --- a/api/types/assertion_info_wrapper.go +++ b/api/types/assertion_info_wrapper.go @@ -21,7 +21,7 @@ import ( "github.com/gravitational/trace" - "github.com/russellhaering/gosaml2" + saml2 "github.com/russellhaering/gosaml2" ) type AssertionInfoWrapper saml2.AssertionInfo From 8d1b03fcf3709e881439e500ebb9c4b52a9a07dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 21 Apr 2022 15:57:58 +0200 Subject: [PATCH 38/50] API: `go mod tidy` --- api/go.mod | 3 +-- api/go.sum | 32 ++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/api/go.mod b/api/go.mod index 32f30b53bd167..cd8e59e13ebe9 100644 --- a/api/go.mod +++ b/api/go.mod @@ -7,12 +7,11 @@ require ( github.com/golang/protobuf v1.4.3 github.com/google/go-cmp v0.5.4 github.com/gravitational/trace v1.1.17 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28 github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.7.0 golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd google.golang.org/grpc v1.43.0 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/api/go.sum b/api/go.sum index e0d13feb2fd5c..7d5beb4ac1389 100644 --- a/api/go.sum +++ b/api/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -11,6 +13,7 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -52,20 +55,34 @@ github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9q github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= +github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28 h1:659ZmS9riGgajUnT9ym74yQSug2KZyvVHi3EmIqASnQ= +github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28/go.mod h1:PiLt5KX4EMjlMIq3WLRR/xb5yqhiwtQhGr8wmU0b08M= +github.com/russellhaering/goxmldsig v1.1.1 h1:vI0r2osGF1A9PLvsGdPUAGwEIrKa4Pj5sesSBsebIxM= +github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -162,13 +179,16 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 1cf256729e5aff0fcf18fe8bef7916bb36d05cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Thu, 21 Apr 2022 16:03:43 +0200 Subject: [PATCH 39/50] Format imports. --- api/types/assertion_info_wrapper_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/types/assertion_info_wrapper_test.go b/api/types/assertion_info_wrapper_test.go index d4328499cd678..ccd32a69c0400 100644 --- a/api/types/assertion_info_wrapper_test.go +++ b/api/types/assertion_info_wrapper_test.go @@ -18,11 +18,12 @@ package types import ( "encoding/xml" + "testing" + "time" + saml2 "github.com/russellhaering/gosaml2" samltypes "github.com/russellhaering/gosaml2/types" "github.com/stretchr/testify/require" - "testing" - "time" ) func TestAssertionInfoWrapper_RoundTrip(t *testing.T) { From 543c9e0df10af63a4a56ed1c92b18839265787cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Fri, 22 Apr 2022 09:18:47 +0200 Subject: [PATCH 40/50] Apply suggestions from code review Co-authored-by: Roman Tkachenko --- lib/services/local/users.go | 2 +- lib/services/saml.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/services/local/users.go b/lib/services/local/users.go index ff7768e29f481..1d8df2e342d1c 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1248,7 +1248,7 @@ func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind // GetSSODiagnosticInfo returns SSO diagnostic info records. func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) { if authRequestID == "" { - return nil, trace.BadParameter("missing parameter id") + return nil, trace.BadParameter("missing parameter authRequestID") } switch authKind { diff --git a/lib/services/saml.go b/lib/services/saml.go index 0506b016a1fd4..563babcc901a6 100644 --- a/lib/services/saml.go +++ b/lib/services/saml.go @@ -96,7 +96,7 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error { } if len(sc.GetAttributesToRoles()) == 0 { - return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never give any roles") + return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never assign any roles") } log.Debugf("[SAML] SSO: %v", sc.GetSSO()) From 8750663f42eb5f9c1a59f8033a7fde38520858e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Fri, 22 Apr 2022 11:10:52 +0200 Subject: [PATCH 41/50] Small refinements. - Rename auth.AssertionInfoWrapper to shorter auth.AssertionInfo. - Add bool TestFlow to SSODiagnosticInfo - Make SSODiagnosticInfo.Success a bool instead of string. - Rename SAMLAttributesToRolesWarnings to more generic SSOWarnings - Add godocs in several places. - Avoid explicit call to trace.AddUserMessage() where possible. --- ...tion_info_wrapper.go => assertion_info.go} | 10 +- ...wrapper_test.go => assertion_info_test.go} | 10 +- api/types/types.pb.go | 1682 +++++++++-------- api/types/types.proto | 28 +- lib/auth/saml.go | 59 +- lib/auth/sso_diag_context.go | 53 + 6 files changed, 953 insertions(+), 889 deletions(-) rename api/types/{assertion_info_wrapper.go => assertion_info.go} (71%) rename api/types/{assertion_info_wrapper_test.go => assertion_info_test.go} (89%) create mode 100644 lib/auth/sso_diag_context.go diff --git a/api/types/assertion_info_wrapper.go b/api/types/assertion_info.go similarity index 71% rename from api/types/assertion_info_wrapper.go rename to api/types/assertion_info.go index 1347db5ac9616..d4ce560b3f713 100644 --- a/api/types/assertion_info_wrapper.go +++ b/api/types/assertion_info.go @@ -24,9 +24,11 @@ import ( saml2 "github.com/russellhaering/gosaml2" ) -type AssertionInfoWrapper saml2.AssertionInfo +// AssertionInfo is an alias for saml2.AssertionInfo with additional methods, required for serialization to/from protobuf. +// With those we can reference it with an option like so: `(gogoproto.customtype) = "AssertionInfo"` +type AssertionInfo saml2.AssertionInfo -func (a *AssertionInfoWrapper) Size() int { +func (a *AssertionInfo) Size() int { bytes, err := json.Marshal(a) if err != nil { return 0 @@ -34,11 +36,11 @@ func (a *AssertionInfoWrapper) Size() int { return len(bytes) } -func (a *AssertionInfoWrapper) Unmarshal(bytes []byte) error { +func (a *AssertionInfo) Unmarshal(bytes []byte) error { return trace.Wrap(json.Unmarshal(bytes, a)) } -func (a *AssertionInfoWrapper) MarshalTo(bytes []byte) (int, error) { +func (a *AssertionInfo) MarshalTo(bytes []byte) (int, error) { out, err := json.Marshal(a) if err != nil { return 0, trace.Wrap(err) diff --git a/api/types/assertion_info_wrapper_test.go b/api/types/assertion_info_test.go similarity index 89% rename from api/types/assertion_info_wrapper_test.go rename to api/types/assertion_info_test.go index ccd32a69c0400..19e8419ae5513 100644 --- a/api/types/assertion_info_wrapper_test.go +++ b/api/types/assertion_info_test.go @@ -26,13 +26,13 @@ import ( "github.com/stretchr/testify/require" ) -func TestAssertionInfoWrapper_RoundTrip(t *testing.T) { +func TestAssertionInfo_RoundTrip(t *testing.T) { tests := []struct { name string - src AssertionInfoWrapper + src AssertionInfo }{ - {name: "empty", src: AssertionInfoWrapper{}}, - {name: "full", src: (AssertionInfoWrapper)(saml2.AssertionInfo{ + {name: "empty", src: AssertionInfo{}}, + {name: "full", src: (AssertionInfo)(saml2.AssertionInfo{ NameID: "zz", Values: map[string]samltypes.Attribute{ "foo": { @@ -72,7 +72,7 @@ func TestAssertionInfoWrapper_RoundTrip(t *testing.T) { require.NoError(t, err) require.Equal(t, tt.src.Size(), count) - dst := &AssertionInfoWrapper{} + dst := &AssertionInfo{} err = dst.Unmarshal(buf) require.NoError(t, err) require.Equal(t, &tt.src, dst) diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 125ca79c4bb3c..4ea38c8b03f19 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -7671,9 +7671,8 @@ func (m *GithubConnectorSpecV3) XXX_DiscardUnknown() { var xxx_messageInfo_GithubConnectorSpecV3 proto.InternalMessageInfo -// SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the SAML -// attributes to roles. -type SAMLAttributesToRolesWarnings struct { +// SSOWarnings conveys a user-facing main message along with auxiliary warnings. +type SSOWarnings struct { // Message is main user-facing message to be shown. Message string `protobuf:"bytes,1,opt,name=Message,proto3" json:"message,omitempty"` // Warnings is a set of distinct warnings to be reported. @@ -7683,18 +7682,18 @@ type SAMLAttributesToRolesWarnings struct { XXX_sizecache int32 `json:"-"` } -func (m *SAMLAttributesToRolesWarnings) Reset() { *m = SAMLAttributesToRolesWarnings{} } -func (m *SAMLAttributesToRolesWarnings) String() string { return proto.CompactTextString(m) } -func (*SAMLAttributesToRolesWarnings) ProtoMessage() {} -func (*SAMLAttributesToRolesWarnings) Descriptor() ([]byte, []int) { +func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } +func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } +func (*SSOWarnings) ProtoMessage() {} +func (*SSOWarnings) Descriptor() ([]byte, []int) { return fileDescriptor_d938547f84707355, []int{145} } -func (m *SAMLAttributesToRolesWarnings) XXX_Unmarshal(b []byte) error { +func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SAMLAttributesToRolesWarnings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SSOWarnings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SAMLAttributesToRolesWarnings.Marshal(b, m, deterministic) + return xxx_messageInfo_SSOWarnings.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -7704,17 +7703,17 @@ func (m *SAMLAttributesToRolesWarnings) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *SAMLAttributesToRolesWarnings) XXX_Merge(src proto.Message) { - xxx_messageInfo_SAMLAttributesToRolesWarnings.Merge(m, src) +func (m *SSOWarnings) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSOWarnings.Merge(m, src) } -func (m *SAMLAttributesToRolesWarnings) XXX_Size() int { +func (m *SSOWarnings) XXX_Size() int { return m.Size() } -func (m *SAMLAttributesToRolesWarnings) XXX_DiscardUnknown() { - xxx_messageInfo_SAMLAttributesToRolesWarnings.DiscardUnknown(m) +func (m *SSOWarnings) XXX_DiscardUnknown() { + xxx_messageInfo_SSOWarnings.DiscardUnknown(m) } -var xxx_messageInfo_SAMLAttributesToRolesWarnings proto.InternalMessageInfo +var xxx_messageInfo_SSOWarnings proto.InternalMessageInfo // CreateUserParams represents the user creation parameters as called during SSO login flow. type CreateUserParams struct { @@ -7774,26 +7773,28 @@ var xxx_messageInfo_CreateUserParams proto.InternalMessageInfo // SSODiagnosticInfo is a single SSO diagnostic info entry. type SSODiagnosticInfo struct { + // TestFlow indicates the SSO flow was a test one. + TestFlow bool `protobuf:"varint,1,opt,name=TestFlow,proto3" json:"test_flow"` // Error stores user-friendly error message. - Error string `protobuf:"bytes,1,opt,name=Error,proto3" json:"error"` + Error string `protobuf:"bytes,2,opt,name=Error,proto3" json:"error"` // Success if present, marks the flow as finished with success. - Success string `protobuf:"bytes,2,opt,name=Success,proto3" json:"success"` + Success bool `protobuf:"varint,3,opt,name=Success,proto3" json:"success"` // CreateUserParams represents the user creation parameters as called during SSO login flow. - CreateUserParams *CreateUserParams `protobuf:"bytes,3,opt,name=CreateUserParams,proto3" json:"create_user_params,omitempty"` + CreateUserParams *CreateUserParams `protobuf:"bytes,4,opt,name=CreateUserParams,proto3" json:"create_user_params,omitempty"` // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login // flow. - SAMLAttributesToRoles []AttributeMapping `protobuf:"bytes,4,rep,name=SAMLAttributesToRoles,proto3" json:"attributes_to_roles,omitempty"` + SAMLAttributesToRoles []AttributeMapping `protobuf:"bytes,5,rep,name=SAMLAttributesToRoles,proto3" json:"attributes_to_roles,omitempty"` // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the // SAML attributes to roles. - SAMLAttributesToRolesWarnings *SAMLAttributesToRolesWarnings `protobuf:"bytes,5,opt,name=SAMLAttributesToRolesWarnings,proto3" json:"saml_attributes_to_roles_warnings,omitempty"` + SAMLAttributesToRolesWarnings *SSOWarnings `protobuf:"bytes,6,opt,name=SAMLAttributesToRolesWarnings,proto3" json:"saml_attributes_to_roles_warnings,omitempty"` // SAMLAttributeStatements represents SAML attribute statements. - SAMLAttributeStatements github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,6,opt,name=SAMLAttributeStatements,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_attribute_statements,omitempty"` + SAMLAttributeStatements github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=SAMLAttributeStatements,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_attribute_statements,omitempty"` // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. - SAMLAssertionInfo *AssertionInfoWrapper `protobuf:"bytes,7,opt,name=SAMLAssertionInfo,proto3,customtype=AssertionInfoWrapper" json:"saml_assertion_info,omitempty"` + SAMLAssertionInfo *AssertionInfo `protobuf:"bytes,8,opt,name=SAMLAssertionInfo,proto3,customtype=AssertionInfo" json:"saml_assertion_info,omitempty"` // SAMLTraitsFromAssertions represents traits translated from SAML assertions. - SAMLTraitsFromAssertions github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,8,opt,name=SAMLTraitsFromAssertions,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_traits_from_assertions,omitempty"` + SAMLTraitsFromAssertions github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,9,opt,name=SAMLTraitsFromAssertions,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_traits_from_assertions,omitempty"` // SAMLConnectorTraitMapping represents connector-specific trait mapping. - SAMLConnectorTraitMapping []TraitMapping `protobuf:"bytes,9,rep,name=SAMLConnectorTraitMapping,proto3" json:"saml_connector_trait_mapping,omitempty"` + SAMLConnectorTraitMapping []TraitMapping `protobuf:"bytes,10,rep,name=SAMLConnectorTraitMapping,proto3" json:"saml_connector_trait_mapping,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -9193,7 +9194,7 @@ func init() { proto.RegisterType((*GithubConnectorV3)(nil), "types.GithubConnectorV3") proto.RegisterType((*GithubConnectorV3List)(nil), "types.GithubConnectorV3List") proto.RegisterType((*GithubConnectorSpecV3)(nil), "types.GithubConnectorSpecV3") - proto.RegisterType((*SAMLAttributesToRolesWarnings)(nil), "types.SAMLAttributesToRolesWarnings") + proto.RegisterType((*SSOWarnings)(nil), "types.SSOWarnings") proto.RegisterType((*CreateUserParams)(nil), "types.CreateUserParams") proto.RegisterType((*SSODiagnosticInfo)(nil), "types.SSODiagnosticInfo") proto.RegisterType((*TeamMapping)(nil), "types.TeamMapping") @@ -9225,763 +9226,765 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 12094 bytes of a gzipped FileDescriptorProto + // 12113 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0xf3, 0xc7, 0x99, 0x9d, 0xdd, 0x9e, 0xab, 0xdd, 0x9d, 0x9d, 0x9d, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0xe7, 0xb4, 0xb7, 0x7f, 0xd7, 0x4d, 0x72, 0x66, 0xb8, 0xc3, 0x21, 0xb9, 0xd5, 0xfc, 0xb9, 0xd3, 0xdd, 0xa9, 0x54, 0xec, 0x4a, - 0x92, 0xb5, 0xec, 0xee, 0x6a, 0x55, 0x55, 0xcf, 0x0c, 0xa5, 0x4f, 0x90, 0x84, 0xcf, 0xb2, 0x20, - 0x08, 0xba, 0x1f, 0xe1, 0x64, 0x49, 0xb6, 0x0c, 0xc9, 0x82, 0x65, 0x5b, 0x36, 0x4e, 0x0f, 0xb2, - 0x01, 0xdb, 0xb0, 0x61, 0x43, 0xb0, 0x21, 0xdc, 0x83, 0x0d, 0xeb, 0xcd, 0x90, 0x6c, 0xd0, 0xd6, - 0x9d, 0x5f, 0x4c, 0xc0, 0x86, 0x01, 0x3d, 0xe9, 0x6c, 0x01, 0x46, 0x46, 0x66, 0x56, 0x65, 0x56, - 0x57, 0x93, 0xcd, 0xdd, 0x59, 0x58, 0xb3, 0x4f, 0xdd, 0x15, 0x19, 0x11, 0xf9, 0x1f, 0x19, 0x19, - 0x19, 0x19, 0x09, 0xe3, 0xd1, 0x41, 0x97, 0x86, 0x37, 0xbb, 0x81, 0x1f, 0xf9, 0x64, 0x04, 0x3f, - 0x2e, 0x9f, 0xdb, 0xf5, 0x77, 0x7d, 0x84, 0xcc, 0xb2, 0x7f, 0x3c, 0xf1, 0x72, 0x75, 0xd7, 0xf7, - 0x77, 0x5b, 0x74, 0x16, 0xbf, 0xb6, 0x7b, 0x3b, 0xb3, 0x91, 0xd7, 0xa6, 0x61, 0xe4, 0xb4, 0xbb, - 0x02, 0x61, 0x7e, 0xd7, 0x8b, 0xf6, 0x7a, 0xdb, 0x37, 0x9b, 0x7e, 0x7b, 0x76, 0x37, 0x70, 0x1e, - 0x79, 0x91, 0x13, 0x79, 0x7e, 0xc7, 0x69, 0xcd, 0x46, 0xb4, 0x45, 0xbb, 0x7e, 0x10, 0xcd, 0x3a, - 0x5d, 0x6f, 0x16, 0xf3, 0x98, 0x7d, 0x1c, 0x38, 0xdd, 0x2e, 0x0d, 0x92, 0x3f, 0x9c, 0x89, 0xf9, - 0x77, 0xf2, 0x50, 0x7a, 0x40, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x51, 0xf2, 0x22, 0x14, 0x56, 0x9c, - 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, 0xea, 0x78, 0x48, 0x83, 0x47, - 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x98, 0x48, 0x3e, 0x0b, 0x25, 0xf6, 0x1b, 0x76, 0x9d, 0x26, - 0x9d, 0xc9, 0x21, 0xe6, 0xc4, 0xd1, 0x61, 0xb5, 0xd4, 0x91, 0x40, 0x2b, 0x49, 0x27, 0xd7, 0x60, - 0x6c, 0x99, 0x3a, 0x21, 0x5d, 0x5a, 0x98, 0xc9, 0x5f, 0x35, 0xae, 0xe7, 0xeb, 0xe5, 0xa3, 0xc3, - 0x6a, 0xb1, 0xc5, 0x40, 0xb6, 0xe7, 0x5a, 0x32, 0x91, 0x2c, 0xc1, 0xd8, 0xe2, 0x93, 0xae, 0x17, - 0xd0, 0x70, 0xa6, 0x70, 0xd5, 0xb8, 0x3e, 0x3e, 0x77, 0xf9, 0x26, 0xaf, 0xff, 0x4d, 0x59, 0xff, - 0x9b, 0xeb, 0xb2, 0xfe, 0xf5, 0xb3, 0xdf, 0x3b, 0xac, 0x9e, 0x39, 0x3a, 0xac, 0x8e, 0x51, 0x4e, - 0xf2, 0xad, 0xff, 0x52, 0x35, 0x2c, 0x49, 0x4f, 0xde, 0x86, 0xc2, 0xfa, 0x41, 0x97, 0xce, 0x94, - 0xae, 0x1a, 0xd7, 0x27, 0xe7, 0x5e, 0xb8, 0xc9, 0x5b, 0x3c, 0xae, 0x64, 0xf2, 0x8f, 0x61, 0xd5, - 0x8b, 0x47, 0x87, 0xd5, 0x02, 0x43, 0xb1, 0x90, 0x8a, 0xbc, 0x0e, 0xa3, 0xf7, 0xfd, 0x30, 0x5a, - 0x5a, 0x98, 0x01, 0xac, 0xda, 0xf9, 0xa3, 0xc3, 0xea, 0xf4, 0x9e, 0x1f, 0x46, 0xb6, 0xe7, 0xbe, - 0xe6, 0xb7, 0xbd, 0x88, 0xb6, 0xbb, 0xd1, 0x81, 0x25, 0x90, 0xcc, 0x6d, 0x98, 0xd0, 0xf8, 0x91, - 0x71, 0x18, 0xdb, 0x58, 0x79, 0xb0, 0xb2, 0xba, 0xb5, 0x52, 0x39, 0x43, 0x8a, 0x50, 0x58, 0x59, - 0x5d, 0x58, 0xac, 0x18, 0x64, 0x0c, 0xf2, 0xb5, 0xb5, 0xb5, 0x4a, 0x8e, 0x94, 0xa1, 0xb8, 0x50, - 0x5b, 0xaf, 0xd5, 0x6b, 0x8d, 0xc5, 0x4a, 0x9e, 0x9c, 0x85, 0xa9, 0xad, 0xa5, 0x95, 0x85, 0xd5, - 0xad, 0x86, 0xbd, 0xb0, 0xd8, 0x78, 0xb0, 0xbe, 0xba, 0x56, 0x29, 0x90, 0x49, 0x80, 0x07, 0x1b, - 0xf5, 0x45, 0x6b, 0x65, 0x71, 0x7d, 0xb1, 0x51, 0x19, 0x31, 0x7f, 0x21, 0x0f, 0xc5, 0x87, 0x34, - 0x72, 0x5c, 0x27, 0x72, 0xc8, 0x15, 0xad, 0x8b, 0xb0, 0xf4, 0x4a, 0xdf, 0xbc, 0xd8, 0xdf, 0x37, - 0x23, 0x47, 0x87, 0x55, 0xe3, 0x75, 0xb5, 0x4f, 0xde, 0x82, 0xf1, 0x05, 0x1a, 0x36, 0x03, 0xaf, - 0xcb, 0xc6, 0x0b, 0xf6, 0x4b, 0xa9, 0x7e, 0xe9, 0xe8, 0xb0, 0x7a, 0xde, 0x4d, 0xc0, 0x4a, 0x5d, - 0x55, 0x6c, 0xb2, 0x04, 0xa3, 0xcb, 0xce, 0x36, 0x6d, 0x85, 0x33, 0x23, 0x57, 0xf3, 0xd7, 0xc7, - 0xe7, 0x9e, 0x13, 0xed, 0x2b, 0x0b, 0x78, 0x93, 0xa7, 0x2e, 0x76, 0xa2, 0xe0, 0xa0, 0x7e, 0xee, - 0xe8, 0xb0, 0x5a, 0x69, 0x21, 0x40, 0x6d, 0x3b, 0x8e, 0x42, 0x1a, 0x49, 0x9f, 0x8f, 0x9e, 0xd8, - 0xe7, 0xcf, 0x7f, 0xef, 0xb0, 0x6a, 0xb0, 0xbe, 0x10, 0x7d, 0x9e, 0xf0, 0xd3, 0x7b, 0xff, 0x2a, - 0xe4, 0x96, 0x16, 0x66, 0xc6, 0x70, 0xac, 0x55, 0x8e, 0x0e, 0xab, 0x65, 0xad, 0xdb, 0x72, 0x4b, - 0x0b, 0x97, 0xdf, 0x84, 0x71, 0xa5, 0x8c, 0xa4, 0x02, 0xf9, 0x7d, 0x7a, 0xc0, 0xdb, 0xd3, 0x62, - 0x7f, 0xc9, 0x39, 0x18, 0x79, 0xe4, 0xb4, 0x7a, 0xa2, 0x01, 0x2d, 0xfe, 0xf1, 0xc5, 0xdc, 0x8f, - 0x18, 0xe6, 0xaf, 0x14, 0xa0, 0x68, 0xf9, 0x7c, 0x9e, 0x91, 0x57, 0x61, 0xa4, 0x11, 0x39, 0x91, - 0xec, 0x8a, 0xb3, 0x47, 0x87, 0xd5, 0xa9, 0x90, 0x01, 0x94, 0xfc, 0x38, 0x06, 0x43, 0x5d, 0xdb, - 0x73, 0x42, 0xd9, 0x25, 0x88, 0xda, 0x65, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x35, 0x28, 0x3c, 0xf4, - 0x5d, 0x2a, 0x7a, 0x85, 0x1c, 0x1d, 0x56, 0x27, 0xdb, 0xbe, 0xab, 0x22, 0x62, 0x3a, 0x79, 0x0d, - 0x4a, 0xf3, 0xbd, 0x20, 0xa0, 0x1d, 0x36, 0x54, 0x0b, 0x88, 0x3c, 0x79, 0x74, 0x58, 0x85, 0x26, - 0x07, 0xb2, 0xc9, 0x95, 0x20, 0xb0, 0xa6, 0x6e, 0x44, 0x4e, 0x10, 0x51, 0x77, 0x66, 0x64, 0xa8, - 0xa6, 0x66, 0xd3, 0x6b, 0x3a, 0xe4, 0x24, 0xe9, 0xa6, 0x16, 0x9c, 0xc8, 0x7d, 0x18, 0xbf, 0x17, - 0x38, 0x4d, 0xba, 0x46, 0x03, 0xcf, 0x77, 0xb1, 0x0f, 0xf3, 0xf5, 0x6b, 0x47, 0x87, 0xd5, 0x0b, - 0xbb, 0x0c, 0x6c, 0x77, 0x11, 0x9e, 0x50, 0xff, 0xf0, 0xb0, 0x5a, 0x5c, 0xe8, 0x05, 0xd8, 0x7a, - 0x96, 0x4a, 0x4a, 0x7e, 0x9c, 0x75, 0x49, 0x18, 0x61, 0xd3, 0x52, 0x17, 0x7b, 0xef, 0xf8, 0x22, - 0x9a, 0xa2, 0x88, 0x17, 0x5a, 0x4e, 0x18, 0xd9, 0x01, 0xa7, 0x4b, 0x95, 0x53, 0x65, 0x49, 0x56, - 0xa1, 0xd8, 0x68, 0xee, 0x51, 0xb7, 0xd7, 0xa2, 0x33, 0x45, 0x64, 0x7f, 0x51, 0x0c, 0x5c, 0xd9, - 0x9f, 0x32, 0xb9, 0x7e, 0x59, 0xf0, 0x26, 0xa1, 0x80, 0x28, 0x6d, 0x1f, 0x33, 0xf9, 0x62, 0xf1, - 0xd7, 0x7f, 0xbb, 0x7a, 0xe6, 0x67, 0xff, 0xf3, 0xd5, 0x33, 0xe6, 0x3f, 0xcd, 0x41, 0x25, 0xcd, - 0x84, 0xec, 0xc0, 0xc4, 0x46, 0xd7, 0x75, 0x22, 0x3a, 0xdf, 0xf2, 0x68, 0x27, 0x0a, 0x71, 0x90, - 0x1c, 0x5f, 0xa7, 0x97, 0x44, 0xbe, 0x33, 0x3d, 0x24, 0xb4, 0x9b, 0x9c, 0x32, 0x55, 0x2b, 0x9d, - 0x6d, 0x92, 0x4f, 0x03, 0xe5, 0x74, 0x88, 0x23, 0xec, 0x74, 0xf9, 0x70, 0x09, 0x3f, 0x20, 0x1f, - 0xc1, 0x56, 0x0c, 0xa0, 0x8e, 0xbb, 0x7d, 0x80, 0x23, 0x73, 0xf8, 0x01, 0xc4, 0x48, 0x32, 0x06, - 0x10, 0x03, 0x9b, 0xff, 0xcd, 0x80, 0x49, 0x8b, 0x86, 0x7e, 0x2f, 0x68, 0xd2, 0xfb, 0xd4, 0x71, - 0x69, 0xc0, 0x86, 0xff, 0x03, 0xaf, 0xe3, 0x8a, 0x39, 0x85, 0xc3, 0x7f, 0xdf, 0xeb, 0xa8, 0x53, - 0x18, 0xd3, 0xc9, 0xe7, 0x60, 0xac, 0xd1, 0xdb, 0x46, 0x54, 0x3e, 0xa7, 0x2e, 0x60, 0x8f, 0xf5, - 0xb6, 0xed, 0x14, 0xba, 0x44, 0x23, 0xb3, 0x30, 0xb6, 0x49, 0x83, 0x30, 0x91, 0x78, 0x28, 0xd9, - 0x1f, 0x71, 0x90, 0x4a, 0x20, 0xb0, 0xc8, 0xbd, 0x44, 0xea, 0x8a, 0x35, 0x69, 0x2a, 0x25, 0xeb, - 0x92, 0xa1, 0xd2, 0x16, 0x10, 0x75, 0xa8, 0x48, 0x2c, 0xf3, 0xdb, 0x39, 0xa8, 0x2c, 0x38, 0x91, - 0xb3, 0xed, 0x84, 0xa2, 0x3d, 0x37, 0x6f, 0x33, 0x39, 0xae, 0x54, 0x14, 0xe5, 0x38, 0x2b, 0xf9, - 0x47, 0xae, 0xde, 0xcb, 0xe9, 0xea, 0x8d, 0xb3, 0x05, 0x52, 0x54, 0x2f, 0xa9, 0xd4, 0x3b, 0x27, - 0x57, 0xaa, 0x22, 0x2a, 0x55, 0x94, 0x95, 0x4a, 0xaa, 0x42, 0xde, 0x81, 0x42, 0xa3, 0x4b, 0x9b, - 0x42, 0x88, 0x48, 0xd9, 0xaf, 0x57, 0x8e, 0x21, 0x6c, 0xde, 0xae, 0x97, 0x05, 0x9b, 0x42, 0xd8, - 0xa5, 0x4d, 0x0b, 0xc9, 0x94, 0x49, 0xf3, 0x9d, 0x51, 0x38, 0x97, 0x45, 0x46, 0xde, 0xd1, 0x17, - 0x27, 0xde, 0x3c, 0xcf, 0x0d, 0x5c, 0x9c, 0x66, 0x0c, 0x7d, 0x79, 0xba, 0x01, 0xc5, 0x35, 0x36, - 0x20, 0x9b, 0x7e, 0x4b, 0xb4, 0x1c, 0x93, 0x8a, 0xc5, 0xae, 0x84, 0x19, 0x56, 0x9c, 0x4e, 0x9e, - 0x83, 0xfc, 0x86, 0xb5, 0x24, 0x9a, 0xab, 0x74, 0x74, 0x58, 0xcd, 0xf7, 0x02, 0x6f, 0xc6, 0xb0, - 0x18, 0x94, 0xcc, 0xc2, 0xe8, 0x7c, 0x6d, 0x9e, 0x06, 0x11, 0x36, 0x53, 0xb9, 0x7e, 0x91, 0x8d, - 0x96, 0xa6, 0x63, 0x37, 0x69, 0x10, 0x69, 0xd9, 0x0b, 0x34, 0xf2, 0x59, 0xc8, 0xd7, 0xb6, 0x1a, - 0xa2, 0x65, 0x40, 0xb4, 0x4c, 0x6d, 0xab, 0x51, 0x9f, 0x10, 0x0d, 0x91, 0x77, 0x1e, 0x87, 0x8c, - 0x7b, 0x6d, 0xab, 0xa1, 0xf6, 0xd6, 0xe8, 0x31, 0xbd, 0x75, 0x1d, 0x8a, 0x4c, 0xcf, 0x60, 0x0b, - 0x3c, 0x0a, 0xc5, 0x12, 0x57, 0x9f, 0xf6, 0x04, 0xcc, 0x8a, 0x53, 0xc9, 0x8b, 0xb1, 0xda, 0x52, - 0x4c, 0xf8, 0x09, 0xb5, 0x45, 0x2a, 0x2b, 0xe4, 0x09, 0x4c, 0x2c, 0x1c, 0x74, 0x9c, 0xb6, 0xd7, - 0x14, 0x4b, 0x78, 0x09, 0x97, 0xf0, 0x9b, 0xc7, 0x74, 0xe3, 0x4d, 0x8d, 0x80, 0xaf, 0xea, 0x52, - 0xf8, 0xce, 0xb8, 0x3c, 0xcd, 0x4e, 0xaf, 0xf0, 0x33, 0x86, 0xa5, 0x67, 0xc4, 0xe6, 0x92, 0x14, - 0x91, 0xa8, 0x57, 0x25, 0xc3, 0x4e, 0x82, 0x93, 0xb9, 0x14, 0x08, 0x88, 0x3a, 0x97, 0xe2, 0x45, - 0xf7, 0x1d, 0xc8, 0xdf, 0x9b, 0x5f, 0x9b, 0x19, 0x47, 0x1e, 0x44, 0xf0, 0xb8, 0x37, 0xbf, 0x36, - 0xdf, 0xf2, 0x7b, 0x6e, 0xe3, 0x83, 0xe5, 0xfa, 0x45, 0xc1, 0x66, 0x62, 0xb7, 0xd9, 0xd5, 0x4a, - 0xc4, 0xe8, 0xc8, 0x22, 0x14, 0x65, 0x2d, 0x67, 0xca, 0xc8, 0x63, 0x3a, 0x55, 0xf9, 0xcd, 0xdb, - 0x7c, 0xae, 0xb9, 0xe2, 0x5b, 0x2d, 0x85, 0xc4, 0xb9, 0xbc, 0x05, 0xa4, 0xbf, 0x5d, 0x32, 0x34, - 0x89, 0xcf, 0xaa, 0x9a, 0xc4, 0xf8, 0xdc, 0x79, 0x91, 0xd7, 0xbc, 0xdf, 0x6e, 0x3b, 0x1d, 0x17, - 0x69, 0x37, 0xe7, 0x54, 0x05, 0xa3, 0x06, 0x93, 0x49, 0x41, 0x96, 0xbd, 0x30, 0x22, 0xb3, 0x50, - 0x92, 0x10, 0xb6, 0x88, 0xe4, 0x33, 0x8b, 0x6c, 0x25, 0x38, 0xe6, 0x1f, 0xe5, 0x00, 0x92, 0x94, - 0x67, 0x54, 0xce, 0x7c, 0x41, 0x93, 0x33, 0xe7, 0xd3, 0x03, 0x74, 0xa0, 0x84, 0x21, 0xef, 0xc1, - 0x28, 0x53, 0xb9, 0x7a, 0x52, 0xa5, 0xbc, 0x98, 0x26, 0xc5, 0xc4, 0xcd, 0xdb, 0xf5, 0x49, 0x41, - 0x3c, 0x1a, 0x22, 0xc4, 0x12, 0x64, 0x8a, 0x88, 0xfa, 0x9f, 0x85, 0xa4, 0x33, 0x84, 0x70, 0xba, - 0xae, 0x48, 0x17, 0x23, 0x99, 0x8f, 0x52, 0xba, 0x28, 0xb2, 0xe5, 0x12, 0x97, 0x2d, 0xbc, 0x51, - 0xc7, 0x84, 0x6c, 0x49, 0x4b, 0x16, 0xde, 0x80, 0x27, 0x4a, 0x96, 0x6e, 0x7a, 0xda, 0x16, 0x70, - 0x18, 0x5c, 0xcf, 0x6c, 0x95, 0xac, 0x09, 0x7b, 0xf5, 0xa4, 0x09, 0x9b, 0x9e, 0xae, 0xb7, 0x07, - 0xc9, 0xb2, 0xf3, 0x72, 0x76, 0x39, 0x8f, 0x55, 0x72, 0x94, 0x69, 0x6f, 0xf1, 0xa9, 0x39, 0x3a, - 0x70, 0x6a, 0x9e, 0xcf, 0x9c, 0x9a, 0x7c, 0x62, 0xbe, 0x05, 0x23, 0xb5, 0x9f, 0xec, 0x05, 0x54, - 0xe8, 0x7e, 0x65, 0x99, 0x27, 0x83, 0xc5, 0x73, 0x7a, 0xca, 0x61, 0x9f, 0xaa, 0xce, 0x8c, 0xe9, - 0x2c, 0xe7, 0xf5, 0xe5, 0x86, 0xd0, 0xeb, 0x48, 0xaa, 0x59, 0xd6, 0x97, 0x95, 0x62, 0x47, 0x5a, - 0xad, 0x19, 0x15, 0x99, 0x85, 0x5c, 0x6d, 0x01, 0x37, 0x8b, 0xe3, 0x73, 0x25, 0x99, 0xed, 0x42, - 0xfd, 0x9c, 0x20, 0x29, 0x3b, 0xda, 0xfe, 0xa1, 0xb6, 0xf0, 0xc9, 0x4d, 0xfe, 0x96, 0xa2, 0x26, - 0x88, 0x61, 0xca, 0xb6, 0xa3, 0x62, 0xb0, 0x18, 0x89, 0xd2, 0xd2, 0x37, 0x58, 0xe2, 0xa1, 0xf2, - 0x2a, 0xef, 0xb8, 0x5c, 0x5f, 0xc7, 0x8d, 0x2b, 0x8b, 0x10, 0x76, 0x97, 0xf9, 0xdf, 0x0d, 0xc4, - 0x25, 0xaf, 0xc1, 0xa8, 0x45, 0x77, 0x93, 0xb5, 0x16, 0xf7, 0x6c, 0x01, 0x42, 0xd4, 0x0c, 0x38, - 0x0e, 0x0a, 0x72, 0xea, 0x86, 0x7b, 0xde, 0x4e, 0x24, 0x72, 0x89, 0x05, 0xb9, 0x00, 0x2b, 0x82, - 0x5c, 0x40, 0x34, 0x41, 0x2e, 0x60, 0x6c, 0x88, 0x59, 0x0b, 0x0d, 0xa1, 0x4c, 0xca, 0x92, 0x5a, - 0x0b, 0x4a, 0x5f, 0x05, 0xae, 0xd6, 0x57, 0xd6, 0x42, 0x83, 0xdc, 0x81, 0x52, 0xad, 0xd9, 0xf4, - 0x7b, 0xca, 0xa6, 0x67, 0xe6, 0xe8, 0xb0, 0x7a, 0xce, 0xe1, 0x40, 0x7d, 0x8b, 0x9e, 0xa0, 0x9a, - 0xf5, 0xa4, 0xd4, 0x8c, 0xc7, 0x7c, 0xab, 0x17, 0x46, 0x34, 0x58, 0x5a, 0x10, 0x55, 0x46, 0x1e, - 0x4d, 0x0e, 0x4c, 0xf1, 0x88, 0x51, 0xcd, 0xff, 0x64, 0x60, 0x89, 0xc9, 0x9b, 0x00, 0x4b, 0x1d, - 0xa6, 0xd8, 0x36, 0x69, 0xcc, 0x00, 0x37, 0xcf, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, 0x3d, 0xeb, - 0xdc, 0xd0, 0x59, 0xb3, 0x2c, 0xa5, 0x9a, 0x2c, 0xec, 0x28, 0x22, 0xcb, 0x40, 0x40, 0x53, 0x59, - 0x26, 0xc8, 0xe4, 0x1a, 0x8c, 0x2d, 0xd5, 0x1e, 0xd6, 0x7a, 0xd1, 0x1e, 0xb6, 0x57, 0x91, 0x0b, - 0x2c, 0xcf, 0x69, 0xdb, 0x4e, 0x2f, 0xda, 0xb3, 0x64, 0xa2, 0xf9, 0xb3, 0x06, 0x8c, 0x2b, 0x73, - 0x95, 0x15, 0x75, 0x2d, 0xf0, 0x3f, 0xa4, 0xcd, 0x48, 0x6f, 0xa5, 0x2e, 0x07, 0xa6, 0x8a, 0x1a, - 0xa3, 0xa6, 0x5a, 0x27, 0x77, 0x8a, 0xd6, 0x31, 0x67, 0x85, 0x08, 0x60, 0x7b, 0x00, 0xc5, 0xc4, - 0x81, 0x7b, 0x00, 0xa6, 0xe3, 0xa8, 0x7b, 0x00, 0x96, 0x6e, 0xfe, 0x9e, 0xc1, 0xa6, 0x2e, 0x99, - 0x05, 0x78, 0x40, 0x0f, 0x22, 0x67, 0xfb, 0xae, 0xd7, 0xd2, 0x4c, 0x57, 0xfb, 0x08, 0xb5, 0x77, - 0xbc, 0x16, 0xb5, 0x14, 0x14, 0x72, 0x1b, 0x8a, 0x0f, 0x82, 0xed, 0x37, 0x10, 0x3d, 0x17, 0x8b, - 0xe0, 0xb3, 0xfb, 0xc1, 0xf6, 0x1b, 0x88, 0xac, 0x8e, 0x57, 0x89, 0x48, 0x4c, 0x18, 0x5d, 0xf0, - 0xdb, 0x8e, 0x27, 0x97, 0x3d, 0x60, 0x6b, 0x87, 0x8b, 0x10, 0x4b, 0xa4, 0x30, 0xa1, 0xdf, 0x58, - 0x5b, 0x11, 0x03, 0x13, 0x85, 0x7e, 0xd8, 0xed, 0x58, 0x0c, 0x66, 0x7e, 0xd7, 0x80, 0x71, 0x45, - 0x22, 0x91, 0xcf, 0x8b, 0x6d, 0xbe, 0x81, 0x46, 0xaa, 0x0b, 0xfd, 0x32, 0x8b, 0xa5, 0xf2, 0xe5, - 0x9a, 0x6d, 0xff, 0xc5, 0xa6, 0x3f, 0x91, 0x06, 0xb9, 0x61, 0xa4, 0xc1, 0x9b, 0x00, 0x5c, 0x97, - 0xc3, 0xe6, 0x54, 0xc6, 0x8d, 0x62, 0xd4, 0x53, 0x3b, 0x23, 0x41, 0x36, 0x7f, 0x2e, 0x07, 0x45, - 0xb1, 0x57, 0x99, 0x7b, 0x46, 0x75, 0x88, 0x37, 0x34, 0x1d, 0xe2, 0xac, 0x20, 0x55, 0x94, 0xdb, - 0xb9, 0x13, 0xf6, 0x28, 0x6f, 0x42, 0x59, 0x36, 0x01, 0xaa, 0x62, 0xaf, 0xc2, 0x98, 0xdc, 0x65, - 0x73, 0x45, 0x6c, 0x4a, 0xe3, 0xb9, 0x39, 0x67, 0xc9, 0x74, 0xf3, 0xdb, 0x23, 0x92, 0x96, 0xe7, - 0xc4, 0x9a, 0xb0, 0xe6, 0xba, 0x81, 0xda, 0x84, 0x8e, 0xeb, 0x06, 0x16, 0x42, 0x59, 0x47, 0xad, - 0xf5, 0xb6, 0x5b, 0x5e, 0x13, 0x71, 0x94, 0x59, 0xd3, 0x45, 0xa8, 0xcd, 0x50, 0xd5, 0x8e, 0x4a, - 0x90, 0xb5, 0x2d, 0x42, 0xfe, 0xd8, 0x2d, 0xc2, 0x8f, 0x41, 0x69, 0xbe, 0xed, 0x6a, 0x2a, 0x84, - 0x99, 0xd1, 0x28, 0x37, 0x63, 0x24, 0xae, 0x3c, 0x5c, 0x11, 0x6d, 0x74, 0xae, 0xd9, 0x76, 0xfb, - 0x15, 0x87, 0x84, 0xa5, 0xa6, 0xe3, 0x8f, 0x7c, 0x1c, 0x1d, 0xff, 0x0e, 0x94, 0x36, 0x42, 0xba, - 0xde, 0xeb, 0x74, 0x68, 0x0b, 0xd5, 0x89, 0x22, 0x97, 0x3d, 0xbd, 0x90, 0xda, 0x11, 0x42, 0xd5, - 0x02, 0xc4, 0xa8, 0xea, 0xb0, 0x1a, 0x3b, 0x66, 0x58, 0x7d, 0x1e, 0x0a, 0xb5, 0x6e, 0x57, 0x6e, - 0x7e, 0xe2, 0x45, 0xb2, 0xdb, 0xc5, 0xa5, 0x6f, 0xd2, 0xe9, 0x76, 0xf5, 0xad, 0x0c, 0x62, 0x13, - 0x0a, 0xe4, 0x41, 0x6f, 0x9b, 0x06, 0x1d, 0x1a, 0xd1, 0x50, 0x88, 0xe6, 0x70, 0x06, 0x90, 0xc7, - 0x8c, 0xb4, 0x31, 0xa7, 0x11, 0x70, 0xe3, 0x7a, 0x71, 0xbf, 0xb7, 0x4d, 0x6d, 0x21, 0xe3, 0xd5, - 0xb6, 0xcb, 0x60, 0x78, 0xb9, 0x01, 0x93, 0x7a, 0xfb, 0x3f, 0x05, 0xc5, 0xe2, 0xfd, 0x42, 0xb1, - 0x58, 0x29, 0x99, 0xbf, 0x90, 0x83, 0xf1, 0x5a, 0xb7, 0xfb, 0x8c, 0x5b, 0x20, 0x7e, 0x44, 0x9b, - 0xd5, 0x17, 0x92, 0xde, 0x3b, 0x85, 0xf1, 0xe1, 0x2f, 0x0c, 0x98, 0x4a, 0x51, 0xa8, 0xa5, 0x37, - 0x86, 0xdc, 0x91, 0xe7, 0x86, 0xdc, 0x91, 0xe7, 0x07, 0xef, 0xc8, 0xd5, 0x39, 0x53, 0xf8, 0x38, - 0x73, 0xe6, 0x15, 0xc8, 0xd7, 0xba, 0x5d, 0xd1, 0x2a, 0xe5, 0xa4, 0x55, 0x36, 0x6f, 0xf3, 0x85, - 0xc8, 0xe9, 0x76, 0x2d, 0x86, 0x61, 0xbe, 0x0e, 0x25, 0x04, 0xa3, 0x44, 0xbb, 0x2a, 0xa6, 0x02, - 0x17, 0x67, 0x1a, 0x19, 0x1f, 0xf6, 0xe6, 0xff, 0x36, 0x60, 0x04, 0xbf, 0x9f, 0xd1, 0xe1, 0x32, - 0xa7, 0x0d, 0x97, 0x8a, 0x32, 0x5c, 0x86, 0x19, 0x28, 0x7f, 0x90, 0xc7, 0xd6, 0x12, 0x43, 0x44, - 0xec, 0xe9, 0x8c, 0x8c, 0x3d, 0xdd, 0xc7, 0x10, 0xe0, 0xfb, 0xe9, 0xdd, 0x5d, 0x1e, 0x3b, 0xe3, - 0xc5, 0x74, 0x51, 0x9f, 0xca, 0xc6, 0xee, 0x3e, 0x90, 0xa5, 0x4e, 0x48, 0x9b, 0xbd, 0x80, 0x36, - 0xf6, 0xbd, 0xee, 0x26, 0x0d, 0xbc, 0x9d, 0x03, 0xa1, 0x19, 0xa2, 0x8c, 0xf5, 0x44, 0xaa, 0x1d, - 0xee, 0x7b, 0x5d, 0xfb, 0x11, 0xa6, 0x5b, 0x19, 0x34, 0xe4, 0x3d, 0x18, 0xb3, 0xe8, 0xe3, 0xc0, - 0x8b, 0xa8, 0x68, 0xdb, 0xc9, 0x78, 0x1f, 0x80, 0x50, 0xae, 0x9b, 0x04, 0xfc, 0x43, 0xed, 0x7f, - 0x91, 0xfe, 0xc9, 0x6d, 0xa3, 0xbe, 0x33, 0x82, 0x73, 0xe1, 0x84, 0x93, 0xb2, 0x63, 0x36, 0xe8, - 0x7a, 0x67, 0xe6, 0x4f, 0xd3, 0x99, 0x9b, 0x50, 0x66, 0x5b, 0xb7, 0xd4, 0x4e, 0xfd, 0x4a, 0xd2, - 0x97, 0x37, 0xd5, 0xe4, 0xe3, 0x0e, 0xc9, 0x34, 0x3e, 0xc4, 0x4e, 0x0f, 0x12, 0x7e, 0xf8, 0xf6, - 0xbc, 0xc2, 0x38, 0x63, 0x78, 0xc4, 0xa2, 0xa3, 0xc9, 0x1b, 0xeb, 0xd4, 0x03, 0x63, 0xf4, 0xe3, - 0x0d, 0x8c, 0xb1, 0x8f, 0x32, 0x30, 0xd2, 0xc7, 0x93, 0xc5, 0xd3, 0x1c, 0x4f, 0x5e, 0x7e, 0x0f, - 0xa6, 0xfb, 0x5a, 0xf8, 0x34, 0x47, 0x7c, 0x9f, 0xdc, 0xb0, 0xfc, 0xe9, 0xb8, 0x5d, 0xc8, 0x1c, - 0x6e, 0x47, 0xbd, 0x80, 0x36, 0x23, 0x14, 0xbd, 0x42, 0x5a, 0x06, 0x02, 0x96, 0xda, 0x2f, 0x23, - 0x8c, 0xbc, 0x0b, 0x63, 0xfc, 0x88, 0x24, 0x9c, 0xc9, 0x61, 0xdf, 0x4f, 0x88, 0x1c, 0x39, 0x54, - 0x9c, 0x53, 0x73, 0x0c, 0xb5, 0x55, 0x05, 0x91, 0x79, 0x0f, 0x46, 0xc5, 0x11, 0xcb, 0xf1, 0xf3, - 0xa2, 0x0a, 0x23, 0x9b, 0x49, 0xcb, 0xa0, 0x59, 0x9c, 0x57, 0xc2, 0xe2, 0x70, 0xf3, 0x97, 0x0c, - 0x98, 0xd4, 0x6b, 0x49, 0x6e, 0xc2, 0xa8, 0x38, 0x03, 0x34, 0xf0, 0x0c, 0x90, 0xd5, 0x66, 0x94, - 0x9f, 0xfe, 0x69, 0x67, 0x7e, 0x02, 0x8b, 0x89, 0x7e, 0xc1, 0x01, 0xeb, 0x22, 0x44, 0xbf, 0x18, - 0xa4, 0x96, 0x4c, 0x63, 0x5b, 0x2e, 0x8b, 0x86, 0xbd, 0x56, 0xa4, 0x6e, 0xb9, 0x02, 0x84, 0x58, - 0x22, 0xc5, 0x3c, 0x34, 0x00, 0x1a, 0x8d, 0xfb, 0x0f, 0xe8, 0xc1, 0x9a, 0xe3, 0x05, 0xb8, 0x6d, - 0xc5, 0xd9, 0xf8, 0x40, 0xf4, 0x56, 0x59, 0x6c, 0x5b, 0xf9, 0xcc, 0xdd, 0xa7, 0x07, 0xda, 0xb6, - 0x55, 0xa2, 0xe2, 0x94, 0x0f, 0xbc, 0x47, 0x4e, 0x44, 0x19, 0x61, 0x0e, 0x09, 0xf9, 0x94, 0xe7, - 0xd0, 0x14, 0xa5, 0x82, 0x4c, 0xbe, 0x0e, 0x93, 0xc9, 0x17, 0x3a, 0x1e, 0xe4, 0x71, 0x4f, 0x27, - 0x47, 0x84, 0x9e, 0x58, 0x7f, 0xe1, 0xe8, 0xb0, 0x7a, 0x59, 0xe1, 0x6a, 0x33, 0x2c, 0x85, 0x75, - 0x8a, 0x99, 0xf9, 0x3b, 0x06, 0xc0, 0xfa, 0x72, 0x43, 0x56, 0xf0, 0x1a, 0x14, 0x62, 0x6b, 0x50, - 0x99, 0xef, 0x8d, 0x53, 0x9b, 0x3f, 0x4c, 0x27, 0x2f, 0x42, 0x3e, 0xa9, 0xc9, 0xf4, 0xd1, 0x61, - 0x75, 0x42, 0xaf, 0x01, 0x4b, 0x25, 0xf7, 0x60, 0x6c, 0xa8, 0x32, 0xe3, 0xe8, 0xcc, 0x28, 0xab, - 0xa4, 0xc6, 0x5e, 0x78, 0x7f, 0x6b, 0xfd, 0xd3, 0xdb, 0x0b, 0xdf, 0xcc, 0xc1, 0x14, 0x6b, 0xd7, - 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x66, 0x77, 0xc5, 0x6f, 0x6b, 0x0a, 0xd1, 0x65, - 0x29, 0xb6, 0xd4, 0xba, 0x0d, 0xb5, 0x39, 0xfe, 0xb3, 0x31, 0x38, 0x9b, 0x41, 0x45, 0x5e, 0x13, - 0xde, 0x37, 0x89, 0xcd, 0x08, 0xbd, 0x6b, 0x7e, 0x78, 0x58, 0x2d, 0x4b, 0xf4, 0xf5, 0xc4, 0xdb, - 0x66, 0x0e, 0xc6, 0xc5, 0xd6, 0x67, 0x25, 0xd1, 0xa8, 0xd1, 0x6d, 0x43, 0xda, 0xc4, 0x50, 0x34, - 0xa9, 0x48, 0xa4, 0x06, 0xe5, 0xf9, 0x3d, 0xda, 0xdc, 0xf7, 0x3a, 0xbb, 0x0f, 0xe8, 0x01, 0xd7, - 0x97, 0xca, 0xf5, 0xe7, 0xd9, 0x4e, 0xab, 0x29, 0xe0, 0xac, 0x4b, 0xf5, 0x4d, 0x9c, 0x46, 0x42, - 0xde, 0x85, 0xf1, 0x86, 0xb7, 0xdb, 0x91, 0x1c, 0x0a, 0xc8, 0xe1, 0xca, 0xd1, 0x61, 0xf5, 0x42, - 0xc8, 0xc1, 0xfd, 0x0c, 0x54, 0x02, 0xf2, 0x2a, 0x8c, 0x58, 0x7e, 0x8b, 0xf2, 0x65, 0x58, 0xf8, - 0x73, 0x04, 0x0c, 0xa0, 0xda, 0xa6, 0x11, 0x83, 0xdc, 0x87, 0x31, 0xf6, 0xe7, 0xa1, 0xd3, 0x9d, - 0x19, 0x45, 0xb9, 0x4d, 0x62, 0x05, 0x1f, 0xa1, 0x5d, 0xaf, 0xb3, 0xab, 0xea, 0xf8, 0x2d, 0x6a, - 0xb7, 0x9d, 0xae, 0xb6, 0x2e, 0x72, 0x44, 0xb2, 0x09, 0xe3, 0x89, 0x20, 0x08, 0x67, 0xc6, 0xb4, - 0xb3, 0xa0, 0x24, 0xa5, 0xfe, 0x19, 0xc1, 0xec, 0x62, 0xd4, 0x0a, 0x71, 0x6c, 0x77, 0x19, 0xbe, - 0x5e, 0x19, 0x85, 0x91, 0xb6, 0x07, 0x29, 0x0e, 0xde, 0x83, 0x18, 0x27, 0xee, 0x41, 0x5c, 0x00, - 0xd1, 0x48, 0xb5, 0xd6, 0xae, 0x70, 0xbf, 0x7a, 0x75, 0xf0, 0x00, 0xbb, 0x99, 0x20, 0xe3, 0x9c, - 0xe4, 0x96, 0x29, 0xd1, 0xfe, 0x4e, 0x6b, 0x57, 0xb3, 0x4c, 0xc5, 0xa8, 0xac, 0x19, 0x12, 0x51, - 0x23, 0x77, 0xe0, 0xb2, 0x19, 0x92, 0x94, 0xa4, 0x19, 0x3e, 0x7c, 0x1c, 0x0d, 0x6a, 0x06, 0x85, - 0x11, 0x59, 0x01, 0xa8, 0x35, 0x23, 0xef, 0x11, 0xc5, 0x21, 0x31, 0xae, 0x35, 0xc4, 0x7c, 0xed, - 0x01, 0x3d, 0x68, 0xd0, 0x28, 0xf6, 0x6c, 0x38, 0xef, 0x20, 0x6a, 0x6a, 0x98, 0x58, 0x0a, 0x07, - 0xd2, 0x85, 0xf3, 0x35, 0xd7, 0xf5, 0xb8, 0x4b, 0xde, 0x7a, 0xc0, 0xc6, 0xaf, 0x8b, 0xac, 0xcb, - 0xd9, 0xac, 0x5f, 0x15, 0xac, 0x3f, 0xe3, 0xc4, 0x54, 0x76, 0xc4, 0xc9, 0xd2, 0xd9, 0x64, 0x33, - 0x36, 0x57, 0x61, 0x52, 0x6f, 0x52, 0xdd, 0x19, 0xad, 0x0c, 0x45, 0xab, 0x51, 0xb3, 0x1b, 0xf7, - 0x6b, 0xb7, 0x2a, 0x06, 0xa9, 0x40, 0x59, 0x7c, 0xcd, 0xd9, 0x73, 0x6f, 0xdc, 0xa9, 0xe4, 0x34, - 0xc8, 0x1b, 0xb7, 0xe6, 0x2a, 0x79, 0xf3, 0x0f, 0x0c, 0x28, 0xca, 0xf2, 0x91, 0x3b, 0x90, 0x6f, - 0x34, 0xee, 0xa7, 0x8e, 0x20, 0x93, 0xa5, 0x97, 0x2f, 0x32, 0x61, 0xb8, 0xa7, 0x2e, 0x32, 0x8d, - 0xc6, 0x7d, 0x46, 0xb7, 0xbe, 0xdc, 0x10, 0x4a, 0x4b, 0xc6, 0x70, 0x9d, 0x1e, 0x70, 0x2e, 0x73, - 0x07, 0xf2, 0xef, 0x6f, 0xad, 0x8b, 0xdd, 0x50, 0x46, 0xff, 0x22, 0xdd, 0x87, 0x8f, 0xd5, 0xa5, - 0x8f, 0x11, 0x98, 0x16, 0x8c, 0x2b, 0x53, 0x8b, 0x2b, 0x11, 0x6d, 0x3f, 0x76, 0xd3, 0x12, 0x4a, - 0x04, 0x83, 0x58, 0x22, 0x85, 0xe9, 0x3c, 0xcb, 0x7e, 0xd3, 0x69, 0x09, 0x6d, 0x04, 0x75, 0x9e, - 0x16, 0x03, 0x58, 0x1c, 0x6e, 0xfe, 0xa1, 0x01, 0x95, 0xb5, 0xc0, 0x7f, 0xe4, 0x31, 0x09, 0xbc, - 0xee, 0xef, 0xd3, 0xce, 0xe6, 0x2d, 0xf2, 0xba, 0x14, 0x02, 0x5c, 0x85, 0xbb, 0xc8, 0xa8, 0x50, - 0x08, 0xfc, 0xf0, 0xb0, 0x0a, 0x8d, 0x83, 0x30, 0xa2, 0x6d, 0x96, 0x2e, 0x05, 0x81, 0xe2, 0xed, - 0x96, 0x1b, 0xde, 0x83, 0xe6, 0x04, 0x6f, 0xb7, 0x2a, 0x8c, 0x60, 0x71, 0x14, 0x27, 0x86, 0x91, - 0x88, 0x01, 0x2c, 0x0e, 0x57, 0x04, 0xf6, 0xb7, 0x73, 0x7d, 0x75, 0x98, 0xfb, 0x54, 0x79, 0xa1, - 0xe8, 0x95, 0x1b, 0x6a, 0x11, 0xfb, 0x0a, 0x9c, 0x4b, 0x37, 0x09, 0xda, 0x45, 0x6a, 0x30, 0xa5, - 0xc3, 0xa5, 0x89, 0xe4, 0x62, 0x66, 0x5e, 0x9b, 0x73, 0x56, 0x1a, 0xdf, 0xfc, 0xbe, 0x01, 0x25, - 0xfc, 0x6b, 0xf5, 0x5a, 0x94, 0x69, 0x36, 0xb5, 0xad, 0x86, 0x38, 0x90, 0x52, 0x0f, 0x8d, 0x9c, - 0xc7, 0xa1, 0x2d, 0x4e, 0xaf, 0x34, 0x39, 0x12, 0x23, 0x0b, 0x52, 0x7e, 0xfc, 0x16, 0x8a, 0x11, - 0x1a, 0x93, 0xf2, 0x73, 0xba, 0x30, 0x45, 0x2a, 0x90, 0x59, 0xff, 0xb1, 0x2f, 0xbf, 0x25, 0x4d, - 0xc3, 0xd8, 0x7f, 0x48, 0xe7, 0x6b, 0xc7, 0x1c, 0x12, 0x8d, 0xbc, 0x0e, 0xa3, 0x2c, 0x6b, 0x4b, - 0x1e, 0x62, 0xe0, 0xae, 0x02, 0xcb, 0x18, 0x68, 0xa7, 0x81, 0x1c, 0xc9, 0xfc, 0x67, 0xb9, 0x74, - 0x03, 0x0a, 0x2d, 0xe0, 0x94, 0x73, 0xe3, 0x2d, 0x18, 0xa9, 0xb5, 0x5a, 0xfe, 0x63, 0x21, 0x25, - 0xa4, 0x99, 0x26, 0x6e, 0x3f, 0xbe, 0xc2, 0x3a, 0x0c, 0x45, 0x3b, 0xfd, 0x65, 0x00, 0x32, 0x0f, - 0xa5, 0xda, 0x56, 0x63, 0x69, 0x69, 0x61, 0x7d, 0x7d, 0x59, 0x38, 0x19, 0xbf, 0x2c, 0xdb, 0xc7, - 0xf3, 0x5c, 0x3b, 0x8a, 0x5a, 0x03, 0x7c, 0x10, 0x13, 0x3a, 0xf2, 0x0e, 0xc0, 0xfb, 0xbe, 0xd7, - 0x79, 0x48, 0xa3, 0x3d, 0xdf, 0x15, 0x95, 0x67, 0x2a, 0xc5, 0xf8, 0x87, 0xbe, 0xd7, 0xb1, 0xdb, - 0x08, 0x66, 0x65, 0x4f, 0x90, 0x2c, 0xe5, 0x3f, 0x6b, 0xe9, 0xba, 0x1f, 0xa1, 0x0e, 0x33, 0x92, - 0xb4, 0xf4, 0xb6, 0x1f, 0xa5, 0xcf, 0x58, 0x24, 0x9a, 0xf9, 0xcb, 0x39, 0x98, 0xe4, 0x3b, 0x55, - 0x3e, 0x60, 0x9e, 0xd9, 0xc9, 0xf8, 0x96, 0x36, 0x19, 0x2f, 0xc9, 0x85, 0x41, 0xa9, 0xda, 0x50, - 0x53, 0x71, 0x0f, 0x48, 0x3f, 0x0d, 0xb1, 0xa4, 0x3d, 0x65, 0x98, 0x59, 0x78, 0x2b, 0x39, 0x3b, - 0x0e, 0x91, 0xc8, 0x46, 0x51, 0x18, 0x5a, 0x1a, 0x0f, 0xf3, 0x97, 0x72, 0x30, 0xa1, 0xe8, 0x93, - 0xcf, 0x6c, 0xc3, 0x7f, 0x51, 0x6b, 0x78, 0x79, 0x06, 0xa1, 0xd4, 0x6c, 0xa8, 0x76, 0xef, 0xc1, - 0x74, 0x1f, 0x49, 0x5a, 0x2d, 0x37, 0x86, 0x51, 0xcb, 0x5f, 0xeb, 0x3f, 0xdc, 0xe6, 0x0e, 0xc9, - 0xf1, 0xe1, 0xb6, 0x7a, 0x9a, 0xfe, 0xcd, 0x1c, 0x9c, 0x13, 0x5f, 0xb5, 0x9e, 0xeb, 0x45, 0xf3, - 0x7e, 0x67, 0xc7, 0xdb, 0x7d, 0x66, 0xfb, 0xa2, 0xa6, 0xf5, 0x45, 0x55, 0xef, 0x0b, 0xa5, 0x82, - 0x83, 0xbb, 0xc4, 0xfc, 0x97, 0x45, 0x98, 0x19, 0x44, 0xc0, 0xb6, 0xfd, 0xca, 0xae, 0x0a, 0xb7, - 0xfd, 0xa9, 0x1d, 0x2b, 0xdf, 0x4f, 0x25, 0xce, 0x1c, 0xb9, 0x21, 0x9c, 0x39, 0x96, 0xa1, 0x82, - 0x59, 0x35, 0x68, 0xc8, 0x1a, 0x21, 0x4c, 0xbc, 0x21, 0xaf, 0x1e, 0x1d, 0x56, 0xaf, 0x38, 0x2c, - 0xcd, 0x0e, 0x45, 0xa2, 0xdd, 0x0b, 0x3c, 0x85, 0x47, 0x1f, 0x25, 0xf9, 0x1d, 0x03, 0x26, 0x11, - 0xb8, 0xf8, 0x88, 0x76, 0x22, 0x64, 0x56, 0x10, 0x87, 0x34, 0xf1, 0xa5, 0x93, 0x46, 0x14, 0x78, - 0x9d, 0x5d, 0x34, 0x24, 0x85, 0xf5, 0x6d, 0xd6, 0x0a, 0x7f, 0x7a, 0x58, 0x7d, 0xfb, 0xa3, 0x5c, - 0x64, 0x11, 0xac, 0x42, 0xb6, 0x91, 0xe7, 0x05, 0xa5, 0x98, 0x6d, 0xaa, 0x98, 0xa9, 0x12, 0x91, - 0x1f, 0x85, 0x8b, 0x8b, 0x1d, 0x67, 0xbb, 0x45, 0xe7, 0xfd, 0x4e, 0xe4, 0x75, 0x7a, 0x7e, 0x2f, - 0xac, 0x3b, 0xcd, 0xfd, 0x5e, 0x37, 0x14, 0xc6, 0x4e, 0xac, 0x79, 0x33, 0x4e, 0xb4, 0xb7, 0x79, - 0xaa, 0xc2, 0x72, 0x10, 0x03, 0x72, 0x1f, 0xa6, 0x79, 0x52, 0xad, 0x17, 0xf9, 0x8d, 0xa6, 0xd3, - 0xf2, 0x3a, 0xbb, 0x68, 0x03, 0x2d, 0xd6, 0x2f, 0xb3, 0xbd, 0xa5, 0xd3, 0x8b, 0x7c, 0x3b, 0xe4, - 0x70, 0x85, 0x5f, 0x3f, 0x11, 0x59, 0x82, 0x29, 0x8b, 0x3a, 0xee, 0x43, 0xe7, 0xc9, 0xbc, 0xd3, - 0x75, 0x9a, 0x5e, 0x74, 0x80, 0x3b, 0xb3, 0x7c, 0xbd, 0x7a, 0x74, 0x58, 0x7d, 0x2e, 0xa0, 0x8e, - 0x6b, 0xb7, 0x9d, 0x27, 0x76, 0x53, 0x24, 0x2a, 0xcc, 0xd2, 0x74, 0x31, 0x2b, 0xaf, 0x13, 0xb3, - 0x2a, 0xa5, 0x59, 0x79, 0x9d, 0xc1, 0xac, 0x12, 0x3a, 0xc9, 0x6a, 0xdd, 0x09, 0x76, 0x69, 0xc4, - 0x8d, 0x84, 0x70, 0xd5, 0xb8, 0x6e, 0x28, 0xac, 0x22, 0x4c, 0xb3, 0xd1, 0x60, 0x98, 0x66, 0xa5, - 0xd0, 0xb1, 0x91, 0xb7, 0x15, 0x78, 0x11, 0x55, 0x6b, 0x38, 0x8e, 0xc5, 0xc2, 0xf6, 0x47, 0x33, - 0xe9, 0xa0, 0x2a, 0xf6, 0x51, 0x26, 0xdc, 0x94, 0x4a, 0x96, 0xfb, 0xb8, 0x65, 0xd7, 0xb2, 0x8f, - 0x32, 0xe6, 0xa6, 0xd6, 0x73, 0x02, 0xeb, 0xa9, 0x70, 0x1b, 0x50, 0xd1, 0x3e, 0x4a, 0xb2, 0xc2, - 0x1a, 0x2d, 0xa2, 0x1d, 0x36, 0xa2, 0x85, 0x91, 0x74, 0x12, 0x8b, 0xf6, 0x92, 0xd8, 0x53, 0x57, - 0x02, 0x99, 0x6c, 0x67, 0x98, 0x4c, 0xd3, 0xc4, 0xef, 0x17, 0x8a, 0x23, 0x95, 0x51, 0xab, 0xc2, - 0x87, 0x7c, 0xc4, 0x06, 0x0e, 0xca, 0x62, 0xf3, 0x37, 0x72, 0x70, 0x49, 0x8a, 0x63, 0x1a, 0x3d, - 0xf6, 0x83, 0x7d, 0xaf, 0xb3, 0xfb, 0x8c, 0x4b, 0xd5, 0xbb, 0x9a, 0x54, 0x7d, 0x29, 0xb5, 0xc2, - 0xa5, 0x6a, 0x79, 0x8c, 0x68, 0xfd, 0x93, 0x11, 0x78, 0xfe, 0x58, 0x2a, 0xf2, 0x01, 0x5b, 0x05, - 0x3d, 0xda, 0x89, 0x96, 0xdc, 0x16, 0x65, 0xdb, 0x30, 0xbf, 0x17, 0x09, 0x63, 0xf6, 0x8b, 0x47, - 0x87, 0xd5, 0xb3, 0xfc, 0x2e, 0x86, 0xed, 0xb9, 0x2d, 0x6a, 0x47, 0x3c, 0x59, 0xeb, 0xa6, 0x7e, - 0x6a, 0xc6, 0x32, 0xbe, 0x19, 0xb6, 0xd4, 0x89, 0x68, 0xf0, 0xc8, 0xe1, 0x2e, 0xe9, 0x82, 0xe5, - 0x3e, 0xa5, 0x5d, 0xdb, 0x61, 0xa9, 0xb6, 0x27, 0x92, 0x75, 0x96, 0x7d, 0xd4, 0xe4, 0xae, 0xc2, - 0x72, 0x9e, 0x6d, 0x0e, 0x1e, 0x3a, 0x4f, 0x84, 0xc6, 0x8b, 0xf6, 0x55, 0x85, 0x25, 0xf7, 0x87, - 0x6b, 0x3b, 0x4f, 0xac, 0x7e, 0x12, 0xf2, 0x75, 0x38, 0x2f, 0x04, 0x37, 0x13, 0x62, 0x81, 0xdf, - 0x92, 0x35, 0x2e, 0x20, 0xaf, 0x57, 0x8e, 0x0e, 0xab, 0x17, 0x85, 0xd8, 0xb7, 0x9b, 0x1c, 0x23, - 0xb3, 0xd6, 0xd9, 0x5c, 0xc8, 0x3a, 0x5b, 0xc8, 0x52, 0xcd, 0xf1, 0x90, 0x86, 0xa1, 0xb3, 0x2b, - 0xb5, 0x63, 0x7e, 0xa2, 0xa4, 0x34, 0xa6, 0xdd, 0xe6, 0xe9, 0xd6, 0x40, 0x4a, 0x72, 0x1f, 0x26, - 0xb7, 0xe8, 0xb6, 0xda, 0x3f, 0xa3, 0xf1, 0x14, 0xaf, 0x3c, 0xa6, 0xdb, 0x83, 0x3b, 0x27, 0x45, - 0x47, 0x3c, 0x98, 0x5e, 0x0b, 0xfc, 0x27, 0x07, 0x6c, 0xab, 0x47, 0x3b, 0x34, 0x40, 0x47, 0xac, - 0x31, 0x34, 0x57, 0xcd, 0x24, 0x9a, 0xa5, 0x9e, 0x5e, 0xff, 0xcc, 0xd1, 0x61, 0xf5, 0xf9, 0x2e, - 0x03, 0xdb, 0x2d, 0x01, 0xb7, 0x53, 0x17, 0xb3, 0xfa, 0xb9, 0x92, 0x1f, 0x87, 0x29, 0xcb, 0xef, - 0x45, 0x5e, 0x67, 0xb7, 0x11, 0x05, 0x4e, 0x44, 0x77, 0xb9, 0x20, 0x4f, 0x3c, 0xbe, 0x52, 0xa9, - 0xdc, 0x30, 0x1d, 0x70, 0xa0, 0x1d, 0x0a, 0xa8, 0x26, 0x49, 0x75, 0x02, 0xf3, 0xd7, 0x72, 0x30, - 0x23, 0xba, 0xc1, 0xa2, 0x4d, 0x3f, 0x70, 0x9f, 0xfd, 0x69, 0xbf, 0xa8, 0x4d, 0xfb, 0x17, 0x63, - 0x1f, 0xa5, 0xac, 0x4a, 0x1e, 0x33, 0xeb, 0x7f, 0xdf, 0x80, 0x2b, 0xc7, 0x11, 0xb1, 0xd6, 0x89, - 0x7d, 0xf0, 0x4a, 0x7d, 0xbe, 0x76, 0x5d, 0x38, 0x8b, 0xfd, 0x89, 0x86, 0xe3, 0xf0, 0xbe, 0x1f, - 0x46, 0x68, 0xbd, 0xcb, 0x69, 0x8e, 0x04, 0x75, 0xdf, 0x6f, 0xa1, 0x9c, 0xaf, 0xbf, 0xc6, 0xc4, - 0xf9, 0x9f, 0x1e, 0x56, 0x81, 0x81, 0x56, 0xf1, 0x30, 0x92, 0xad, 0xf9, 0x7c, 0xc4, 0xa0, 0x5d, - 0x3a, 0xb4, 0xd1, 0xfb, 0x63, 0x9f, 0x1e, 0x84, 0x56, 0x16, 0x6b, 0xb4, 0xd0, 0xd4, 0x7a, 0xd1, - 0xde, 0x5a, 0x40, 0x77, 0x68, 0x40, 0x3b, 0x4d, 0xfa, 0x29, 0xb3, 0xd0, 0xe8, 0x95, 0x1b, 0x6a, - 0x7b, 0xf2, 0xe7, 0x63, 0x70, 0x2e, 0x8b, 0x8c, 0xb5, 0x8b, 0xa2, 0x11, 0xa7, 0x6f, 0xf1, 0xfe, - 0xff, 0x06, 0x94, 0x1b, 0xb4, 0xe9, 0x77, 0xdc, 0xbb, 0x4e, 0x33, 0xf2, 0xa5, 0x4b, 0x86, 0xcd, - 0x25, 0x1b, 0x83, 0xdb, 0x3b, 0x98, 0xa0, 0x59, 0x06, 0xbe, 0x34, 0x9c, 0x22, 0xda, 0xf4, 0xd1, - 0x69, 0x35, 0x62, 0x63, 0x32, 0xc9, 0x02, 0x4f, 0x35, 0xb4, 0x4c, 0x49, 0x1d, 0x26, 0xe6, 0xfd, - 0x4e, 0x87, 0xb2, 0x0f, 0xc5, 0x05, 0xf3, 0xca, 0xd1, 0x61, 0x75, 0xa6, 0x29, 0x13, 0xd2, 0x16, - 0x02, 0x9d, 0x84, 0xdc, 0x86, 0xfc, 0xc6, 0xdc, 0x5d, 0xd1, 0x07, 0xd2, 0x59, 0x6d, 0x63, 0xee, - 0x2e, 0xee, 0x75, 0x99, 0xfe, 0x30, 0xd1, 0x9b, 0xdb, 0x51, 0x6d, 0xa0, 0x1b, 0x73, 0x77, 0xc9, - 0x2a, 0x4c, 0x5b, 0xf4, 0x27, 0x7a, 0x5e, 0x40, 0xc5, 0x04, 0x78, 0x78, 0xb7, 0x86, 0x7d, 0x51, - 0xe4, 0x72, 0x2c, 0xe0, 0x89, 0x52, 0xb7, 0xb7, 0xdb, 0x3b, 0xea, 0xcd, 0xb5, 0x7e, 0x5a, 0xf2, - 0x33, 0x70, 0x7e, 0xc1, 0x0b, 0x45, 0x99, 0xb9, 0xf1, 0xd1, 0xc5, 0x73, 0xc8, 0xd1, 0x01, 0xd3, - 0xe1, 0x0b, 0x99, 0xd3, 0xe1, 0x33, 0x6e, 0xcc, 0xc4, 0xe6, 0x96, 0x4d, 0x37, 0xed, 0xbb, 0x9a, - 0x9d, 0x0f, 0xf9, 0x10, 0x26, 0xd1, 0xda, 0x83, 0xf6, 0x58, 0x74, 0x67, 0x1e, 0x1b, 0x90, 0xf3, - 0xe7, 0x32, 0x73, 0xbe, 0x8c, 0xc6, 0x23, 0x1b, 0xad, 0xba, 0xe8, 0xfa, 0xac, 0xed, 0x11, 0x34, - 0xce, 0xe4, 0x7d, 0x98, 0x12, 0x8b, 0xce, 0xea, 0xce, 0xfa, 0x1e, 0x5d, 0x70, 0x0e, 0x84, 0x13, - 0x02, 0xea, 0x7f, 0x62, 0xa5, 0xb2, 0xfd, 0x1d, 0x3b, 0xda, 0xa3, 0xb6, 0xeb, 0x68, 0xe2, 0x39, - 0x45, 0x48, 0x7e, 0x0a, 0xc6, 0x97, 0x7d, 0x3c, 0x78, 0x42, 0x51, 0x53, 0x42, 0x3e, 0x5f, 0xc1, - 0x9b, 0xab, 0x1c, 0x9c, 0x5a, 0x44, 0x7e, 0x78, 0x58, 0x7d, 0xeb, 0xb4, 0xa3, 0x50, 0xc9, 0xc0, - 0x52, 0x73, 0x23, 0xf3, 0x50, 0xdc, 0xa2, 0xdb, 0xac, 0xb6, 0xe9, 0x5b, 0x57, 0x12, 0xcc, 0xe5, - 0xc5, 0x63, 0xf1, 0xa5, 0x9e, 0xea, 0x48, 0x0c, 0x12, 0xc0, 0x34, 0xb6, 0xcf, 0x9a, 0x13, 0x86, - 0x8f, 0xfd, 0xc0, 0x6d, 0xd1, 0x50, 0x1e, 0x8f, 0xf4, 0x37, 0xfe, 0x5c, 0x66, 0xe3, 0x5f, 0xe1, - 0x8d, 0xdf, 0x55, 0x38, 0xa8, 0xc3, 0xad, 0x8f, 0xbd, 0xf9, 0xcf, 0x0d, 0x1c, 0xf5, 0xe4, 0x06, - 0x3a, 0x9f, 0xc5, 0x1e, 0xe8, 0xb8, 0x9b, 0x75, 0xba, 0x5d, 0xdd, 0x87, 0x9c, 0xa3, 0xb0, 0xad, - 0xef, 0x5d, 0xa7, 0x49, 0x23, 0x69, 0x23, 0x45, 0xe4, 0x1d, 0x84, 0xa8, 0x5b, 0x5f, 0x8e, 0x43, - 0xbe, 0x0c, 0xe7, 0x16, 0xe8, 0x23, 0xaf, 0x49, 0x6b, 0x51, 0x44, 0x43, 0xde, 0xc2, 0xf3, 0x35, - 0x7e, 0x98, 0x58, 0xaa, 0xbf, 0x74, 0x74, 0x58, 0xbd, 0xea, 0x62, 0xba, 0xed, 0x24, 0x08, 0x76, - 0xd3, 0x51, 0x79, 0x65, 0x72, 0x30, 0xff, 0x97, 0x91, 0xb4, 0x3a, 0x79, 0x05, 0x0a, 0xd6, 0x5a, - 0x5c, 0x7e, 0x7e, 0x4e, 0x98, 0x2a, 0x3e, 0x22, 0x90, 0xaf, 0xc2, 0x79, 0x85, 0x0f, 0xb6, 0x08, - 0x75, 0x59, 0x81, 0x78, 0x65, 0x5e, 0xc6, 0x83, 0x21, 0xa5, 0x24, 0x0e, 0xc7, 0x48, 0x95, 0x28, - 0x9b, 0x07, 0xab, 0xac, 0x92, 0xb0, 0x40, 0x3b, 0x1e, 0xe7, 0xad, 0x54, 0x56, 0xe5, 0xed, 0x22, - 0x42, 0xba, 0xb2, 0x59, 0x1c, 0xde, 0x2f, 0x14, 0x0b, 0x95, 0x11, 0xf3, 0x2f, 0x0c, 0x25, 0xec, - 0xc0, 0x33, 0xba, 0x62, 0xdd, 0xd1, 0x56, 0xac, 0x73, 0x82, 0x34, 0xae, 0x15, 0x4b, 0xcb, 0xd4, - 0x32, 0xa6, 0x60, 0x42, 0x43, 0x42, 0x37, 0xdb, 0x8d, 0x90, 0x06, 0xdc, 0x26, 0xf9, 0xe9, 0x72, - 0xb3, 0x8d, 0xeb, 0x35, 0x94, 0xf7, 0xe4, 0x9f, 0x19, 0x30, 0x95, 0xa2, 0x60, 0xad, 0xc1, 0x40, - 0x6a, 0x6b, 0xf4, 0x42, 0x1a, 0x58, 0x08, 0xe5, 0x4e, 0x79, 0xcb, 0xba, 0x53, 0x5e, 0xcb, 0x62, - 0x30, 0xf2, 0x25, 0x18, 0xd9, 0xc0, 0x1d, 0x84, 0xee, 0xd7, 0x11, 0xf3, 0xc7, 0x44, 0x3e, 0xc3, - 0x7a, 0xec, 0xaf, 0x2a, 0x20, 0x30, 0x8d, 0x34, 0x60, 0x6c, 0x3e, 0xa0, 0x18, 0x60, 0xa0, 0x30, - 0xfc, 0x01, 0x5c, 0x93, 0x93, 0xa4, 0x0f, 0xe0, 0x04, 0x27, 0xf3, 0x57, 0x73, 0x40, 0x92, 0x3a, - 0xd2, 0x66, 0x40, 0xa3, 0xf0, 0x99, 0xed, 0xf4, 0xf7, 0xb4, 0x4e, 0x7f, 0xbe, 0xaf, 0xd3, 0x79, - 0xf5, 0x86, 0xea, 0xfb, 0x3f, 0x34, 0xe0, 0x42, 0x36, 0x21, 0x79, 0x11, 0x46, 0x57, 0xd7, 0xd7, - 0xa4, 0x6b, 0x90, 0xa8, 0x8a, 0xdf, 0x45, 0xcd, 0xd8, 0x12, 0x49, 0xe4, 0x75, 0x18, 0xfd, 0xc0, - 0x9a, 0x67, 0x4b, 0xa6, 0x72, 0xd3, 0xe5, 0x27, 0x02, 0xbb, 0xa9, 0x6f, 0xb9, 0x04, 0x92, 0xda, - 0xb7, 0xf9, 0xa7, 0xd6, 0xb7, 0xdf, 0xcc, 0xc1, 0x54, 0xad, 0xd9, 0xa4, 0x61, 0xc8, 0x14, 0x22, - 0x1a, 0x46, 0xcf, 0x6c, 0xc7, 0x66, 0x3b, 0xfd, 0x68, 0x75, 0x1b, 0xaa, 0x57, 0xff, 0xc8, 0x80, - 0xf3, 0x92, 0xea, 0x91, 0x47, 0x1f, 0xaf, 0xef, 0x05, 0x34, 0xdc, 0xf3, 0x5b, 0xee, 0xb0, 0x77, - 0xb6, 0x70, 0x95, 0xf6, 0x5a, 0x11, 0x0d, 0x54, 0x03, 0xf5, 0x0e, 0x42, 0xb4, 0x55, 0x1a, 0x21, - 0x64, 0x16, 0xc6, 0x6a, 0xdd, 0x6e, 0xe0, 0x3f, 0xe2, 0xd3, 0x7e, 0x42, 0x9c, 0x47, 0x72, 0x90, - 0x76, 0x7e, 0xc9, 0x41, 0xac, 0x18, 0x0b, 0xb4, 0xc3, 0x3d, 0x9a, 0x27, 0x78, 0x31, 0x5c, 0xda, - 0x51, 0x35, 0x34, 0x4c, 0x37, 0xbf, 0x51, 0x80, 0xb2, 0x5a, 0x11, 0x62, 0xc2, 0x28, 0x77, 0x4f, - 0x51, 0xdd, 0x04, 0x1c, 0x84, 0x58, 0x22, 0x25, 0xf1, 0xfa, 0xc9, 0x9d, 0xe8, 0xf5, 0xb3, 0x05, - 0x13, 0x6b, 0x81, 0xdf, 0xf5, 0x43, 0xea, 0xf2, 0x18, 0x31, 0x5c, 0x6a, 0x9d, 0x8d, 0x5d, 0x61, - 0x79, 0x9b, 0xb3, 0x24, 0xbe, 0x1d, 0xe8, 0x0a, 0x6c, 0x3b, 0x1d, 0x41, 0x46, 0xe7, 0xc3, 0x0d, - 0xfc, 0x4e, 0x28, 0xae, 0x0b, 0xc4, 0x06, 0x7e, 0x06, 0xd1, 0x0d, 0xfc, 0x0c, 0xa2, 0x4e, 0x8b, - 0x91, 0xa7, 0x35, 0x2d, 0xc8, 0xaf, 0x1a, 0x30, 0x5e, 0xeb, 0x74, 0x84, 0xd7, 0x8f, 0xbc, 0x68, - 0x7d, 0x3e, 0x31, 0xf2, 0x73, 0xb7, 0x50, 0x6e, 0xe3, 0xff, 0x9a, 0xb0, 0xf1, 0xbf, 0xf5, 0x91, - 0x6c, 0xfc, 0xeb, 0x81, 0xe3, 0x45, 0x21, 0x1e, 0xe6, 0x26, 0x19, 0xaa, 0xae, 0xbf, 0x4a, 0x39, - 0xc8, 0x5b, 0x50, 0x89, 0xc7, 0xe3, 0x52, 0xc7, 0xa5, 0x4f, 0x28, 0x77, 0x92, 0x9a, 0xe0, 0xb7, - 0x01, 0xb5, 0xc3, 0x8b, 0x34, 0xa2, 0xf9, 0x4d, 0x03, 0x2e, 0xa8, 0x03, 0xa2, 0xd1, 0xdb, 0x6e, - 0x7b, 0xb8, 0xfd, 0x21, 0x37, 0xa1, 0x24, 0xfa, 0x2b, 0x56, 0xe4, 0xfa, 0x03, 0x0b, 0x25, 0x28, - 0x64, 0x91, 0x75, 0x11, 0xe3, 0x21, 0x6c, 0x05, 0x67, 0x53, 0xd3, 0x8d, 0x25, 0xd5, 0x67, 0x44, - 0x63, 0x57, 0x02, 0xfc, 0xd6, 0xfb, 0x8e, 0x41, 0xcc, 0x77, 0x61, 0x5a, 0x2f, 0x65, 0x83, 0xe2, - 0x15, 0x34, 0x59, 0x35, 0x23, 0xbb, 0x6a, 0x32, 0xdd, 0xdc, 0x02, 0xd2, 0x47, 0x1f, 0xe2, 0x41, - 0x15, 0x8d, 0xe4, 0x41, 0xaa, 0x34, 0x77, 0xf5, 0x21, 0xc6, 0x21, 0xb6, 0xc6, 0xd5, 0xe6, 0x46, - 0x52, 0xf3, 0x2f, 0x4b, 0x70, 0x36, 0x43, 0x74, 0x9c, 0xb0, 0xb4, 0x57, 0xf5, 0xc9, 0x53, 0x8a, - 0x3d, 0x02, 0xe4, 0x94, 0x79, 0x57, 0x86, 0x53, 0x3a, 0x66, 0xaa, 0x1c, 0x17, 0x63, 0xe9, 0x93, - 0x58, 0xde, 0x55, 0xa7, 0x9d, 0x91, 0xa7, 0xe6, 0xb4, 0x53, 0x87, 0x09, 0x51, 0x2b, 0x31, 0x95, - 0x47, 0x13, 0xb3, 0x40, 0xc0, 0x13, 0xec, 0xbe, 0x29, 0xad, 0x93, 0x70, 0x1e, 0xa1, 0xdf, 0x7a, - 0x44, 0x05, 0x8f, 0x31, 0x95, 0x07, 0x26, 0x64, 0xf2, 0x50, 0x48, 0xc8, 0x3f, 0x32, 0x80, 0x08, - 0x88, 0x3a, 0x9f, 0x8b, 0xc7, 0xcd, 0x67, 0xf7, 0xe9, 0xcc, 0xe7, 0xe7, 0x65, 0x19, 0xb3, 0xe7, - 0x75, 0x46, 0xb1, 0xc8, 0x3f, 0x30, 0x60, 0x9a, 0x7b, 0x8e, 0xa8, 0x85, 0x2d, 0x1d, 0x57, 0xd8, - 0xe6, 0xd3, 0x29, 0xec, 0x95, 0x10, 0xb3, 0x1d, 0x50, 0xd6, 0xfe, 0x42, 0x91, 0x1f, 0x05, 0x88, - 0x67, 0x94, 0xf4, 0x50, 0xbc, 0x92, 0x21, 0x05, 0x62, 0xa4, 0xe4, 0x92, 0x65, 0x14, 0xd3, 0xa9, - 0x3e, 0x3d, 0x09, 0x37, 0xf2, 0x33, 0x70, 0x8e, 0xcd, 0x97, 0x18, 0x22, 0xfc, 0xdc, 0x66, 0xc6, - 0x31, 0x97, 0xcf, 0x0f, 0x5e, 0xda, 0x6f, 0x66, 0x91, 0xf1, 0x7b, 0x22, 0xc9, 0x95, 0xfb, 0xa8, - 0xad, 0x6e, 0xf9, 0xb2, 0x28, 0xd0, 0xa1, 0x15, 0x4b, 0x1f, 0xce, 0x94, 0x31, 0xcf, 0x4c, 0xf9, - 0x76, 0x49, 0xce, 0x05, 0x2e, 0xdf, 0x42, 0xfd, 0xa2, 0x07, 0x82, 0xc8, 0x07, 0x40, 0x1a, 0xbd, - 0xdd, 0x5d, 0x1a, 0x46, 0xd4, 0xe5, 0x30, 0x1a, 0x84, 0x33, 0x13, 0x28, 0x1f, 0xd0, 0x4c, 0x15, - 0xca, 0x54, 0x3b, 0x90, 0xc9, 0xea, 0x20, 0xe9, 0x27, 0xbe, 0xbc, 0x0d, 0x97, 0x06, 0x56, 0x33, - 0xe3, 0x12, 0xc7, 0xac, 0x7e, 0x89, 0xe3, 0xd2, 0x20, 0x71, 0x18, 0xaa, 0x17, 0x39, 0x7e, 0xcb, - 0x48, 0xc9, 0x3f, 0xa1, 0xac, 0xf0, 0xc8, 0x73, 0x83, 0x16, 0x88, 0x1c, 0x5e, 0xc6, 0xe7, 0x12, - 0x32, 0x97, 0x28, 0x49, 0x4c, 0x42, 0xaa, 0x12, 0x16, 0x65, 0xe5, 0xc7, 0x14, 0x85, 0xe6, 0x3f, - 0x31, 0x80, 0xf0, 0x12, 0xce, 0x3b, 0x5d, 0x67, 0xdb, 0x6b, 0x79, 0x91, 0x47, 0x43, 0xf2, 0x00, - 0x2a, 0x82, 0x85, 0xb3, 0xdd, 0xa2, 0xaa, 0x7f, 0x96, 0x38, 0xc0, 0x8d, 0xd3, 0xec, 0xb4, 0x5a, - 0xd3, 0x47, 0x38, 0xa0, 0xf3, 0x72, 0x1f, 0xa3, 0xf3, 0xcc, 0x1f, 0x18, 0x70, 0xa9, 0xbf, 0xd8, - 0x22, 0xe7, 0xb8, 0xf1, 0x8c, 0x13, 0x1a, 0x2f, 0xab, 0x96, 0x39, 0x34, 0x7d, 0x3e, 0xb5, 0x5a, - 0xe6, 0x13, 0x4b, 0xea, 0xe9, 0x6b, 0xf9, 0x8b, 0x39, 0x28, 0xaf, 0xb5, 0x7a, 0xbb, 0x5e, 0x67, - 0xc1, 0x89, 0x9c, 0x67, 0x76, 0x4b, 0xf1, 0xa6, 0xb6, 0xa5, 0x88, 0x3d, 0xb2, 0xe2, 0x8a, 0x0d, - 0x17, 0x05, 0xcc, 0x80, 0xa9, 0x84, 0x84, 0xcf, 0xd2, 0xfb, 0x50, 0x60, 0x1f, 0x42, 0x43, 0xb9, - 0xda, 0xc7, 0x18, 0xb1, 0x6e, 0xc6, 0xff, 0x84, 0x92, 0xaf, 0xc7, 0x5e, 0x43, 0x0e, 0x97, 0xbf, - 0xc0, 0x43, 0x27, 0x9d, 0x3e, 0xcc, 0xe3, 0x3f, 0x36, 0xa0, 0x92, 0xae, 0x09, 0x79, 0x00, 0x63, - 0x8c, 0x93, 0x17, 0x87, 0x61, 0x7a, 0x69, 0x40, 0x9d, 0x6f, 0x0a, 0x34, 0x5e, 0x3c, 0x6c, 0x7c, - 0xca, 0x21, 0x96, 0xe4, 0x70, 0xd9, 0x82, 0xb2, 0x8a, 0x95, 0x51, 0xba, 0xd7, 0x74, 0xd1, 0x74, - 0x21, 0xbb, 0x1d, 0xd4, 0x52, 0xff, 0xa6, 0x56, 0x6a, 0x21, 0x94, 0x86, 0x8d, 0xa7, 0x87, 0x57, - 0xd2, 0x78, 0xd4, 0x10, 0x75, 0x9c, 0xc9, 0x00, 0x23, 0xfa, 0x95, 0x34, 0x0e, 0x63, 0x7b, 0x11, - 0x9e, 0x9f, 0x18, 0x67, 0xb8, 0x17, 0xe9, 0x22, 0x44, 0xd5, 0x67, 0x39, 0x8e, 0xf9, 0xb7, 0xf3, - 0x70, 0x21, 0x29, 0x1e, 0x8f, 0x2e, 0xb8, 0xe6, 0x04, 0x4e, 0x3b, 0x3c, 0x61, 0x06, 0x5c, 0xef, - 0x2b, 0x1a, 0x5e, 0xb9, 0x96, 0x45, 0x53, 0x0a, 0x64, 0xa6, 0x0a, 0x84, 0x9b, 0x38, 0x5e, 0x20, - 0x59, 0x0c, 0xf2, 0x00, 0xf2, 0x0d, 0x1a, 0x89, 0x8b, 0x99, 0xd7, 0xfa, 0x5a, 0x55, 0x2d, 0xd7, - 0xcd, 0x06, 0x8d, 0x78, 0x27, 0x72, 0xdf, 0x76, 0xaa, 0xf9, 0x9a, 0x33, 0x75, 0x7c, 0x0b, 0x46, - 0x17, 0x9f, 0x74, 0x69, 0x33, 0x12, 0xf7, 0x31, 0x5f, 0x3d, 0x9e, 0x1f, 0xc7, 0x55, 0x6e, 0x7d, - 0x52, 0x04, 0xa8, 0x8d, 0xc5, 0x51, 0x2e, 0xdf, 0x81, 0xa2, 0xcc, 0xfc, 0x54, 0xb7, 0x17, 0xdf, - 0x84, 0x71, 0x25, 0x93, 0x53, 0x0d, 0xfa, 0xbf, 0x34, 0x60, 0x94, 0x09, 0xbd, 0xcd, 0x37, 0x9e, - 0x51, 0x89, 0x74, 0x5b, 0x93, 0x48, 0xd3, 0xca, 0x35, 0x1b, 0x9c, 0x97, 0x6f, 0x9c, 0x20, 0x8b, - 0x0e, 0x0d, 0x80, 0x04, 0x99, 0xdc, 0x83, 0x31, 0x7e, 0x7e, 0x21, 0x43, 0x77, 0xaa, 0xf7, 0x76, - 0x44, 0x4a, 0xa2, 0xe5, 0xf8, 0xdd, 0xb4, 0x5a, 0x28, 0xa9, 0xc9, 0x42, 0xe2, 0xdb, 0xac, 0x5e, - 0x14, 0x65, 0x6c, 0xe6, 0xfd, 0x0e, 0xbf, 0xc7, 0x11, 0x2a, 0x21, 0xae, 0xb2, 0x9d, 0x9c, 0x6b, - 0xc2, 0xb0, 0x91, 0x3f, 0x8e, 0xc9, 0x05, 0xc1, 0x24, 0xdb, 0xe6, 0xf1, 0xad, 0x71, 0x7e, 0x33, - 0x42, 0x16, 0xec, 0x1d, 0x28, 0xdf, 0xf5, 0x83, 0xc7, 0x4e, 0xe0, 0xd6, 0x76, 0xa9, 0xf0, 0x4a, - 0x2f, 0xa2, 0x6b, 0xf9, 0xc4, 0x0e, 0x87, 0xdb, 0x0e, 0x4b, 0xf8, 0xe1, 0x61, 0xb5, 0x50, 0xf7, - 0xfd, 0x96, 0xa5, 0xa1, 0x93, 0x55, 0x98, 0x78, 0xe8, 0x3c, 0x11, 0x67, 0x84, 0xeb, 0xeb, 0xcb, - 0xc2, 0xb7, 0xe5, 0xd5, 0xa3, 0xc3, 0xea, 0xa5, 0xb6, 0xf3, 0x24, 0x3e, 0x5b, 0x1c, 0xec, 0x7e, - 0xad, 0xd3, 0x13, 0x0f, 0x26, 0xd7, 0xfc, 0x20, 0x12, 0x99, 0x30, 0x9d, 0x36, 0x3f, 0xe0, 0x94, - 0x69, 0x36, 0xf3, 0x94, 0xe9, 0x12, 0x53, 0xe4, 0xed, 0x9d, 0x98, 0x5c, 0xbb, 0xce, 0xa7, 0x31, - 0x26, 0xef, 0xc0, 0xf4, 0x3c, 0x0d, 0x22, 0x6f, 0xc7, 0x6b, 0x3a, 0x11, 0xbd, 0xeb, 0x07, 0x6d, - 0x27, 0x12, 0x06, 0x15, 0xdc, 0x50, 0x37, 0x29, 0xe7, 0xd4, 0x76, 0x22, 0xab, 0x1f, 0x93, 0x7c, - 0x35, 0xcb, 0x5b, 0x68, 0x04, 0xab, 0xff, 0x3a, 0x53, 0x0a, 0x32, 0xbc, 0x85, 0x06, 0x34, 0x41, - 0x86, 0xdf, 0xd0, 0xee, 0x71, 0x47, 0xad, 0xc5, 0xfa, 0x2d, 0x71, 0xec, 0x7b, 0xf2, 0x51, 0x6a, - 0xdc, 0x6f, 0x03, 0x8e, 0x54, 0xe7, 0x20, 0x5f, 0x5f, 0xbb, 0x8b, 0x26, 0x12, 0x71, 0xb4, 0x49, - 0x3b, 0x7b, 0x4e, 0xa7, 0x89, 0xba, 0x8c, 0xf0, 0x97, 0x50, 0x05, 0x5e, 0x7d, 0xed, 0x2e, 0x71, - 0xe0, 0xec, 0x1a, 0x0d, 0xda, 0x5e, 0xf4, 0xe5, 0x5b, 0xb7, 0x94, 0x8e, 0x2a, 0x62, 0xd1, 0x66, - 0x45, 0xd1, 0xaa, 0x5d, 0x44, 0xb1, 0x9f, 0xdc, 0xba, 0x95, 0xd9, 0x1d, 0x71, 0xc1, 0xb2, 0x78, - 0x91, 0x45, 0x98, 0x7c, 0xe8, 0x3c, 0x11, 0x87, 0xe0, 0xf1, 0x1e, 0x2f, 0x8f, 0xde, 0xf8, 0x38, - 0xb0, 0x9a, 0x49, 0x92, 0xda, 0xc5, 0x3a, 0x11, 0x79, 0x1b, 0xc6, 0x93, 0xe1, 0x15, 0xe2, 0xf1, - 0x67, 0x9e, 0xbb, 0x61, 0x2a, 0x83, 0x53, 0xb3, 0x25, 0x29, 0xe8, 0x64, 0x23, 0xde, 0xa2, 0x73, - 0x85, 0x14, 0x0f, 0x3c, 0x4b, 0xf5, 0x59, 0x75, 0x8b, 0xee, 0x60, 0x8a, 0x56, 0xad, 0xa9, 0x58, - 0x45, 0xe7, 0xde, 0x39, 0x96, 0xce, 0x45, 0xd9, 0xf9, 0xaf, 0x05, 0x7e, 0xbb, 0x1b, 0xa1, 0x97, - 0x62, 0x6a, 0xe7, 0xdf, 0xc5, 0x94, 0x8c, 0x9d, 0x3f, 0x27, 0xc9, 0x3e, 0xdb, 0x9f, 0xf8, 0x18, - 0x67, 0xfb, 0x14, 0x0a, 0xcb, 0x7e, 0x73, 0x1f, 0xdd, 0x12, 0x4b, 0xf5, 0x0f, 0x98, 0xfc, 0x68, - 0xf9, 0xcd, 0xfd, 0xa7, 0x77, 0x26, 0x8d, 0xec, 0xc9, 0x0a, 0xab, 0x3b, 0x1b, 0x56, 0x22, 0xeb, - 0x99, 0x29, 0xed, 0xa4, 0x4d, 0x4b, 0xe3, 0x8a, 0x0a, 0x1f, 0x85, 0xb2, 0x22, 0x96, 0x4e, 0x4e, - 0x28, 0x54, 0x16, 0x68, 0xb8, 0x1f, 0xf9, 0xdd, 0xf9, 0x96, 0xd7, 0xdd, 0xf6, 0x9d, 0xc0, 0x9d, - 0xa9, 0x0c, 0x10, 0x18, 0xaf, 0x64, 0x0a, 0x8c, 0x69, 0x97, 0xd3, 0xdb, 0x4d, 0xc9, 0xc0, 0xea, - 0x63, 0x49, 0xbe, 0x0a, 0x93, 0x6c, 0xb6, 0x2c, 0x3e, 0x89, 0x68, 0x87, 0x0f, 0xa5, 0x69, 0x5c, - 0xea, 0xcf, 0x29, 0x17, 0x1b, 0xe3, 0x44, 0x3e, 0x48, 0x51, 0x7a, 0xd0, 0x98, 0x40, 0x1d, 0xa4, - 0x3a, 0x2b, 0xf3, 0x47, 0x53, 0x6d, 0x42, 0x96, 0x60, 0x4c, 0x94, 0x40, 0xac, 0x3a, 0xfd, 0x75, - 0x79, 0x3e, 0xb3, 0x2e, 0x63, 0xa2, 0x2e, 0x96, 0xa4, 0x37, 0xff, 0x95, 0x01, 0x13, 0x5a, 0x76, - 0xe4, 0x8e, 0xe2, 0x32, 0x93, 0xb8, 0xba, 0x69, 0x38, 0x99, 0x21, 0xf1, 0xef, 0x08, 0x3f, 0xa9, - 0xdc, 0x60, 0xba, 0xcc, 0x68, 0x65, 0x32, 0xd0, 0x40, 0xfe, 0xf8, 0x40, 0x03, 0x85, 0x01, 0x81, - 0x06, 0xbe, 0x35, 0x01, 0x93, 0xfa, 0x02, 0xc7, 0x34, 0xce, 0x65, 0x7f, 0xd7, 0xeb, 0xc8, 0x7d, - 0x2b, 0x0f, 0x9d, 0x81, 0x10, 0x2d, 0xbe, 0x3c, 0x42, 0xc8, 0xcb, 0x00, 0xf1, 0xd1, 0xac, 0xdc, - 0x9a, 0x8a, 0x68, 0xf8, 0x4a, 0x02, 0xf9, 0x31, 0x80, 0x15, 0xdf, 0xa5, 0x71, 0xf4, 0x95, 0x63, - 0x0c, 0x4a, 0xaf, 0x08, 0x83, 0x92, 0x88, 0x60, 0x7f, 0x74, 0x58, 0x3d, 0xdf, 0xf1, 0x5d, 0xda, - 0x1f, 0x76, 0x45, 0xe1, 0x48, 0xbe, 0x08, 0x23, 0x56, 0xaf, 0x45, 0x65, 0x30, 0x90, 0x71, 0x39, - 0xe0, 0x7b, 0x2d, 0x25, 0xb2, 0x65, 0xd0, 0x4b, 0x9f, 0x23, 0x30, 0x00, 0x79, 0x0f, 0xe0, 0x41, - 0x6f, 0x9b, 0xde, 0x0b, 0xfc, 0x5e, 0x57, 0xde, 0x36, 0xc6, 0x6d, 0xec, 0x7e, 0x1c, 0x3a, 0xca, - 0xde, 0xc5, 0x44, 0x35, 0xf3, 0x84, 0x84, 0xac, 0xc2, 0x98, 0x10, 0x1f, 0xc2, 0x4e, 0xff, 0x42, - 0x96, 0x85, 0x48, 0xd1, 0x21, 0x44, 0x74, 0x0e, 0x04, 0xeb, 0x46, 0x1b, 0xbe, 0x0d, 0x7f, 0x1b, - 0x4a, 0x8c, 0x3d, 0xdb, 0x6a, 0x87, 0x62, 0xed, 0x40, 0x9f, 0x45, 0xa5, 0x40, 0x6c, 0x5b, 0xae, - 0xc5, 0x08, 0x8b, 0x09, 0xc8, 0x57, 0x31, 0x9e, 0x8e, 0x68, 0xea, 0x63, 0x0d, 0x8d, 0xd7, 0xfa, - 0x9a, 0xfa, 0x9c, 0xd3, 0xed, 0x66, 0x04, 0x20, 0x8b, 0xf9, 0x91, 0xdd, 0xf8, 0x5e, 0x4f, 0x1c, - 0xde, 0xf8, 0x98, 0x0c, 0x6e, 0xf4, 0x65, 0x30, 0x23, 0xaf, 0xaa, 0xf4, 0x47, 0xd1, 0xd1, 0xf8, - 0x92, 0x2e, 0x54, 0x92, 0xd0, 0x5d, 0x22, 0x2f, 0x38, 0x2e, 0xaf, 0xd7, 0xfb, 0xf2, 0x52, 0x3b, - 0xb0, 0x2f, 0xbb, 0x3e, 0xee, 0xc4, 0x4d, 0x42, 0xd1, 0x8a, 0xfc, 0xc6, 0x8f, 0xcb, 0xef, 0xe5, - 0xbe, 0xfc, 0xce, 0xba, 0xdb, 0xfd, 0xf9, 0xa4, 0x78, 0x92, 0xb7, 0x61, 0x42, 0x42, 0x70, 0x7e, - 0xa0, 0x81, 0x4f, 0xe8, 0xf7, 0xee, 0x36, 0x3a, 0xaa, 0xe9, 0x21, 0x64, 0x54, 0x64, 0x95, 0x9a, - 0x8f, 0x8e, 0x09, 0x8d, 0x3a, 0x3d, 0x2a, 0x74, 0x64, 0xf2, 0x15, 0x18, 0x5f, 0x6a, 0xb3, 0x8a, - 0xf8, 0x1d, 0x27, 0xa2, 0xb8, 0x18, 0x25, 0x46, 0x53, 0x25, 0x45, 0x19, 0xaa, 0x3c, 0xae, 0x64, - 0x92, 0xa4, 0x2e, 0xe6, 0x0a, 0x05, 0x6b, 0x3c, 0x6e, 0x7e, 0x11, 0x63, 0x38, 0x14, 0x4b, 0xcf, - 0xf3, 0x19, 0x86, 0x4b, 0x85, 0x3d, 0xca, 0x72, 0x6e, 0xd5, 0xb1, 0xc5, 0x84, 0xd0, 0x1a, 0x4f, - 0xe7, 0x49, 0xde, 0x81, 0x71, 0x71, 0x8b, 0xb2, 0x66, 0xad, 0x84, 0x33, 0x15, 0xac, 0x3c, 0xc6, - 0x7f, 0x93, 0x17, 0x2e, 0x6d, 0x27, 0x48, 0x9d, 0x5e, 0x25, 0xf8, 0xe4, 0xcb, 0x70, 0x6e, 0xcb, - 0xeb, 0xb8, 0xfe, 0xe3, 0x50, 0x08, 0x70, 0x21, 0xe8, 0xa6, 0x13, 0x1f, 0x9d, 0xc7, 0x3c, 0xdd, - 0x96, 0xcb, 0x56, 0x9f, 0xe0, 0xcb, 0xe4, 0x40, 0x7e, 0xba, 0x8f, 0x33, 0x1f, 0x41, 0xe4, 0xb8, - 0x11, 0x34, 0xd7, 0x37, 0x82, 0xfa, 0xb3, 0x4f, 0x0f, 0xa7, 0xcc, 0x6c, 0x88, 0x0f, 0x44, 0xd7, - 0x39, 0xde, 0xf7, 0xbd, 0xce, 0xcc, 0x59, 0xed, 0xf1, 0x90, 0xd8, 0x4d, 0x17, 0xf1, 0xd6, 0xfc, - 0x96, 0xd7, 0x3c, 0xa8, 0x9b, 0x47, 0x87, 0xd5, 0x17, 0xd2, 0xda, 0xcc, 0x87, 0xbe, 0x66, 0x5c, - 0xc8, 0x60, 0x4d, 0xbe, 0x02, 0x65, 0xf6, 0x1b, 0xab, 0x7e, 0xe7, 0xb4, 0xa3, 0x2e, 0x05, 0x53, - 0xe4, 0x83, 0x7d, 0x84, 0xd7, 0x3c, 0x33, 0xb4, 0x42, 0x8d, 0x95, 0xf9, 0x03, 0x03, 0xce, 0x65, - 0x95, 0xf5, 0x84, 0x98, 0x3a, 0x66, 0xea, 0xd0, 0x1b, 0xed, 0x12, 0xfc, 0xd0, 0x3b, 0x3e, 0xea, - 0xae, 0xc2, 0x08, 0xdb, 0x2b, 0x4b, 0xa7, 0x2c, 0x5c, 0x0e, 0xd9, 0x7e, 0x3a, 0xb4, 0x38, 0x9c, - 0x21, 0xa0, 0x03, 0x3f, 0xae, 0x97, 0x23, 0x1c, 0x01, 0xbd, 0xfc, 0x2d, 0x0e, 0x67, 0x08, 0x6c, - 0xd9, 0x95, 0xcb, 0x04, 0x22, 0xb0, 0xd5, 0x38, 0xb4, 0x38, 0x9c, 0x5c, 0x83, 0xb1, 0xd5, 0xce, - 0x32, 0x75, 0x1e, 0x51, 0x71, 0xe2, 0x84, 0x76, 0x14, 0xbf, 0x63, 0xb7, 0x18, 0xcc, 0x92, 0x89, - 0xe6, 0x77, 0x0c, 0x98, 0xee, 0x6b, 0xa6, 0x93, 0xc3, 0x06, 0x1d, 0x7f, 0xbc, 0x37, 0x4c, 0xfd, - 0x78, 0xf1, 0x0b, 0xd9, 0xc5, 0x37, 0x7f, 0xbf, 0x00, 0x17, 0x07, 0xac, 0x5a, 0xc9, 0xd1, 0xbc, - 0x71, 0xe2, 0xd1, 0xfc, 0xd7, 0xd8, 0x2a, 0xe1, 0x78, 0xed, 0x70, 0xdd, 0x4f, 0x4a, 0x9c, 0x9c, - 0x62, 0x60, 0x9a, 0x8c, 0xcb, 0x21, 0x63, 0x48, 0x5c, 0x6a, 0x22, 0x85, 0x1d, 0xf9, 0x7d, 0x36, - 0x63, 0x9d, 0x59, 0xdf, 0xe1, 0x78, 0xfe, 0xaf, 0xc8, 0xe1, 0xb8, 0x7e, 0x24, 0x55, 0x78, 0xaa, - 0x47, 0x52, 0xd9, 0x46, 0xf2, 0x91, 0x8f, 0x71, 0x14, 0x40, 0xe6, 0x61, 0xa2, 0x41, 0x9d, 0xa0, - 0xb9, 0x57, 0x0b, 0x79, 0x27, 0x8d, 0x22, 0x37, 0x14, 0xc9, 0x21, 0x26, 0xd8, 0x4e, 0xd8, 0xdf, - 0x17, 0x1a, 0x8d, 0xf9, 0xef, 0x52, 0x67, 0xfa, 0x7f, 0x15, 0xc7, 0xcb, 0xab, 0x30, 0xb2, 0xb5, - 0x47, 0x03, 0xa9, 0x24, 0x63, 0x41, 0x1e, 0x33, 0x80, 0x5a, 0x10, 0xc4, 0x30, 0x7f, 0x0a, 0xca, - 0x6a, 0x66, 0x28, 0x10, 0xd8, 0xb7, 0x98, 0x91, 0x5c, 0x20, 0x30, 0x80, 0xc5, 0xe1, 0x27, 0x86, - 0xf2, 0x4a, 0x5a, 0x21, 0x7f, 0x52, 0x2b, 0xb0, 0xcc, 0x71, 0xbc, 0x29, 0x99, 0xe3, 0xb7, 0x9a, - 0x79, 0xc4, 0x00, 0x16, 0x87, 0x3f, 0xd5, 0xcc, 0xff, 0xad, 0x01, 0x05, 0x0c, 0xa3, 0xf0, 0x06, - 0x94, 0xa4, 0xb1, 0x57, 0x0d, 0x2d, 0x70, 0x56, 0xda, 0x82, 0x43, 0xdd, 0x23, 0x43, 0x00, 0x59, - 0x56, 0x9b, 0x34, 0xd8, 0xd6, 0x1c, 0x77, 0x1e, 0x31, 0x80, 0x9a, 0x15, 0x62, 0x9c, 0xa2, 0x3f, - 0xd0, 0x39, 0x49, 0x58, 0x28, 0xb8, 0xc8, 0xe2, 0xce, 0x49, 0x7d, 0x96, 0x09, 0x89, 0x65, 0xfe, - 0xba, 0x01, 0xe7, 0x33, 0x35, 0x19, 0x96, 0x2b, 0x57, 0x99, 0x94, 0xe1, 0x98, 0xd6, 0x97, 0x38, - 0xc6, 0x69, 0x9c, 0x90, 0x4e, 0x31, 0xb6, 0x3e, 0x03, 0xa5, 0x78, 0x87, 0x49, 0xce, 0xc9, 0xae, - 0x43, 0x8b, 0xa0, 0xdc, 0x8e, 0xfd, 0xa5, 0x01, 0xa3, 0xac, 0x08, 0xcf, 0xec, 0x9d, 0x94, 0x6c, - 0xfb, 0x30, 0xab, 0xd2, 0x50, 0x37, 0x51, 0x7e, 0x67, 0x14, 0x20, 0x41, 0x26, 0xdb, 0x30, 0xb9, - 0xba, 0xb4, 0x30, 0xbf, 0xe4, 0xd2, 0x4e, 0x84, 0xe7, 0x94, 0xa9, 0xd8, 0x04, 0x6c, 0x6b, 0x1c, - 0x74, 0x9c, 0x96, 0x40, 0x38, 0x48, 0x64, 0x83, 0xef, 0xb9, 0x4d, 0xdb, 0x8b, 0xe9, 0x54, 0x95, - 0x52, 0xe7, 0xc8, 0xf2, 0x68, 0xd4, 0x1e, 0x2e, 0x2b, 0x79, 0xe4, 0x86, 0xcc, 0x23, 0x74, 0xda, - 0xad, 0x01, 0x79, 0xe8, 0x1c, 0xc9, 0x1e, 0x54, 0xee, 0xe1, 0xea, 0xa3, 0xe4, 0x92, 0x3f, 0x3e, - 0x97, 0x17, 0x45, 0x2e, 0xcf, 0xf1, 0x65, 0x2b, 0x3b, 0x9f, 0x3e, 0xae, 0xc9, 0xc8, 0x2d, 0x9c, - 0x38, 0x72, 0xff, 0xba, 0x01, 0xa3, 0x7c, 0x79, 0x8b, 0x5f, 0x00, 0xc9, 0x5c, 0x40, 0xb7, 0x9e, - 0xce, 0x02, 0x5a, 0x41, 0xc9, 0xa5, 0x99, 0x10, 0x78, 0x1a, 0x59, 0x48, 0x3d, 0x27, 0x22, 0x0f, - 0x01, 0x50, 0xb5, 0xe6, 0x29, 0x89, 0x2b, 0x17, 0x7f, 0x49, 0x44, 0xe5, 0xc2, 0x31, 0xd4, 0xc7, - 0x0d, 0xc7, 0x3e, 0xe6, 0xe3, 0x86, 0xcb, 0x50, 0x12, 0xbe, 0x49, 0xf5, 0x03, 0xb1, 0x81, 0x96, - 0x26, 0xa2, 0x18, 0xae, 0x84, 0xec, 0xe6, 0x20, 0x7b, 0x5b, 0x0b, 0xb8, 0x17, 0x23, 0x92, 0x55, - 0x28, 0x25, 0x17, 0x6a, 0x4a, 0xda, 0x49, 0x6e, 0x0c, 0x17, 0xce, 0xbb, 0xfc, 0xce, 0x66, 0xe6, - 0xfd, 0x99, 0x84, 0x87, 0xf9, 0x0d, 0x03, 0x2a, 0xe9, 0xf1, 0x42, 0xde, 0x86, 0xf1, 0xf8, 0x4e, - 0x53, 0xec, 0x21, 0x81, 0xa6, 0xd8, 0xe4, 0x12, 0x94, 0xe6, 0x2b, 0xa1, 0xa2, 0x93, 0x39, 0x28, - 0xb2, 0x69, 0xa7, 0x44, 0x5c, 0x46, 0x79, 0xd2, 0x13, 0x30, 0xf5, 0x64, 0x52, 0xe2, 0x29, 0xb3, - 0xf6, 0x3f, 0xe4, 0x61, 0x5c, 0xe9, 0x2c, 0xf2, 0x2a, 0x14, 0x97, 0xc2, 0x65, 0xbf, 0xb9, 0x4f, - 0x5d, 0x71, 0xe0, 0x81, 0x6f, 0x57, 0x7a, 0xa1, 0xdd, 0x42, 0xa0, 0x15, 0x27, 0x93, 0x3a, 0x4c, - 0xf0, 0x7f, 0xf2, 0xee, 0x6a, 0x2e, 0x31, 0xd6, 0x72, 0x64, 0x79, 0x6b, 0x55, 0x5d, 0xde, 0x35, - 0x12, 0xf2, 0x75, 0x00, 0x0e, 0x60, 0xfd, 0x3b, 0x84, 0x6b, 0xb2, 0x9c, 0xc0, 0xe7, 0x45, 0x06, - 0x91, 0xa7, 0xd6, 0x10, 0x87, 0x82, 0xc2, 0x10, 0xdf, 0xcd, 0xf3, 0x9b, 0xfb, 0xc3, 0xbf, 0x9c, - 0x99, 0xbc, 0x9b, 0xe7, 0x37, 0xf7, 0xed, 0x6c, 0x3f, 0x35, 0x95, 0x25, 0xf9, 0xa6, 0x01, 0x97, - 0x2d, 0xda, 0xf4, 0x1f, 0xd1, 0xe0, 0xa0, 0x16, 0x21, 0x96, 0x9a, 0xe3, 0xc9, 0x4e, 0x71, 0xb7, - 0x45, 0x8e, 0xaf, 0x04, 0x82, 0x0b, 0x5e, 0xa8, 0x69, 0x77, 0x23, 0xfb, 0x98, 0x22, 0x1c, 0x93, - 0xa5, 0xf9, 0x27, 0x86, 0x32, 0x05, 0xc8, 0x0a, 0x94, 0xe2, 0xc1, 0x22, 0x4c, 0xa6, 0xb1, 0x66, - 0x26, 0xe1, 0x16, 0xdd, 0xa9, 0x3f, 0x27, 0xce, 0x26, 0xce, 0xc6, 0x43, 0x4e, 0x9b, 0x11, 0x12, - 0x48, 0xbe, 0x04, 0x05, 0xec, 0xaa, 0x93, 0x43, 0x74, 0xc9, 0xa5, 0xa6, 0xc0, 0xfa, 0x08, 0x4b, - 0x8d, 0x94, 0xe4, 0x73, 0xc2, 0x4f, 0x25, 0xaf, 0x05, 0xbf, 0x65, 0x20, 0x56, 0x8e, 0x78, 0x8d, - 0x49, 0x5c, 0x23, 0x95, 0xd1, 0xfa, 0x37, 0x72, 0x50, 0x49, 0x4f, 0x3c, 0xf2, 0x1e, 0x94, 0xe5, - 0xe5, 0xa8, 0xfb, 0x4e, 0xb8, 0x27, 0x02, 0x6a, 0xe2, 0xae, 0x55, 0xde, 0xa8, 0xb2, 0xf7, 0x1c, - 0x2d, 0xf0, 0x9a, 0x46, 0xc0, 0x16, 0xe4, 0x75, 0xe1, 0x71, 0xaf, 0x4c, 0xa0, 0xc8, 0x8f, 0xba, - 0xa9, 0x80, 0x9a, 0x12, 0x8d, 0xbc, 0x01, 0x79, 0x7e, 0x63, 0x50, 0x8d, 0xc6, 0xf4, 0xf0, 0x6e, - 0x8d, 0x5f, 0x78, 0xe2, 0xc7, 0xe1, 0xfa, 0xb9, 0x02, 0xc3, 0x27, 0xcb, 0xca, 0x7d, 0xb3, 0x51, - 0x2d, 0x2a, 0x8d, 0x04, 0xc7, 0x95, 0x3b, 0xf9, 0xe2, 0xd9, 0xfb, 0x85, 0x62, 0xbe, 0x52, 0x10, - 0x37, 0x8c, 0x7e, 0x2f, 0x0f, 0xa5, 0x38, 0x7f, 0x42, 0x00, 0xf5, 0x0d, 0x71, 0xae, 0x8d, 0xff, - 0xc9, 0x25, 0x28, 0x4a, 0x15, 0x43, 0x9c, 0x6d, 0x8f, 0x85, 0x42, 0xbd, 0x98, 0x01, 0xa9, 0x4b, - 0x70, 0xf5, 0xc2, 0x92, 0x9f, 0xe4, 0x16, 0xc4, 0x8a, 0xc2, 0x20, 0x8d, 0xa2, 0xc0, 0x3a, 0xcc, - 0x8a, 0xd1, 0xc8, 0x24, 0xe4, 0x3c, 0xee, 0x4d, 0x5d, 0xb2, 0x72, 0x9e, 0x4b, 0xde, 0x83, 0xa2, - 0xe3, 0xba, 0xd4, 0xb5, 0x9d, 0x68, 0x88, 0x57, 0x4c, 0x8b, 0x8c, 0x1b, 0x97, 0xe8, 0x48, 0x55, - 0x8b, 0x48, 0x0d, 0x4a, 0xf8, 0x88, 0x65, 0x2f, 0x1c, 0xea, 0xe5, 0xcb, 0x84, 0x43, 0x91, 0x91, - 0x6d, 0x84, 0xd4, 0x25, 0xaf, 0x40, 0x81, 0xf5, 0xa6, 0x58, 0x0f, 0xe2, 0x18, 0x7b, 0xab, 0xeb, - 0x6b, 0xbc, 0xc1, 0xee, 0x9f, 0xb1, 0x10, 0x81, 0xbc, 0x04, 0xf9, 0xde, 0xdc, 0x8e, 0x90, 0xf4, - 0x95, 0xe4, 0x32, 0x69, 0x8c, 0xc6, 0x92, 0xc9, 0x6d, 0x28, 0x3e, 0xd6, 0xaf, 0x0d, 0x9e, 0x4f, - 0x75, 0x63, 0x8c, 0x1f, 0x23, 0xd6, 0x8b, 0x30, 0xca, 0x2f, 0xcc, 0x99, 0x2f, 0x00, 0x24, 0x59, - 0xf7, 0xbb, 0x20, 0x98, 0x5f, 0x87, 0x52, 0x9c, 0x25, 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, - 0x4e, 0xc7, 0x15, 0x8f, 0xb7, 0x94, 0xad, 0xd2, 0x3e, 0x3d, 0xb8, 0x8f, 0x00, 0x72, 0x11, 0xc6, - 0xba, 0xac, 0x57, 0x65, 0x38, 0x58, 0x6b, 0xb4, 0xdb, 0xdb, 0x66, 0x23, 0x74, 0x06, 0xc6, 0xd0, - 0xf8, 0x21, 0x26, 0xda, 0x84, 0x25, 0x3f, 0xcd, 0xdf, 0xca, 0x61, 0xa0, 0x00, 0xa5, 0x9c, 0xe4, - 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0xa9, 0x45, 0x22, 0x9f, 0x72, 0x02, 0x5c, 0x72, - 0xc9, 0x35, 0x98, 0x4a, 0xe2, 0xd3, 0xda, 0xcd, 0x6d, 0x71, 0x69, 0xb8, 0x6c, 0x4d, 0x74, 0x65, - 0x80, 0xda, 0xf9, 0x6d, 0xbc, 0x05, 0x50, 0x51, 0x2f, 0xcb, 0x45, 0x32, 0xd6, 0x6c, 0xc9, 0x9a, - 0x52, 0xe0, 0x78, 0x70, 0x72, 0x01, 0x46, 0x1d, 0x67, 0xb7, 0xe7, 0x71, 0x8f, 0xe4, 0xb2, 0x25, - 0xbe, 0xc8, 0x67, 0x61, 0x3a, 0xf4, 0x76, 0x3b, 0x4e, 0xd4, 0x0b, 0x44, 0xa4, 0x06, 0x1a, 0xe0, - 0x90, 0x9a, 0xb0, 0x2a, 0x71, 0xc2, 0x3c, 0x87, 0x93, 0xd7, 0x81, 0xa8, 0xf9, 0xf9, 0xdb, 0x1f, - 0xd2, 0x26, 0x1f, 0x6a, 0x65, 0x6b, 0x5a, 0x49, 0x59, 0xc5, 0x04, 0xf2, 0x19, 0x28, 0x07, 0x34, - 0x44, 0x95, 0x0c, 0x9b, 0x0d, 0xe3, 0xcf, 0x58, 0xe3, 0x12, 0xf6, 0x80, 0x1e, 0x98, 0x75, 0x98, - 0xee, 0x9b, 0x8f, 0xe4, 0x75, 0xae, 0xdd, 0x8b, 0xf5, 0xb9, 0xcc, 0x37, 0x33, 0x4c, 0x48, 0xa5, - 0xde, 0x3d, 0xe6, 0x48, 0x66, 0x07, 0xca, 0xaa, 0x7c, 0x3d, 0xe1, 0x3a, 0xf6, 0x05, 0x74, 0x8d, - 0xe4, 0xc2, 0x67, 0xf4, 0xe8, 0xb0, 0x9a, 0xf3, 0x5c, 0x74, 0x88, 0xbc, 0x0e, 0x45, 0xa9, 0x25, - 0xa8, 0x8f, 0x97, 0x08, 0x85, 0xf2, 0xc0, 0x8a, 0x53, 0xcd, 0x57, 0x60, 0x4c, 0x88, 0xd0, 0xe3, - 0x0d, 0x51, 0xe6, 0xcf, 0xe7, 0x60, 0xca, 0xa2, 0x6c, 0x82, 0x8b, 0x67, 0x41, 0x3e, 0x65, 0x91, - 0x7a, 0xb5, 0xba, 0x1d, 0x13, 0xfd, 0xe0, 0xbb, 0x06, 0x9c, 0xcd, 0xc0, 0xfd, 0x48, 0xa1, 0xbd, - 0xee, 0x40, 0x69, 0xc1, 0x73, 0x5a, 0x35, 0xd7, 0x8d, 0x5d, 0x3c, 0x51, 0x1b, 0x74, 0xd9, 0x74, - 0x72, 0x18, 0x54, 0x5d, 0x4c, 0x63, 0x54, 0x72, 0x43, 0x0c, 0x8a, 0x24, 0xf8, 0xa0, 0x8c, 0x05, - 0x0c, 0xbc, 0x4c, 0x49, 0x24, 0x60, 0xbc, 0x48, 0xc7, 0x81, 0xc9, 0x29, 0xfe, 0x33, 0xdb, 0x75, - 0xd9, 0x17, 0xe9, 0xd2, 0xd5, 0x1b, 0x6a, 0xdb, 0xf9, 0x8d, 0x1c, 0x5c, 0xc8, 0x26, 0xfc, 0xa8, - 0x51, 0xda, 0x30, 0xf4, 0x84, 0x12, 0x6e, 0x19, 0xa3, 0xb4, 0xf1, 0x38, 0x15, 0x88, 0x9f, 0x20, - 0x90, 0x1d, 0x98, 0x58, 0x76, 0xc2, 0xe8, 0x3e, 0x75, 0x82, 0x68, 0x9b, 0x3a, 0xd1, 0x10, 0x1a, - 0x6c, 0xfc, 0xba, 0x30, 0x2e, 0x6a, 0x7b, 0x92, 0x32, 0xfd, 0xba, 0xb0, 0xc6, 0x36, 0x1e, 0x28, - 0x85, 0x21, 0x06, 0xca, 0x4f, 0xc0, 0x54, 0x83, 0xb6, 0x9d, 0xee, 0x9e, 0x1f, 0x50, 0x61, 0x3b, - 0xbf, 0x09, 0x13, 0x31, 0x28, 0x73, 0xb4, 0xe8, 0xc9, 0x1a, 0xbe, 0xd2, 0x10, 0x89, 0x28, 0xd1, - 0x93, 0xcd, 0xdf, 0xc8, 0xc1, 0xc5, 0x5a, 0x53, 0x1c, 0x34, 0x88, 0x04, 0x79, 0x1e, 0xfa, 0x09, - 0xe7, 0x4d, 0x66, 0xa1, 0xf4, 0xd0, 0x79, 0x82, 0xcf, 0xe4, 0x87, 0x22, 0xd6, 0x0f, 0x57, 0xbf, - 0x9c, 0x27, 0x76, 0x6c, 0xf6, 0xb2, 0x12, 0x9c, 0xa7, 0xf9, 0x92, 0xbe, 0x09, 0xa3, 0xf7, 0xfd, - 0x96, 0x2b, 0x16, 0x27, 0x71, 0x6e, 0xb1, 0x87, 0x10, 0x4b, 0xa4, 0x98, 0x3f, 0x30, 0x60, 0x32, - 0x2e, 0x31, 0x16, 0xe1, 0x13, 0x6f, 0x92, 0x6b, 0x30, 0x86, 0x19, 0xc5, 0x4f, 0xeb, 0xe0, 0xa2, - 0xd1, 0x62, 0x20, 0xdb, 0x73, 0x2d, 0x99, 0xa8, 0xb6, 0xc4, 0xc8, 0xc7, 0x6b, 0x09, 0xf3, 0x1f, - 0xe2, 0x91, 0x88, 0x5a, 0x4b, 0xb6, 0x12, 0x29, 0x05, 0x31, 0x86, 0x2c, 0x48, 0xee, 0xa9, 0x75, - 0x49, 0x7e, 0x60, 0x97, 0xfc, 0x42, 0x0e, 0xc6, 0xe3, 0xc2, 0x7e, 0xca, 0x6e, 0xa0, 0xc7, 0xf5, - 0x1a, 0xca, 0xbf, 0xbc, 0xa1, 0xc8, 0x0a, 0xe1, 0xc6, 0xfd, 0x25, 0x18, 0x15, 0x93, 0xc9, 0x48, - 0x9d, 0x0b, 0xa6, 0x7a, 0x37, 0x79, 0x21, 0x16, 0x3b, 0x34, 0xb4, 0x04, 0x1d, 0x3a, 0xf0, 0x6f, - 0xd1, 0x6d, 0x71, 0x42, 0xf6, 0xcc, 0xae, 0x51, 0xd9, 0x0e, 0xfc, 0x49, 0xc5, 0x86, 0x5a, 0x9d, - 0xfe, 0x6e, 0x01, 0x2a, 0x69, 0x92, 0x93, 0xef, 0xf8, 0xaf, 0xf5, 0xb6, 0xc5, 0xeb, 0x0e, 0x78, - 0xc7, 0xbf, 0xdb, 0xdb, 0xb6, 0x18, 0x8c, 0x5c, 0x83, 0xc2, 0x5a, 0xe0, 0x3d, 0xc2, 0x5a, 0x8b, - 0xc7, 0x2d, 0xba, 0x81, 0xf7, 0x48, 0xf5, 0x64, 0x65, 0xe9, 0xb8, 0xa1, 0x5d, 0x6e, 0x28, 0x8f, - 0x73, 0xf3, 0x0d, 0x6d, 0x2b, 0x4c, 0x07, 0x93, 0x91, 0x68, 0x6c, 0xa9, 0xac, 0x53, 0x27, 0x10, - 0xf7, 0xd1, 0x85, 0x38, 0xc3, 0xa5, 0x72, 0x1b, 0xc1, 0x3c, 0x52, 0xac, 0xa5, 0x22, 0x91, 0x16, - 0x10, 0xe5, 0x53, 0x4e, 0xe0, 0x93, 0xf7, 0x78, 0xf2, 0x51, 0xa6, 0x73, 0x2a, 0x6b, 0x5b, 0x9d, - 0xcd, 0x19, 0x7c, 0x9f, 0xa6, 0x8d, 0x70, 0x0d, 0x4a, 0x68, 0xf2, 0x42, 0x43, 0x46, 0xf1, 0x44, - 0x66, 0xd2, 0x6b, 0x18, 0xd0, 0x9f, 0xc0, 0x8e, 0xcd, 0x19, 0x09, 0x13, 0xf2, 0x2e, 0x8c, 0xab, - 0xae, 0xae, 0xdc, 0x21, 0xf3, 0x0a, 0xbf, 0xe3, 0x34, 0x20, 0xe8, 0x9a, 0x4a, 0x60, 0x7e, 0x4e, - 0x1d, 0x25, 0x62, 0xd1, 0x3e, 0x76, 0x94, 0x98, 0xbf, 0x86, 0x6a, 0x7c, 0xdb, 0x8f, 0xa8, 0xd0, - 0x5e, 0x9e, 0x59, 0x39, 0x96, 0x98, 0x90, 0x47, 0x34, 0x9f, 0x16, 0xad, 0x76, 0xa7, 0x78, 0x96, - 0xfa, 0x77, 0x0d, 0x38, 0x9f, 0x49, 0x4b, 0x6e, 0x02, 0x24, 0x3a, 0xa2, 0x68, 0x25, 0x1e, 0x82, - 0x37, 0x86, 0x5a, 0x0a, 0x06, 0xf9, 0x5a, 0x5a, 0xbb, 0x3b, 0x79, 0x71, 0x92, 0x0f, 0x55, 0x4c, - 0xea, 0xda, 0x5d, 0x86, 0x4e, 0x67, 0x7e, 0x37, 0x0f, 0xd3, 0x7d, 0x0f, 0x1c, 0x9e, 0xe0, 0x45, - 0xb0, 0x9f, 0x7a, 0x3e, 0x8b, 0x1f, 0x77, 0xdc, 0x18, 0xf4, 0xbc, 0x62, 0xc6, 0x63, 0x5a, 0x68, - 0x16, 0x13, 0xd1, 0x9f, 0x4f, 0x78, 0x53, 0x2b, 0xcc, 0x7e, 0x78, 0xed, 0xb3, 0x03, 0x73, 0x7b, - 0x0a, 0x0f, 0xb0, 0xfd, 0x15, 0x7e, 0x9f, 0xea, 0xd7, 0x72, 0x70, 0xb6, 0xaf, 0xce, 0xcf, 0xec, - 0xac, 0xfb, 0x92, 0xb6, 0xba, 0xbd, 0x30, 0xa8, 0x4f, 0x87, 0xd2, 0x22, 0xfe, 0x87, 0x01, 0x17, - 0x07, 0x50, 0x92, 0x83, 0xf4, 0x20, 0xe2, 0x5a, 0xc5, 0xad, 0xe3, 0x33, 0x7c, 0x2a, 0x43, 0xe9, - 0x13, 0x1b, 0x09, 0x3f, 0x9f, 0x03, 0xd8, 0xa2, 0xdb, 0xcf, 0x76, 0x00, 0xa3, 0x2f, 0x68, 0x03, - 0x40, 0x31, 0x60, 0x0e, 0x1f, 0xbf, 0x68, 0x15, 0x0d, 0x89, 0xc3, 0x47, 0x2f, 0x8a, 0x1f, 0xe3, - 0xc8, 0x65, 0x3f, 0xc6, 0x61, 0x6e, 0xc3, 0xb9, 0x7b, 0x34, 0x4a, 0x56, 0x42, 0xb9, 0x87, 0x3c, - 0x9e, 0xed, 0x6b, 0x50, 0x12, 0xf8, 0x7a, 0x60, 0x75, 0xe9, 0x12, 0xe7, 0xb9, 0x56, 0x82, 0x60, - 0x52, 0xb8, 0xb8, 0x40, 0x5b, 0x34, 0xa2, 0x9f, 0x6c, 0x36, 0x0d, 0x20, 0xbc, 0x2a, 0xfc, 0x8d, - 0x86, 0xa1, 0x72, 0x38, 0xb1, 0x7d, 0x36, 0xe1, 0x7c, 0x5c, 0xf6, 0xa7, 0xc9, 0x77, 0x96, 0xe9, - 0x12, 0xe2, 0xb6, 0x60, 0xc2, 0xf1, 0x18, 0x23, 0xe2, 0x13, 0xb8, 0x2c, 0x09, 0xb6, 0xbc, 0xf8, - 0x24, 0x66, 0x28, 0x5a, 0xf2, 0x36, 0x8c, 0x2b, 0x34, 0xe2, 0xea, 0x31, 0x9e, 0x76, 0x3e, 0xf6, - 0xa2, 0x3d, 0x3b, 0xe4, 0x70, 0xf5, 0xb4, 0x53, 0x41, 0x37, 0xbf, 0x0a, 0xcf, 0xc5, 0x7e, 0x2b, - 0x19, 0x59, 0xa7, 0x98, 0x1b, 0xa7, 0x63, 0xbe, 0x92, 0x54, 0x6b, 0xa9, 0x13, 0x7b, 0xc0, 0x4b, - 0xde, 0x44, 0xad, 0x96, 0xa8, 0xcc, 0x15, 0x25, 0xb0, 0x9b, 0x58, 0x8b, 0x12, 0x80, 0xf9, 0x96, - 0x52, 0xd8, 0x0c, 0x86, 0x1a, 0xb1, 0x91, 0x26, 0xfe, 0xf9, 0x1c, 0x4c, 0xad, 0x2e, 0x2d, 0xcc, - 0xc7, 0x66, 0xe4, 0x4f, 0x59, 0x74, 0x25, 0xad, 0x6e, 0x83, 0xe5, 0x8d, 0xb9, 0x01, 0x67, 0x53, - 0xcd, 0x80, 0x4f, 0xd0, 0xbc, 0xcb, 0xfd, 0x4b, 0x62, 0xb0, 0x5c, 0x59, 0x2e, 0x64, 0xb1, 0xdf, - 0xbc, 0x6d, 0xa5, 0xb0, 0xcd, 0xef, 0x8e, 0xa6, 0xf8, 0x0a, 0x11, 0xf6, 0x1a, 0x94, 0x96, 0xc2, - 0xb0, 0x47, 0x83, 0x0d, 0x6b, 0x59, 0xd5, 0x11, 0x3d, 0x04, 0xda, 0xbd, 0xa0, 0x65, 0x25, 0x08, - 0xe4, 0x55, 0x28, 0x8a, 0x1b, 0x6a, 0x52, 0x26, 0xe0, 0x71, 0x79, 0x7c, 0xc1, 0xcd, 0x8a, 0x93, - 0xc9, 0x1b, 0x50, 0xe6, 0xff, 0xf9, 0x68, 0x13, 0x0d, 0x8e, 0xb6, 0x2a, 0x81, 0xce, 0x47, 0xa7, - 0xa5, 0xa1, 0xb1, 0x9d, 0x99, 0x7c, 0xe3, 0x92, 0x95, 0xa8, 0x90, 0xec, 0xcc, 0xe4, 0x73, 0x98, - 0x58, 0x26, 0x15, 0x89, 0xdc, 0x80, 0x7c, 0x6d, 0xde, 0x52, 0x63, 0x49, 0x3b, 0xcd, 0x80, 0xc7, - 0x62, 0xd7, 0x9e, 0x91, 0xaa, 0xcd, 0x5b, 0x64, 0x0e, 0x8a, 0xf8, 0x4c, 0x88, 0x4b, 0x03, 0xe1, - 0xf5, 0x8a, 0xa3, 0xa6, 0x2b, 0x60, 0xea, 0xc9, 0xa3, 0xc4, 0x23, 0xb3, 0x30, 0xb6, 0xe0, 0x85, - 0xdd, 0x96, 0x73, 0x20, 0xc2, 0xaa, 0xe0, 0x61, 0x88, 0xcb, 0x41, 0xea, 0x38, 0x13, 0x58, 0xe4, - 0x55, 0x18, 0x69, 0x34, 0xfd, 0x2e, 0xdb, 0x6d, 0xc5, 0xae, 0x2d, 0x21, 0x03, 0x68, 0xb1, 0x19, - 0x18, 0x00, 0x2f, 0x4d, 0xf3, 0xbb, 0x5f, 0x25, 0xe5, 0xd2, 0x74, 0xfa, 0xce, 0x97, 0xc0, 0xe9, - 0x77, 0x3e, 0x84, 0xa7, 0xe9, 0x7c, 0xb8, 0x0d, 0x17, 0xef, 0xa1, 0xaa, 0xdf, 0xa0, 0x01, 0x46, - 0xb2, 0xe4, 0x4f, 0x0e, 0x6d, 0x58, 0x4b, 0xe2, 0xbe, 0xdb, 0xf5, 0xa3, 0xc3, 0xea, 0x4b, 0x7c, - 0x37, 0x60, 0x87, 0x1c, 0x47, 0xbe, 0x56, 0x94, 0x7a, 0x67, 0x61, 0x10, 0x23, 0xf2, 0x65, 0x38, - 0x97, 0x95, 0x24, 0x6e, 0xbe, 0xa1, 0x5f, 0x7b, 0x76, 0x06, 0xaa, 0x63, 0x79, 0x16, 0x07, 0xb2, - 0x0c, 0x15, 0x0e, 0xaf, 0xb9, 0x6d, 0xaf, 0xb3, 0xd8, 0x76, 0xbc, 0x16, 0xde, 0x83, 0x13, 0x97, - 0x19, 0x05, 0x57, 0x87, 0x25, 0xda, 0x94, 0xa5, 0x6a, 0xde, 0x49, 0x29, 0x4a, 0x14, 0x47, 0x8d, - 0xda, 0xc3, 0xe5, 0x64, 0x4e, 0x7d, 0xba, 0xce, 0x8d, 0xb4, 0xba, 0x1d, 0x73, 0x6e, 0xb4, 0x01, - 0x67, 0x53, 0xcd, 0x20, 0xc5, 0x91, 0x06, 0x4e, 0x8b, 0xa3, 0x14, 0x8d, 0x95, 0xc2, 0x36, 0xff, - 0xe3, 0x68, 0x8a, 0xaf, 0xb0, 0x15, 0x99, 0x30, 0xca, 0xa5, 0x8d, 0x1a, 0x77, 0x8d, 0xcb, 0x22, - 0x4b, 0xa4, 0x90, 0x4b, 0x90, 0x6f, 0x34, 0x56, 0xd5, 0xa8, 0x90, 0x61, 0xe8, 0x5b, 0x0c, 0xc6, - 0x7a, 0x08, 0xcd, 0x40, 0xca, 0x15, 0xb3, 0x26, 0x0d, 0x22, 0xf1, 0x08, 0xea, 0xcb, 0xc9, 0x3c, - 0x2e, 0x24, 0xed, 0x2d, 0xe6, 0x71, 0x32, 0x7b, 0xe7, 0x61, 0xa6, 0x16, 0x86, 0x34, 0x88, 0x78, - 0x28, 0xfb, 0xb0, 0xd7, 0xa6, 0x81, 0x18, 0x6b, 0x42, 0xc6, 0xf0, 0x27, 0xd4, 0x9b, 0xa1, 0x35, - 0x10, 0x91, 0x5c, 0x87, 0x62, 0xad, 0xe7, 0x7a, 0xb4, 0xd3, 0xd4, 0xbc, 0xeb, 0x1d, 0x01, 0xb3, - 0xe2, 0x54, 0xf2, 0x01, 0x9c, 0x17, 0x44, 0x52, 0xe0, 0x88, 0x16, 0xe0, 0xb2, 0x86, 0xef, 0x60, - 0xc5, 0x5c, 0x90, 0x62, 0xca, 0x16, 0x4d, 0x92, 0x4d, 0x49, 0x6a, 0x50, 0x59, 0xc4, 0x73, 0x52, - 0xf9, 0x14, 0xb2, 0x1f, 0x88, 0x90, 0xc5, 0x28, 0xb9, 0xf8, 0x19, 0xaa, 0xed, 0xc6, 0x89, 0x56, - 0x1f, 0x3a, 0x79, 0x00, 0x67, 0xd3, 0x30, 0x26, 0x8f, 0x4b, 0xc9, 0x53, 0x65, 0x7d, 0x5c, 0x50, - 0x30, 0x67, 0x51, 0x91, 0x6d, 0x98, 0xae, 0x45, 0x51, 0xe0, 0x6d, 0xf7, 0x22, 0x9a, 0x12, 0x5d, - 0xd2, 0xd0, 0x18, 0xa7, 0x4b, 0xf1, 0xf5, 0x9c, 0x18, 0x8c, 0x67, 0x9d, 0x98, 0x32, 0x16, 0x61, - 0x56, 0x3f, 0x3b, 0xe2, 0xc6, 0xaf, 0x1d, 0x8a, 0x17, 0x01, 0xc5, 0x95, 0x28, 0x69, 0xd0, 0xad, - 0x85, 0x07, 0xed, 0x36, 0x8d, 0x02, 0x3c, 0xb9, 0xc7, 0x17, 0x03, 0x4d, 0xe1, 0x03, 0x74, 0x59, - 0x79, 0xe4, 0x13, 0x5f, 0x85, 0xd4, 0xdc, 0x23, 0x35, 0x9e, 0xda, 0xf2, 0x51, 0x1e, 0x72, 0xf9, - 0x68, 0xc1, 0xf4, 0x62, 0xa7, 0x19, 0x1c, 0xe0, 0xdd, 0x4c, 0x59, 0xb8, 0x89, 0x13, 0x0a, 0x27, - 0x9f, 0x03, 0xb9, 0xe2, 0xc8, 0x11, 0x96, 0x55, 0xbc, 0x7e, 0xc6, 0xe6, 0xff, 0x07, 0x95, 0x74, - 0x5b, 0x7e, 0xcc, 0x27, 0x9e, 0x4f, 0xe3, 0x9a, 0xcd, 0x7a, 0x3a, 0x5d, 0x17, 0x32, 0xab, 0xbd, - 0xe3, 0x6b, 0x24, 0xf7, 0xea, 0x95, 0x17, 0x77, 0xb5, 0xd7, 0x7b, 0xe5, 0x34, 0xce, 0x65, 0x4d, - 0x63, 0xf3, 0x17, 0x73, 0x30, 0xcd, 0xbd, 0x49, 0x9f, 0x7d, 0x5d, 0xf1, 0x5d, 0x4d, 0x38, 0x4b, - 0x5b, 0x60, 0xaa, 0x76, 0xc7, 0x68, 0x8b, 0x5f, 0x87, 0xf3, 0x7d, 0x4d, 0x81, 0x02, 0x7a, 0x41, - 0xfa, 0xf1, 0xf6, 0x89, 0xe8, 0x99, 0xec, 0x4c, 0x36, 0x6f, 0x5b, 0x7d, 0x14, 0xe6, 0xdf, 0xcf, - 0xf5, 0xf1, 0x17, 0x7a, 0xa3, 0xaa, 0x09, 0x1a, 0xa7, 0xd3, 0x04, 0x73, 0x1f, 0x49, 0x13, 0xcc, - 0x0f, 0xa3, 0x09, 0x7e, 0x00, 0x13, 0xeb, 0xd4, 0x61, 0x1a, 0x8d, 0xb8, 0x2e, 0x57, 0xd0, 0xde, - 0xd8, 0x65, 0x69, 0x52, 0xbe, 0xc4, 0x57, 0x6d, 0x23, 0x46, 0xc0, 0x44, 0x0b, 0xbf, 0x3f, 0x67, - 0xe9, 0x1c, 0xd4, 0x45, 0x63, 0x64, 0xf0, 0xa2, 0x61, 0xfe, 0x35, 0x03, 0x9e, 0x67, 0x0b, 0x5a, - 0x9f, 0x60, 0xda, 0x72, 0x02, 0x26, 0x40, 0x42, 0xa6, 0x45, 0x4a, 0xcf, 0x51, 0x23, 0x91, 0xc5, - 0xfd, 0x2e, 0xa3, 0x12, 0x8b, 0xc9, 0x1a, 0x49, 0x2c, 0xbc, 0x2c, 0xb8, 0x93, 0x9c, 0x80, 0x69, - 0x4e, 0x72, 0x02, 0x66, 0xfe, 0xbd, 0x02, 0x54, 0xb8, 0x37, 0x24, 0xdb, 0x0a, 0x8b, 0x78, 0x3a, - 0x7d, 0xef, 0x0e, 0x18, 0xa7, 0x7f, 0x77, 0xe0, 0x23, 0xb8, 0xdd, 0x2a, 0xd7, 0xb3, 0xf3, 0x43, - 0x5c, 0xcf, 0x7e, 0x53, 0xbb, 0xdb, 0x5c, 0x48, 0x1e, 0xb6, 0xdc, 0xef, 0x6d, 0xd3, 0xe3, 0x6f, - 0x35, 0xdf, 0x51, 0x2f, 0x21, 0x8f, 0x24, 0x0e, 0x29, 0x48, 0x79, 0xcc, 0xf5, 0xe3, 0x58, 0xb0, - 0x8d, 0x9e, 0xc6, 0x05, 0x7d, 0xec, 0xff, 0xa9, 0x0b, 0xfa, 0x22, 0x80, 0x12, 0x64, 0xa5, 0x98, - 0xbc, 0x6f, 0x79, 0x72, 0x80, 0x15, 0x85, 0xd0, 0xfc, 0x37, 0x45, 0x98, 0x6e, 0x34, 0x56, 0x17, - 0x3c, 0x67, 0xb7, 0xe3, 0x87, 0x91, 0xd7, 0x5c, 0xea, 0xec, 0xf8, 0x6c, 0x29, 0x58, 0x0c, 0x82, - 0x38, 0xea, 0x2d, 0x2e, 0x05, 0x94, 0x01, 0x2c, 0x0e, 0x67, 0xb3, 0xa1, 0xd1, 0xe3, 0x21, 0x30, - 0x72, 0xc9, 0x6c, 0x08, 0x39, 0xc8, 0x92, 0x69, 0x84, 0xf6, 0x8f, 0x42, 0xe1, 0x2b, 0x72, 0x51, - 0xf3, 0x4e, 0x4f, 0x92, 0xc5, 0x43, 0x6b, 0x08, 0xc5, 0x2e, 0xb3, 0xbb, 0x08, 0x57, 0x95, 0xf4, - 0xbe, 0x81, 0x1d, 0xc1, 0xf9, 0xcc, 0x39, 0x27, 0xa6, 0xfd, 0x40, 0xdd, 0xe2, 0x65, 0x31, 0xf7, - 0x9f, 0xcf, 0xd0, 0x2d, 0xd4, 0xf0, 0xf9, 0x99, 0xcc, 0xc9, 0xdf, 0x3a, 0x69, 0xaa, 0xa7, 0x1e, - 0xa8, 0x3a, 0x16, 0x17, 0x63, 0x88, 0x7c, 0x16, 0xef, 0x67, 0x64, 0x14, 0xc6, 0xce, 0x98, 0xec, - 0x27, 0x88, 0x99, 0x7f, 0x61, 0xc0, 0x45, 0x0d, 0x03, 0x63, 0x00, 0xb6, 0x69, 0x27, 0x3a, 0x21, - 0x34, 0xef, 0x87, 0x4f, 0x67, 0xe4, 0xbe, 0xa8, 0xd7, 0x85, 0x07, 0x30, 0xc6, 0xec, 0xd5, 0xed, - 0xe1, 0x80, 0x12, 0x92, 0x5d, 0x98, 0xc6, 0x24, 0xa9, 0xf4, 0xb0, 0x51, 0x89, 0x13, 0xae, 0x5c, - 0x7f, 0xf3, 0x4f, 0x0f, 0xab, 0xe7, 0xb4, 0x84, 0x2d, 0x9e, 0x39, 0x5e, 0x29, 0xc4, 0x4c, 0x63, - 0x55, 0xc9, 0xeb, 0xec, 0xf8, 0x5a, 0x4c, 0xce, 0x34, 0x4f, 0xf2, 0xaf, 0x0d, 0x98, 0x61, 0x50, - 0x5e, 0xee, 0xbb, 0x81, 0xdf, 0x8e, 0xd3, 0x4f, 0x88, 0x44, 0xd0, 0x7a, 0x3a, 0xed, 0xf4, 0x32, - 0x16, 0x99, 0x4f, 0x73, 0x7b, 0x27, 0xf0, 0xdb, 0x49, 0xf1, 0xd5, 0x96, 0x1a, 0x58, 0x48, 0xf2, - 0x73, 0x06, 0x5c, 0xd2, 0xb6, 0x50, 0xea, 0x85, 0xbc, 0x99, 0x92, 0x66, 0x18, 0x50, 0x93, 0xea, - 0x37, 0xc5, 0xe8, 0xbf, 0x86, 0x25, 0x48, 0x16, 0x00, 0x2c, 0x8b, 0xdd, 0xe6, 0x58, 0x4a, 0x11, - 0x06, 0xe7, 0x62, 0x7e, 0x23, 0x07, 0xe3, 0xca, 0xa2, 0x4a, 0x3e, 0x0f, 0xe5, 0xd5, 0x60, 0xd7, - 0xe9, 0x78, 0x3f, 0xe9, 0x28, 0x87, 0x8e, 0xb8, 0x68, 0xfb, 0x0a, 0xdc, 0xd2, 0xb0, 0xd0, 0x59, - 0x94, 0x3a, 0x6d, 0x55, 0xdd, 0x63, 0x8b, 0xb2, 0x85, 0xd0, 0x53, 0xae, 0x22, 0xef, 0x65, 0xac, - 0x22, 0xa7, 0x8a, 0x90, 0xf1, 0x76, 0xff, 0x5a, 0x32, 0x7c, 0x40, 0x0b, 0xf3, 0x97, 0x73, 0x50, - 0x11, 0x6f, 0xb0, 0xcb, 0x23, 0xb3, 0x4f, 0xd7, 0x9b, 0x4d, 0x7a, 0xe5, 0x8e, 0x71, 0x0a, 0x29, - 0xfc, 0xfa, 0x6f, 0x57, 0xf1, 0x45, 0xed, 0x74, 0x73, 0xc8, 0x17, 0xb5, 0x75, 0x78, 0xfa, 0xbe, - 0x5c, 0x9a, 0xca, 0x4a, 0xe3, 0x9b, 0x7f, 0x9c, 0x4b, 0xf3, 0x16, 0x36, 0x84, 0x97, 0x61, 0x8c, - 0x3f, 0xa1, 0x29, 0xaf, 0xf4, 0x88, 0x98, 0x8b, 0x08, 0xb2, 0x64, 0xda, 0x69, 0x6e, 0x4e, 0x9e, - 0xf4, 0xac, 0x3a, 0xb9, 0x03, 0x65, 0xf4, 0x92, 0xac, 0xb9, 0x6e, 0xc0, 0xd6, 0xc6, 0x42, 0x12, - 0x5e, 0xf1, 0x31, 0xdd, 0xb6, 0xb9, 0x37, 0xa5, 0xe3, 0xba, 0x81, 0xa5, 0xe1, 0x91, 0x79, 0x38, - 0xa7, 0x39, 0xe5, 0x4a, 0xfa, 0x91, 0x64, 0x8f, 0x14, 0x61, 0x02, 0x27, 0xce, 0x44, 0xc6, 0x08, - 0xbc, 0xfc, 0x85, 0x7b, 0xd4, 0x63, 0xf4, 0xd0, 0x74, 0x72, 0xd2, 0xcb, 0x93, 0x7a, 0x82, 0x91, - 0x27, 0xda, 0x4e, 0x57, 0x0b, 0xe6, 0xc2, 0x11, 0xcd, 0x3f, 0x37, 0xd8, 0x5c, 0x6b, 0xee, 0x7f, - 0xca, 0xee, 0x74, 0xb2, 0x2a, 0x1d, 0x63, 0xe2, 0xfa, 0xf7, 0x06, 0xbf, 0x95, 0x25, 0x86, 0xcf, - 0x9b, 0x30, 0xca, 0x1f, 0xec, 0x14, 0xf7, 0x87, 0x54, 0x2e, 0x3c, 0x21, 0xf1, 0xca, 0xe0, 0xcf, - 0x7e, 0x5a, 0x82, 0x40, 0x55, 0xf1, 0x73, 0x43, 0xa9, 0xf8, 0x4a, 0x3c, 0xf1, 0xe1, 0xde, 0xa9, - 0x30, 0x4e, 0x8e, 0x27, 0x6e, 0xfe, 0x9f, 0x1c, 0xaf, 0x8f, 0x28, 0xd4, 0xb0, 0x81, 0x72, 0xaf, - 0x41, 0x01, 0x9f, 0x86, 0x57, 0xa2, 0x11, 0xa7, 0x9e, 0x85, 0xc7, 0x74, 0x36, 0x6f, 0x50, 0xd6, - 0xaa, 0xd7, 0x88, 0x51, 0x1c, 0xab, 0xf3, 0x06, 0x31, 0xf0, 0x15, 0x08, 0xdf, 0xa5, 0xea, 0x74, - 0xe8, 0xe8, 0x0f, 0x76, 0x60, 0x3a, 0xd3, 0xdf, 0xe3, 0xdb, 0x3c, 0xaa, 0x19, 0xbf, 0xbd, 0xe3, - 0xd8, 0xfc, 0x16, 0x89, 0x2a, 0x6d, 0x93, 0x8b, 0x3f, 0x8b, 0x30, 0xa9, 0xc7, 0x18, 0x11, 0xa6, - 0x36, 0x8c, 0x0b, 0x90, 0x8a, 0x4f, 0xa2, 0x1a, 0x75, 0x74, 0x22, 0xb6, 0x3f, 0xd2, 0x02, 0x49, - 0xa8, 0xc1, 0xd3, 0x79, 0x54, 0x37, 0xbb, 0x3f, 0x02, 0x92, 0x4e, 0xa2, 0x1c, 0x13, 0x7f, 0x0e, - 0x2a, 0x62, 0x66, 0xc6, 0x37, 0xba, 0xd1, 0xa0, 0xb1, 0xb4, 0x60, 0xa9, 0xb3, 0xa9, 0xe9, 0xb9, - 0x81, 0x85, 0x50, 0xf3, 0x3b, 0x06, 0x5c, 0x12, 0x0f, 0x91, 0x5a, 0x34, 0x8c, 0x02, 0x8f, 0x5f, - 0x10, 0xc7, 0xf1, 0xf8, 0x79, 0xf2, 0xb6, 0x0c, 0x18, 0xa9, 0x0b, 0xc8, 0x74, 0x1e, 0xf5, 0x09, - 0x31, 0x28, 0x47, 0x30, 0x64, 0xa4, 0x0c, 0x14, 0xf9, 0xa6, 0x08, 0x14, 0x99, 0x3b, 0x9e, 0x38, - 0x9e, 0x17, 0x2e, 0xed, 0xc8, 0x00, 0x91, 0xdf, 0xce, 0xc1, 0xf9, 0x8c, 0x62, 0x6d, 0x7e, 0xfe, - 0x19, 0x15, 0x0e, 0x75, 0x4d, 0x38, 0xc8, 0x48, 0xc2, 0x03, 0x1b, 0x3e, 0x53, 0x56, 0xfc, 0xa6, - 0x01, 0x17, 0xf5, 0xd1, 0x23, 0x2c, 0xb0, 0x9b, 0xb7, 0xc9, 0x5b, 0x30, 0x7a, 0x9f, 0x3a, 0x2e, - 0x95, 0x17, 0x0f, 0xe3, 0xa8, 0x9c, 0xe2, 0x4c, 0x94, 0x27, 0x72, 0xb6, 0x7f, 0xcc, 0xa7, 0xf2, - 0x19, 0x4b, 0x90, 0x90, 0x05, 0x51, 0x38, 0xee, 0x94, 0x61, 0x4a, 0xff, 0x84, 0xac, 0xac, 0x8e, - 0x31, 0x07, 0xfd, 0xae, 0x01, 0xcf, 0x1d, 0x43, 0xc3, 0x3a, 0x8e, 0x75, 0xbd, 0xda, 0x71, 0xb8, - 0xb0, 0x20, 0x94, 0xbc, 0x0b, 0x53, 0xeb, 0x42, 0x75, 0x95, 0xdd, 0xa1, 0xbc, 0xca, 0x22, 0xb5, - 0x5a, 0x5b, 0xf6, 0x4b, 0x1a, 0x99, 0x5c, 0x87, 0xe2, 0x7d, 0x3f, 0x8c, 0x3a, 0x49, 0x90, 0x37, - 0xb4, 0x79, 0xef, 0x09, 0x98, 0x15, 0xa7, 0x32, 0xb5, 0x40, 0x2f, 0xa6, 0x70, 0x02, 0x7c, 0x11, - 0x46, 0x19, 0x4e, 0x6c, 0x53, 0xc2, 0x71, 0x80, 0xcf, 0x64, 0x7a, 0xae, 0x25, 0x92, 0x62, 0x6b, - 0x66, 0x2e, 0xf3, 0xac, 0xfe, 0x1b, 0x06, 0x54, 0x74, 0xde, 0x1f, 0xb7, 0x6b, 0xde, 0xd1, 0xba, - 0xe6, 0xb9, 0xec, 0xae, 0x19, 0xdc, 0x27, 0x7d, 0xf1, 0x96, 0x86, 0xea, 0x0b, 0x13, 0x46, 0x17, - 0xfc, 0xb6, 0xe3, 0x75, 0xd4, 0x18, 0x41, 0x2e, 0x42, 0x2c, 0x91, 0xa2, 0xb4, 0x56, 0x7e, 0x60, - 0x6b, 0x99, 0xdf, 0x2a, 0xc0, 0x25, 0x8b, 0xee, 0x7a, 0x4c, 0x41, 0xda, 0x08, 0xbd, 0xce, 0xae, - 0xe6, 0x49, 0x61, 0xa6, 0x1a, 0x5c, 0xf8, 0x8f, 0x33, 0x48, 0xdc, 0xde, 0xaf, 0x42, 0x91, 0x49, - 0x69, 0xa5, 0xcd, 0xd1, 0xd4, 0x87, 0x91, 0xee, 0x78, 0xbf, 0xca, 0x64, 0x72, 0x43, 0xac, 0x21, - 0xca, 0x0d, 0x1f, 0xb6, 0x86, 0xfc, 0xf0, 0xb0, 0x0a, 0xfc, 0x59, 0x04, 0x96, 0x2a, 0xd6, 0x91, - 0x58, 0xa9, 0x2a, 0x0c, 0x50, 0xaa, 0x1e, 0xc2, 0xb9, 0x9a, 0xcb, 0xe5, 0x93, 0xd3, 0x5a, 0x0b, - 0xbc, 0x4e, 0xd3, 0xeb, 0x3a, 0x2d, 0xa9, 0x94, 0xa3, 0x69, 0xc8, 0x89, 0xd3, 0xed, 0x6e, 0x8c, - 0x60, 0x65, 0x92, 0xb1, 0x6a, 0x2c, 0xac, 0x34, 0x78, 0x20, 0x33, 0x6e, 0xef, 0xc1, 0x6a, 0xb8, - 0x9d, 0x90, 0x47, 0x32, 0xb3, 0xe2, 0x64, 0x54, 0xe7, 0xf0, 0x92, 0xdf, 0xfa, 0x72, 0xe3, 0x81, - 0xb8, 0x34, 0x27, 0x1d, 0x90, 0xf9, 0x9d, 0xc0, 0xa8, 0x15, 0xa2, 0xd5, 0x5a, 0xc3, 0x4b, 0xe8, - 0x1a, 0x8d, 0xfb, 0x8c, 0xae, 0xd8, 0x47, 0x17, 0x86, 0x7b, 0x2a, 0x1d, 0xc7, 0x23, 0xb3, 0x00, - 0xdc, 0x85, 0x13, 0x07, 0x44, 0x29, 0x51, 0xfe, 0x02, 0x84, 0x72, 0xe5, 0x4f, 0x41, 0x21, 0x6f, - 0xc3, 0xd9, 0xc5, 0xf9, 0x39, 0x79, 0x1b, 0x6e, 0xc1, 0x6f, 0xf6, 0xd8, 0xf6, 0x19, 0x6f, 0x67, - 0x96, 0x79, 0x1f, 0xd2, 0xe6, 0x1c, 0x1b, 0x05, 0x59, 0x68, 0xe2, 0x4e, 0x1c, 0xbf, 0x51, 0x3d, - 0xef, 0xbb, 0x34, 0xdc, 0xbc, 0xf5, 0x29, 0xbb, 0x13, 0xa7, 0xd4, 0x0d, 0x67, 0xdb, 0xad, 0xcc, - 0x99, 0xf9, 0x37, 0xf1, 0x4e, 0x5c, 0x1f, 0x2e, 0xf9, 0x11, 0x18, 0xc1, 0x4f, 0xb1, 0xe2, 0x9e, - 0xcd, 0x60, 0x9b, 0xac, 0xb6, 0x4d, 0x1e, 0x93, 0x0a, 0x09, 0xc8, 0x52, 0xf2, 0xe8, 0xcc, 0x29, - 0x6e, 0x76, 0x88, 0xb0, 0x0c, 0xfa, 0x6b, 0x63, 0x2e, 0x94, 0xd5, 0x0c, 0xd9, 0x18, 0xb9, 0xef, - 0x84, 0x7b, 0xd4, 0x9d, 0x97, 0x6f, 0x14, 0x97, 0xf9, 0x18, 0xd9, 0x43, 0x28, 0xbe, 0x84, 0x66, - 0x29, 0x28, 0x4c, 0x3a, 0x2c, 0x85, 0x1b, 0xa1, 0x28, 0x8a, 0xd8, 0x05, 0x79, 0xb8, 0x7b, 0x75, - 0x2d, 0x91, 0x84, 0xd2, 0x52, 0x5a, 0x05, 0x03, 0xa7, 0xb9, 0x4f, 0x83, 0xcd, 0x5b, 0x9f, 0x84, - 0xb4, 0xd4, 0xf3, 0x38, 0xa6, 0x4f, 0x7e, 0xa5, 0x18, 0x87, 0x54, 0xd3, 0x90, 0x99, 0x8e, 0x98, - 0xf8, 0xa3, 0x19, 0x89, 0x8e, 0x98, 0xf8, 0xa3, 0xa9, 0x3a, 0x62, 0x8c, 0x1a, 0x47, 0xbc, 0xcf, - 0x9d, 0x10, 0xf1, 0x7e, 0xc0, 0x23, 0x1b, 0xf2, 0x2a, 0xc3, 0xa7, 0xe8, 0xbd, 0xa1, 0x2f, 0x42, - 0xb9, 0x16, 0x45, 0x4e, 0x73, 0x8f, 0xba, 0xf8, 0xb2, 0x82, 0xe2, 0x06, 0xe3, 0x08, 0xb8, 0xea, - 0x24, 0xad, 0xe2, 0x2a, 0xef, 0x8d, 0x8d, 0x0d, 0xf1, 0xde, 0xd8, 0x2c, 0x8c, 0x2d, 0x75, 0x1e, - 0x79, 0xac, 0x4d, 0x8a, 0x49, 0x48, 0x24, 0x8f, 0x83, 0xf4, 0x47, 0xaa, 0x10, 0x44, 0xde, 0x54, - 0x34, 0x88, 0x52, 0xa2, 0xca, 0xf3, 0x6d, 0x96, 0x2d, 0x15, 0x09, 0xf5, 0xb0, 0x41, 0xa2, 0x93, - 0x3b, 0x30, 0x26, 0x77, 0xcf, 0x90, 0xa8, 0xef, 0x82, 0xd2, 0xe1, 0x29, 0x5a, 0x14, 0x26, 0xb1, - 0x7b, 0x7e, 0x5b, 0xbf, 0x35, 0x39, 0xae, 0x44, 0x23, 0x51, 0x6e, 0x4d, 0x6a, 0xd1, 0x48, 0x94, - 0xfb, 0x93, 0xf1, 0x66, 0xa8, 0x7c, 0xe2, 0x66, 0x68, 0x13, 0xca, 0x6b, 0x4e, 0x10, 0x79, 0x6c, - 0x39, 0xea, 0x44, 0x3c, 0x1c, 0x66, 0xb2, 0x57, 0x57, 0x92, 0xea, 0x2f, 0xc8, 0xa8, 0x1c, 0x5d, - 0x05, 0x5f, 0x0f, 0xe7, 0x90, 0xc0, 0xc9, 0x4a, 0x86, 0x5f, 0xbd, 0x08, 0xde, 0x8c, 0x36, 0x75, - 0xc5, 0x70, 0x25, 0x6a, 0xa4, 0x5a, 0x46, 0xfb, 0x5d, 0xf2, 0x6f, 0xf3, 0x3e, 0xc0, 0x3d, 0xe3, - 0x14, 0xb2, 0xc1, 0x98, 0x5a, 0xa8, 0x57, 0xa4, 0x36, 0x8e, 0x31, 0x22, 0xf9, 0x1a, 0x94, 0xd9, - 0x7f, 0x8c, 0x0d, 0xe8, 0x51, 0x1e, 0xee, 0x32, 0xf1, 0xb3, 0xd6, 0x27, 0x34, 0x0f, 0x20, 0xd8, - 0xa0, 0x11, 0x9f, 0xc0, 0xc8, 0x38, 0x6d, 0x78, 0xd1, 0xb8, 0x99, 0x3f, 0x30, 0xe0, 0xe2, 0x00, - 0x1e, 0x43, 0xbf, 0x34, 0x38, 0x9b, 0x2c, 0x48, 0xca, 0xde, 0x5c, 0x2c, 0x48, 0xea, 0xc0, 0x90, - 0x4b, 0x53, 0x76, 0xa0, 0xca, 0xfc, 0x27, 0x16, 0xa8, 0xd2, 0x3c, 0x34, 0x60, 0x5c, 0xe9, 0xd9, - 0xa7, 0xf8, 0x80, 0xd0, 0x35, 0x11, 0xb1, 0x39, 0x9f, 0xe0, 0xb5, 0x53, 0xfb, 0x70, 0x8c, 0xd0, - 0xfc, 0x75, 0x80, 0x65, 0x27, 0x8c, 0x6a, 0xcd, 0xc8, 0x7b, 0x44, 0x87, 0x10, 0x63, 0x49, 0x78, - 0x1a, 0x07, 0x03, 0xa0, 0x33, 0xb2, 0xbe, 0xf0, 0x34, 0x31, 0x43, 0x73, 0x05, 0x46, 0x1b, 0x7e, - 0x10, 0xd5, 0x0f, 0xf8, 0xda, 0xb4, 0x40, 0xc3, 0xa6, 0x6a, 0xa1, 0xf3, 0x70, 0xaf, 0xde, 0xb4, - 0x44, 0x12, 0x53, 0x10, 0xef, 0x7a, 0xb4, 0xe5, 0xaa, 0x7e, 0x09, 0x3b, 0x0c, 0x60, 0x71, 0xf8, - 0x8d, 0xf7, 0x60, 0x4a, 0x06, 0x8d, 0x5d, 0x5f, 0x6e, 0x60, 0x0d, 0xa6, 0x60, 0x7c, 0x73, 0xd1, - 0x5a, 0xba, 0xfb, 0x15, 0xfb, 0xee, 0xc6, 0xf2, 0x72, 0xe5, 0x0c, 0x99, 0x80, 0x92, 0x00, 0xcc, - 0xd7, 0x2a, 0x06, 0x29, 0x43, 0x71, 0x69, 0xa5, 0xb1, 0x38, 0xbf, 0x61, 0x2d, 0x56, 0x72, 0x37, - 0x5e, 0x86, 0xc9, 0xc4, 0xeb, 0x00, 0x23, 0x13, 0x8c, 0x41, 0xde, 0xaa, 0x6d, 0x55, 0xce, 0x10, - 0x80, 0xd1, 0xb5, 0x07, 0xf3, 0x8d, 0x5b, 0xb7, 0x2a, 0xc6, 0x8d, 0xcf, 0xc1, 0x34, 0x5a, 0xed, - 0x96, 0x99, 0x12, 0xdd, 0xa1, 0x01, 0xe6, 0x54, 0x86, 0x62, 0x83, 0x76, 0x9d, 0xc0, 0x89, 0x28, - 0xcf, 0xe6, 0x61, 0xaf, 0x15, 0x79, 0xdd, 0x16, 0x7d, 0x52, 0x31, 0x6e, 0xbc, 0x09, 0x53, 0x96, - 0xdf, 0x8b, 0xbc, 0xce, 0xae, 0x0c, 0xfd, 0x4e, 0xce, 0xc3, 0xf4, 0xc6, 0x4a, 0xed, 0x61, 0x7d, - 0xe9, 0xde, 0xc6, 0xea, 0x46, 0xc3, 0x7e, 0x58, 0x5b, 0x9f, 0xbf, 0x5f, 0x39, 0xc3, 0x0a, 0xfc, - 0x70, 0xb5, 0xb1, 0x6e, 0x5b, 0x8b, 0xf3, 0x8b, 0x2b, 0xeb, 0x15, 0xe3, 0xc6, 0x2f, 0x19, 0x30, - 0xa9, 0xbf, 0x62, 0x4b, 0xae, 0xc2, 0x95, 0x8d, 0xc6, 0xa2, 0x65, 0xaf, 0xaf, 0x3e, 0x58, 0x5c, - 0xb1, 0x37, 0x1a, 0xb5, 0x7b, 0x8b, 0xf6, 0xc6, 0x4a, 0x63, 0x6d, 0x71, 0x7e, 0xe9, 0xee, 0xd2, - 0xe2, 0x42, 0xe5, 0x0c, 0xa9, 0xc2, 0x73, 0x0a, 0x86, 0xb5, 0x38, 0xbf, 0xba, 0xb9, 0x68, 0xd9, - 0x6b, 0xb5, 0x46, 0x63, 0x6b, 0xd5, 0x5a, 0xa8, 0x18, 0xe4, 0x32, 0x5c, 0xc8, 0x40, 0x78, 0x78, - 0xb7, 0x56, 0xc9, 0xf5, 0xa5, 0xad, 0x2c, 0x6e, 0xd5, 0x96, 0xed, 0xfa, 0xea, 0x7a, 0x25, 0x7f, - 0xe3, 0x3d, 0xa6, 0x85, 0x24, 0xcf, 0x4c, 0x91, 0x22, 0x14, 0x56, 0x56, 0x57, 0x16, 0x2b, 0x67, - 0xc8, 0x38, 0x8c, 0xad, 0x2d, 0xae, 0x2c, 0x2c, 0xad, 0xdc, 0xe3, 0xcd, 0x5a, 0x5b, 0x5b, 0xb3, - 0x56, 0x37, 0x17, 0x17, 0x2a, 0x39, 0xd6, 0x76, 0x0b, 0x8b, 0x2b, 0xac, 0x64, 0xf9, 0x1b, 0x26, - 0x7f, 0x5a, 0x41, 0x8b, 0x0c, 0xce, 0x5a, 0x6b, 0xf1, 0xcb, 0xeb, 0x8b, 0x2b, 0x8d, 0xa5, 0xd5, - 0x95, 0xca, 0x99, 0x1b, 0x57, 0x52, 0x38, 0xb2, 0x27, 0x1a, 0x8d, 0xfb, 0x95, 0x33, 0x37, 0xbe, - 0x06, 0x65, 0x75, 0x11, 0x26, 0x17, 0xe1, 0xac, 0xfa, 0xbd, 0x46, 0x3b, 0xae, 0xd7, 0xd9, 0xad, - 0x9c, 0x49, 0x27, 0x58, 0xbd, 0x4e, 0x87, 0x25, 0x60, 0xe5, 0xd5, 0x84, 0x75, 0x1a, 0xb4, 0xbd, - 0x0e, 0x5b, 0x5f, 0x2b, 0xb9, 0x7a, 0xe5, 0x7b, 0x7f, 0xf6, 0xc2, 0x99, 0xef, 0x7d, 0xff, 0x05, - 0xe3, 0x8f, 0xbf, 0xff, 0x82, 0xf1, 0x5f, 0xbf, 0xff, 0x82, 0xb1, 0x3d, 0x8a, 0x03, 0xfd, 0xf6, - 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xe6, 0xae, 0x2f, 0x9b, 0xbd, 0x00, 0x00, + 0x92, 0xb5, 0xec, 0xee, 0x6a, 0x55, 0x55, 0xcf, 0x0c, 0xa5, 0x4f, 0x90, 0x84, 0x0f, 0xb2, 0x20, + 0x08, 0xba, 0x1f, 0xe1, 0x64, 0x49, 0x86, 0x0c, 0xc9, 0x82, 0x65, 0x5b, 0x36, 0x4e, 0x0f, 0xb2, + 0x01, 0xdb, 0xb0, 0x61, 0x43, 0x80, 0x21, 0xdc, 0x83, 0x0d, 0xeb, 0xc5, 0x30, 0x24, 0x1b, 0xb4, + 0x75, 0xe7, 0x17, 0x13, 0xb0, 0x61, 0x40, 0x4f, 0x3a, 0x5b, 0x80, 0x91, 0x91, 0x99, 0x55, 0x99, + 0xd5, 0xd5, 0x64, 0x73, 0x77, 0x16, 0xbe, 0xd9, 0xa7, 0xee, 0x8a, 0x8c, 0x88, 0xfc, 0x8f, 0x8c, + 0x8c, 0x8c, 0x8c, 0x84, 0xf1, 0xe8, 0xa0, 0x4b, 0xc3, 0x9b, 0xdd, 0xc0, 0x8f, 0x7c, 0x32, 0x82, + 0x1f, 0x97, 0xcf, 0xed, 0xfa, 0xbb, 0x3e, 0x42, 0x66, 0xd9, 0x3f, 0x9e, 0x78, 0xb9, 0xba, 0xeb, + 0xfb, 0xbb, 0x2d, 0x3a, 0x8b, 0x5f, 0xdb, 0xbd, 0x9d, 0xd9, 0xc8, 0x6b, 0xd3, 0x30, 0x72, 0xda, + 0x5d, 0x81, 0x30, 0xbf, 0xeb, 0x45, 0x7b, 0xbd, 0xed, 0x9b, 0x4d, 0xbf, 0x3d, 0xbb, 0x1b, 0x38, + 0x8f, 0xbc, 0xc8, 0x89, 0x3c, 0xbf, 0xe3, 0xb4, 0x66, 0x23, 0xda, 0xa2, 0x5d, 0x3f, 0x88, 0x66, + 0x9d, 0xae, 0x37, 0x8b, 0x79, 0xcc, 0x3e, 0x0e, 0x9c, 0x6e, 0x97, 0x06, 0xc9, 0x1f, 0xce, 0xc4, + 0xfc, 0x3b, 0x79, 0x28, 0x3d, 0xa0, 0xb4, 0x5b, 0x6b, 0x79, 0x8f, 0x28, 0x79, 0x11, 0x0a, 0x2b, + 0x4e, 0x9b, 0xce, 0x18, 0x57, 0x8d, 0xeb, 0xa5, 0xfa, 0xd4, 0xd1, 0x61, 0x75, 0x3c, 0xa4, 0xc1, + 0x23, 0x1a, 0xd8, 0x1d, 0xa7, 0x4d, 0x2d, 0x4c, 0x24, 0x9f, 0x85, 0x12, 0xfb, 0x0d, 0xbb, 0x4e, + 0x93, 0xce, 0xe4, 0x10, 0x73, 0xe2, 0xe8, 0xb0, 0x5a, 0xea, 0x48, 0xa0, 0x95, 0xa4, 0x93, 0x6b, + 0x30, 0xb6, 0x4c, 0x9d, 0x90, 0x2e, 0x2d, 0xcc, 0xe4, 0xaf, 0x1a, 0xd7, 0xf3, 0xf5, 0xf2, 0xd1, + 0x61, 0xb5, 0xd8, 0x62, 0x20, 0xdb, 0x73, 0x2d, 0x99, 0x48, 0x96, 0x60, 0x6c, 0xf1, 0x49, 0xd7, + 0x0b, 0x68, 0x38, 0x53, 0xb8, 0x6a, 0x5c, 0x1f, 0x9f, 0xbb, 0x7c, 0x93, 0xd7, 0xff, 0xa6, 0xac, + 0xff, 0xcd, 0x75, 0x59, 0xff, 0xfa, 0xd9, 0xef, 0x1d, 0x56, 0xcf, 0x1c, 0x1d, 0x56, 0xc7, 0x28, + 0x27, 0xf9, 0xd6, 0x7f, 0xa9, 0x1a, 0x96, 0xa4, 0x27, 0x6f, 0x43, 0x61, 0xfd, 0xa0, 0x4b, 0x67, + 0x4a, 0x57, 0x8d, 0xeb, 0x93, 0x73, 0x2f, 0xdc, 0xe4, 0x2d, 0x1e, 0x57, 0x32, 0xf9, 0xc7, 0xb0, + 0xea, 0xc5, 0xa3, 0xc3, 0x6a, 0x81, 0xa1, 0x58, 0x48, 0x45, 0x5e, 0x87, 0xd1, 0xfb, 0x7e, 0x18, + 0x2d, 0x2d, 0xcc, 0x00, 0x56, 0xed, 0xfc, 0xd1, 0x61, 0x75, 0x7a, 0xcf, 0x0f, 0x23, 0xdb, 0x73, + 0x5f, 0xf3, 0xdb, 0x5e, 0x44, 0xdb, 0xdd, 0xe8, 0xc0, 0x12, 0x48, 0xe6, 0x36, 0x4c, 0x68, 0xfc, + 0xc8, 0x38, 0x8c, 0x6d, 0xac, 0x3c, 0x58, 0x59, 0xdd, 0x5a, 0xa9, 0x9c, 0x21, 0x45, 0x28, 0xac, + 0xac, 0x2e, 0x2c, 0x56, 0x0c, 0x32, 0x06, 0xf9, 0xda, 0xda, 0x5a, 0x25, 0x47, 0xca, 0x50, 0x5c, + 0xa8, 0xad, 0xd7, 0xea, 0xb5, 0xc6, 0x62, 0x25, 0x4f, 0xce, 0xc2, 0xd4, 0xd6, 0xd2, 0xca, 0xc2, + 0xea, 0x56, 0xc3, 0x5e, 0x58, 0x6c, 0x3c, 0x58, 0x5f, 0x5d, 0xab, 0x14, 0xc8, 0x24, 0xc0, 0x83, + 0x8d, 0xfa, 0xa2, 0xb5, 0xb2, 0xb8, 0xbe, 0xd8, 0xa8, 0x8c, 0x98, 0xbf, 0x94, 0x87, 0xe2, 0x43, + 0x1a, 0x39, 0xae, 0x13, 0x39, 0xe4, 0x8a, 0xd6, 0x45, 0x58, 0x7a, 0xa5, 0x6f, 0x5e, 0xec, 0xef, + 0x9b, 0x91, 0xa3, 0xc3, 0xaa, 0xf1, 0xba, 0xda, 0x27, 0x6f, 0xc1, 0xf8, 0x02, 0x0d, 0x9b, 0x81, + 0xd7, 0x65, 0xe3, 0x05, 0xfb, 0xa5, 0x54, 0xbf, 0x74, 0x74, 0x58, 0x3d, 0xef, 0x26, 0x60, 0xa5, + 0xae, 0x2a, 0x36, 0x59, 0x82, 0xd1, 0x65, 0x67, 0x9b, 0xb6, 0xc2, 0x99, 0x91, 0xab, 0xf9, 0xeb, + 0xe3, 0x73, 0xcf, 0x89, 0xf6, 0x95, 0x05, 0xbc, 0xc9, 0x53, 0x17, 0x3b, 0x51, 0x70, 0x50, 0x3f, + 0x77, 0x74, 0x58, 0xad, 0xb4, 0x10, 0xa0, 0xb6, 0x1d, 0x47, 0x21, 0x8d, 0xa4, 0xcf, 0x47, 0x4f, + 0xec, 0xf3, 0xe7, 0xbf, 0x77, 0x58, 0x35, 0x58, 0x5f, 0x88, 0x3e, 0x4f, 0xf8, 0xe9, 0xbd, 0x7f, + 0x15, 0x72, 0x4b, 0x0b, 0x33, 0x63, 0x38, 0xd6, 0x2a, 0x47, 0x87, 0xd5, 0xb2, 0xd6, 0x6d, 0xb9, + 0xa5, 0x85, 0xcb, 0x6f, 0xc2, 0xb8, 0x52, 0x46, 0x52, 0x81, 0xfc, 0x3e, 0x3d, 0xe0, 0xed, 0x69, + 0xb1, 0xbf, 0xe4, 0x1c, 0x8c, 0x3c, 0x72, 0x5a, 0x3d, 0xd1, 0x80, 0x16, 0xff, 0xf8, 0x62, 0xee, + 0xc7, 0x0c, 0xf3, 0xd7, 0x0a, 0x50, 0xb4, 0x7c, 0x3e, 0xcf, 0xc8, 0xab, 0x30, 0xd2, 0x88, 0x9c, + 0x48, 0x76, 0xc5, 0xd9, 0xa3, 0xc3, 0xea, 0x54, 0xc8, 0x00, 0x4a, 0x7e, 0x1c, 0x83, 0xa1, 0xae, + 0xed, 0x39, 0xa1, 0xec, 0x12, 0x44, 0xed, 0x32, 0x80, 0x8a, 0x8a, 0x18, 0xe4, 0x1a, 0x14, 0x1e, + 0xfa, 0x2e, 0x15, 0xbd, 0x42, 0x8e, 0x0e, 0xab, 0x93, 0x6d, 0xdf, 0x55, 0x11, 0x31, 0x9d, 0xbc, + 0x06, 0xa5, 0xf9, 0x5e, 0x10, 0xd0, 0x0e, 0x1b, 0xaa, 0x05, 0x44, 0x9e, 0x3c, 0x3a, 0xac, 0x42, + 0x93, 0x03, 0xd9, 0xe4, 0x4a, 0x10, 0x58, 0x53, 0x37, 0x22, 0x27, 0x88, 0xa8, 0x3b, 0x33, 0x32, + 0x54, 0x53, 0xb3, 0xe9, 0x35, 0x1d, 0x72, 0x92, 0x74, 0x53, 0x0b, 0x4e, 0xe4, 0x3e, 0x8c, 0xdf, + 0x0b, 0x9c, 0x26, 0x5d, 0xa3, 0x81, 0xe7, 0xbb, 0xd8, 0x87, 0xf9, 0xfa, 0xb5, 0xa3, 0xc3, 0xea, + 0x85, 0x5d, 0x06, 0xb6, 0xbb, 0x08, 0x4f, 0xa8, 0x7f, 0x78, 0x58, 0x2d, 0x2e, 0xf4, 0x02, 0x6c, + 0x3d, 0x4b, 0x25, 0x25, 0x3f, 0xc9, 0xba, 0x24, 0x8c, 0xb0, 0x69, 0xa9, 0x8b, 0xbd, 0x77, 0x7c, + 0x11, 0x4d, 0x51, 0xc4, 0x0b, 0x2d, 0x27, 0x8c, 0xec, 0x80, 0xd3, 0xa5, 0xca, 0xa9, 0xb2, 0x24, + 0xab, 0x50, 0x6c, 0x34, 0xf7, 0xa8, 0xdb, 0x6b, 0xd1, 0x99, 0x22, 0xb2, 0xbf, 0x28, 0x06, 0xae, + 0xec, 0x4f, 0x99, 0x5c, 0xbf, 0x2c, 0x78, 0x93, 0x50, 0x40, 0x94, 0xb6, 0x8f, 0x99, 0x7c, 0xb1, + 0xf8, 0x9b, 0xbf, 0x5b, 0x3d, 0xf3, 0xf3, 0xff, 0xf9, 0xea, 0x19, 0xf3, 0x9f, 0xe6, 0xa0, 0x92, + 0x66, 0x42, 0x76, 0x60, 0x62, 0xa3, 0xeb, 0x3a, 0x11, 0x9d, 0x6f, 0x79, 0xb4, 0x13, 0x85, 0x38, + 0x48, 0x8e, 0xaf, 0xd3, 0x4b, 0x22, 0xdf, 0x99, 0x1e, 0x12, 0xda, 0x4d, 0x4e, 0x99, 0xaa, 0x95, + 0xce, 0x36, 0xc9, 0xa7, 0x81, 0x72, 0x3a, 0xc4, 0x11, 0x76, 0xba, 0x7c, 0xb8, 0x84, 0x1f, 0x90, + 0x8f, 0x60, 0x2b, 0x06, 0x50, 0xc7, 0xdd, 0x3e, 0xc0, 0x91, 0x39, 0xfc, 0x00, 0x62, 0x24, 0x19, + 0x03, 0x88, 0x81, 0xcd, 0xff, 0x66, 0xc0, 0xa4, 0x45, 0x43, 0xbf, 0x17, 0x34, 0xe9, 0x7d, 0xea, + 0xb8, 0x34, 0x60, 0xc3, 0xff, 0x81, 0xd7, 0x71, 0xc5, 0x9c, 0xc2, 0xe1, 0xbf, 0xef, 0x75, 0xd4, + 0x29, 0x8c, 0xe9, 0xe4, 0x73, 0x30, 0xd6, 0xe8, 0x6d, 0x23, 0x2a, 0x9f, 0x53, 0x17, 0xb0, 0xc7, + 0x7a, 0xdb, 0x76, 0x0a, 0x5d, 0xa2, 0x91, 0x59, 0x18, 0xdb, 0xa4, 0x41, 0x98, 0x48, 0x3c, 0x94, + 0xec, 0x8f, 0x38, 0x48, 0x25, 0x10, 0x58, 0xe4, 0x5e, 0x22, 0x75, 0xc5, 0x9a, 0x34, 0x95, 0x92, + 0x75, 0xc9, 0x50, 0x69, 0x0b, 0x88, 0x3a, 0x54, 0x24, 0x96, 0xf9, 0xed, 0x1c, 0x54, 0x16, 0x9c, + 0xc8, 0xd9, 0x76, 0x42, 0xd1, 0x9e, 0x9b, 0xb7, 0x99, 0x1c, 0x57, 0x2a, 0x8a, 0x72, 0x9c, 0x95, + 0xfc, 0x23, 0x57, 0xef, 0xe5, 0x74, 0xf5, 0xc6, 0xd9, 0x02, 0x29, 0xaa, 0x97, 0x54, 0xea, 0x9d, + 0x93, 0x2b, 0x55, 0x11, 0x95, 0x2a, 0xca, 0x4a, 0x25, 0x55, 0x21, 0xef, 0x40, 0xa1, 0xd1, 0xa5, + 0x4d, 0x21, 0x44, 0xa4, 0xec, 0xd7, 0x2b, 0xc7, 0x10, 0x36, 0x6f, 0xd7, 0xcb, 0x82, 0x4d, 0x21, + 0xec, 0xd2, 0xa6, 0x85, 0x64, 0xca, 0xa4, 0xf9, 0xce, 0x28, 0x9c, 0xcb, 0x22, 0x23, 0xef, 0xe8, + 0x8b, 0x13, 0x6f, 0x9e, 0xe7, 0x06, 0x2e, 0x4e, 0x33, 0x86, 0xbe, 0x3c, 0xdd, 0x80, 0xe2, 0x1a, + 0x1b, 0x90, 0x4d, 0xbf, 0x25, 0x5a, 0x8e, 0x49, 0xc5, 0x62, 0x57, 0xc2, 0x0c, 0x2b, 0x4e, 0x27, + 0xcf, 0x41, 0x7e, 0xc3, 0x5a, 0x12, 0xcd, 0x55, 0x3a, 0x3a, 0xac, 0xe6, 0x7b, 0x81, 0x37, 0x63, + 0x58, 0x0c, 0x4a, 0x66, 0x61, 0x74, 0xbe, 0x36, 0x4f, 0x83, 0x08, 0x9b, 0xa9, 0x5c, 0xbf, 0xc8, + 0x46, 0x4b, 0xd3, 0xb1, 0x9b, 0x34, 0x88, 0xb4, 0xec, 0x05, 0x1a, 0xf9, 0x2c, 0xe4, 0x6b, 0x5b, + 0x0d, 0xd1, 0x32, 0x20, 0x5a, 0xa6, 0xb6, 0xd5, 0xa8, 0x4f, 0x88, 0x86, 0xc8, 0x3b, 0x8f, 0x43, + 0xc6, 0xbd, 0xb6, 0xd5, 0x50, 0x7b, 0x6b, 0xf4, 0x98, 0xde, 0xba, 0x0e, 0x45, 0xa6, 0x67, 0xb0, + 0x05, 0x1e, 0x85, 0x62, 0x89, 0xab, 0x4f, 0x7b, 0x02, 0x66, 0xc5, 0xa9, 0xe4, 0xc5, 0x58, 0x6d, + 0x29, 0x26, 0xfc, 0x84, 0xda, 0x22, 0x95, 0x15, 0xf2, 0x04, 0x26, 0x16, 0x0e, 0x3a, 0x4e, 0xdb, + 0x6b, 0x8a, 0x25, 0xbc, 0x84, 0x4b, 0xf8, 0xcd, 0x63, 0xba, 0xf1, 0xa6, 0x46, 0xc0, 0x57, 0x75, + 0x29, 0x7c, 0x67, 0x5c, 0x9e, 0x66, 0xa7, 0x57, 0xf8, 0x19, 0xc3, 0xd2, 0x33, 0x62, 0x73, 0x49, + 0x8a, 0x48, 0xd4, 0xab, 0x92, 0x61, 0x27, 0xc1, 0xc9, 0x5c, 0x0a, 0x04, 0x44, 0x9d, 0x4b, 0xf1, + 0xa2, 0xfb, 0x0e, 0xe4, 0xef, 0xcd, 0xaf, 0xcd, 0x8c, 0x23, 0x0f, 0x22, 0x78, 0xdc, 0x9b, 0x5f, + 0x9b, 0x6f, 0xf9, 0x3d, 0xb7, 0xf1, 0xc1, 0x72, 0xfd, 0xa2, 0x60, 0x33, 0xb1, 0xdb, 0xec, 0x6a, + 0x25, 0x62, 0x74, 0x64, 0x11, 0x8a, 0xb2, 0x96, 0x33, 0x65, 0xe4, 0x31, 0x9d, 0xaa, 0xfc, 0xe6, + 0x6d, 0x3e, 0xd7, 0x5c, 0xf1, 0xad, 0x96, 0x42, 0xe2, 0x5c, 0xde, 0x02, 0xd2, 0xdf, 0x2e, 0x19, + 0x9a, 0xc4, 0x67, 0x55, 0x4d, 0x62, 0x7c, 0xee, 0xbc, 0xc8, 0x6b, 0xde, 0x6f, 0xb7, 0x9d, 0x8e, + 0x8b, 0xb4, 0x9b, 0x73, 0xaa, 0x82, 0x51, 0x83, 0xc9, 0xa4, 0x20, 0xcb, 0x5e, 0x18, 0x91, 0x59, + 0x28, 0x49, 0x08, 0x5b, 0x44, 0xf2, 0x99, 0x45, 0xb6, 0x12, 0x1c, 0xf3, 0x4f, 0x72, 0x00, 0x49, + 0xca, 0x33, 0x2a, 0x67, 0xbe, 0xa0, 0xc9, 0x99, 0xf3, 0xe9, 0x01, 0x3a, 0x50, 0xc2, 0x90, 0xf7, + 0x60, 0x94, 0xa9, 0x5c, 0x3d, 0xa9, 0x52, 0x5e, 0x4c, 0x93, 0x62, 0xe2, 0xe6, 0xed, 0xfa, 0xa4, + 0x20, 0x1e, 0x0d, 0x11, 0x62, 0x09, 0x32, 0x45, 0x44, 0xfd, 0xcf, 0x42, 0xd2, 0x19, 0x42, 0x38, + 0x5d, 0x57, 0xa4, 0x8b, 0x91, 0xcc, 0x47, 0x29, 0x5d, 0x14, 0xd9, 0x72, 0x89, 0xcb, 0x16, 0xde, + 0xa8, 0x63, 0x42, 0xb6, 0xa4, 0x25, 0x0b, 0x6f, 0xc0, 0x13, 0x25, 0x4b, 0x37, 0x3d, 0x6d, 0x0b, + 0x38, 0x0c, 0xae, 0x67, 0xb6, 0x4a, 0xd6, 0x84, 0xbd, 0x7a, 0xd2, 0x84, 0x4d, 0x4f, 0xd7, 0xdb, + 0x83, 0x64, 0xd9, 0x79, 0x39, 0xbb, 0x9c, 0xc7, 0x2a, 0x39, 0xca, 0xb4, 0xb7, 0xf8, 0xd4, 0x1c, + 0x1d, 0x38, 0x35, 0xcf, 0x67, 0x4e, 0x4d, 0x3e, 0x31, 0xdf, 0x82, 0x91, 0xda, 0x4f, 0xf7, 0x02, + 0x2a, 0x74, 0xbf, 0xb2, 0xcc, 0x93, 0xc1, 0xe2, 0x39, 0x3d, 0xe5, 0xb0, 0x4f, 0x55, 0x67, 0xc6, + 0x74, 0x96, 0xf3, 0xfa, 0x72, 0x43, 0xe8, 0x75, 0x24, 0xd5, 0x2c, 0xeb, 0xcb, 0x4a, 0xb1, 0x23, + 0xad, 0xd6, 0x8c, 0x8a, 0xcc, 0x42, 0xae, 0xb6, 0x80, 0x9b, 0xc5, 0xf1, 0xb9, 0x92, 0xcc, 0x76, + 0xa1, 0x7e, 0x4e, 0x90, 0x94, 0x1d, 0x6d, 0xff, 0x50, 0x5b, 0xf8, 0xe4, 0x26, 0x7f, 0x4b, 0x51, + 0x13, 0xc4, 0x30, 0x65, 0xdb, 0x51, 0x31, 0x58, 0x8c, 0x44, 0x69, 0xe9, 0x1b, 0x2c, 0xf1, 0x50, + 0x79, 0x95, 0x77, 0x5c, 0xae, 0xaf, 0xe3, 0xc6, 0x95, 0x45, 0x08, 0xbb, 0xcb, 0xfc, 0xef, 0x06, + 0xe2, 0x92, 0xd7, 0x60, 0xd4, 0xa2, 0xbb, 0xc9, 0x5a, 0x8b, 0x7b, 0xb6, 0x00, 0x21, 0x6a, 0x06, + 0x1c, 0x07, 0x05, 0x39, 0x75, 0xc3, 0x3d, 0x6f, 0x27, 0x12, 0xb9, 0xc4, 0x82, 0x5c, 0x80, 0x15, + 0x41, 0x2e, 0x20, 0x9a, 0x20, 0x17, 0x30, 0x36, 0xc4, 0xac, 0x85, 0x86, 0x50, 0x26, 0x65, 0x49, + 0xad, 0x05, 0xa5, 0xaf, 0x02, 0x57, 0xeb, 0x2b, 0x6b, 0xa1, 0x41, 0xee, 0x40, 0xa9, 0xd6, 0x6c, + 0xfa, 0x3d, 0x65, 0xd3, 0x33, 0x73, 0x74, 0x58, 0x3d, 0xe7, 0x70, 0xa0, 0xbe, 0x45, 0x4f, 0x50, + 0xcd, 0x7a, 0x52, 0x6a, 0xc6, 0x63, 0xbe, 0xd5, 0x0b, 0x23, 0x1a, 0x2c, 0x2d, 0x88, 0x2a, 0x23, + 0x8f, 0x26, 0x07, 0xa6, 0x78, 0xc4, 0xa8, 0xe6, 0x7f, 0x32, 0xb0, 0xc4, 0xe4, 0x4d, 0x80, 0xa5, + 0x0e, 0x53, 0x6c, 0x9b, 0x34, 0x66, 0x80, 0x9b, 0x67, 0x4f, 0x40, 0x75, 0x0e, 0x0a, 0xb2, 0x9e, + 0x75, 0x6e, 0xe8, 0xac, 0x59, 0x96, 0x52, 0x4d, 0x16, 0x76, 0x14, 0x91, 0x65, 0x20, 0xa0, 0xa9, + 0x2c, 0x13, 0x64, 0x72, 0x0d, 0xc6, 0x96, 0x6a, 0x0f, 0x6b, 0xbd, 0x68, 0x0f, 0xdb, 0xab, 0xc8, + 0x05, 0x96, 0xe7, 0xb4, 0x6d, 0xa7, 0x17, 0xed, 0x59, 0x32, 0xd1, 0xfc, 0x79, 0x03, 0xc6, 0x95, + 0xb9, 0xca, 0x8a, 0xba, 0x16, 0xf8, 0x1f, 0xd2, 0x66, 0xa4, 0xb7, 0x52, 0x97, 0x03, 0x53, 0x45, + 0x8d, 0x51, 0x53, 0xad, 0x93, 0x3b, 0x45, 0xeb, 0x98, 0xb3, 0x42, 0x04, 0xb0, 0x3d, 0x80, 0x62, + 0xe2, 0xc0, 0x3d, 0x00, 0xd3, 0x71, 0xd4, 0x3d, 0x00, 0x4b, 0x37, 0xff, 0xc0, 0x60, 0x53, 0x97, + 0xcc, 0x02, 0x3c, 0xa0, 0x07, 0x91, 0xb3, 0x7d, 0xd7, 0x6b, 0x69, 0xa6, 0xab, 0x7d, 0x84, 0xda, + 0x3b, 0x5e, 0x8b, 0x5a, 0x0a, 0x0a, 0xb9, 0x0d, 0xc5, 0x07, 0xc1, 0xf6, 0x1b, 0x88, 0x9e, 0x8b, + 0x45, 0xf0, 0xd9, 0xfd, 0x60, 0xfb, 0x0d, 0x44, 0x56, 0xc7, 0xab, 0x44, 0x24, 0x26, 0x8c, 0x2e, + 0xf8, 0x6d, 0xc7, 0x93, 0xcb, 0x1e, 0xb0, 0xb5, 0xc3, 0x45, 0x88, 0x25, 0x52, 0x98, 0xd0, 0x6f, + 0xac, 0xad, 0x88, 0x81, 0x89, 0x42, 0x3f, 0xec, 0x76, 0x2c, 0x06, 0x33, 0xbf, 0x6b, 0xc0, 0xb8, + 0x22, 0x91, 0xc8, 0xe7, 0xc5, 0x36, 0xdf, 0x40, 0x23, 0xd5, 0x85, 0x7e, 0x99, 0xc5, 0x52, 0xf9, + 0x72, 0xcd, 0xb6, 0xff, 0x62, 0xd3, 0x9f, 0x48, 0x83, 0xdc, 0x30, 0xd2, 0xe0, 0x4d, 0x00, 0xae, + 0xcb, 0x61, 0x73, 0x2a, 0xe3, 0x46, 0x31, 0xea, 0xa9, 0x9d, 0x91, 0x20, 0x9b, 0xbf, 0x90, 0x83, + 0xa2, 0xd8, 0xab, 0xcc, 0x3d, 0xa3, 0x3a, 0xc4, 0x1b, 0x9a, 0x0e, 0x71, 0x56, 0x90, 0x2a, 0xca, + 0xed, 0xdc, 0x09, 0x7b, 0x94, 0x37, 0xa1, 0x2c, 0x9b, 0x00, 0x55, 0xb1, 0x57, 0x61, 0x4c, 0xee, + 0xb2, 0xb9, 0x22, 0x36, 0xa5, 0xf1, 0xdc, 0x9c, 0xb3, 0x64, 0xba, 0xf9, 0xed, 0x11, 0x49, 0xcb, + 0x73, 0x62, 0x4d, 0x58, 0x73, 0xdd, 0x40, 0x6d, 0x42, 0xc7, 0x75, 0x03, 0x0b, 0xa1, 0xac, 0xa3, + 0xd6, 0x7a, 0xdb, 0x2d, 0xaf, 0x89, 0x38, 0xca, 0xac, 0xe9, 0x22, 0xd4, 0x66, 0xa8, 0x6a, 0x47, + 0x25, 0xc8, 0xda, 0x16, 0x21, 0x7f, 0xec, 0x16, 0xe1, 0x27, 0xa0, 0x34, 0xdf, 0x76, 0x35, 0x15, + 0xc2, 0xcc, 0x68, 0x94, 0x9b, 0x31, 0x12, 0x57, 0x1e, 0xae, 0x88, 0x36, 0x3a, 0xd7, 0x6c, 0xbb, + 0xfd, 0x8a, 0x43, 0xc2, 0x52, 0xd3, 0xf1, 0x47, 0x3e, 0x8e, 0x8e, 0x7f, 0x07, 0x4a, 0x1b, 0x21, + 0x5d, 0xef, 0x75, 0x3a, 0xb4, 0x85, 0xea, 0x44, 0x91, 0xcb, 0x9e, 0x5e, 0x48, 0xed, 0x08, 0xa1, + 0x6a, 0x01, 0x62, 0x54, 0x75, 0x58, 0x8d, 0x1d, 0x33, 0xac, 0x3e, 0x0f, 0x85, 0x5a, 0xb7, 0x2b, + 0x37, 0x3f, 0xf1, 0x22, 0xd9, 0xed, 0xe2, 0xd2, 0x37, 0xe9, 0x74, 0xbb, 0xfa, 0x56, 0x06, 0xb1, + 0x09, 0x05, 0xf2, 0xa0, 0xb7, 0x4d, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0x44, 0x73, 0x38, 0x03, 0xc8, + 0x63, 0x46, 0xda, 0x98, 0xd3, 0x08, 0xb8, 0x71, 0xbd, 0xb8, 0xdf, 0xdb, 0xa6, 0xb6, 0x90, 0xf1, + 0x6a, 0xdb, 0x65, 0x30, 0xbc, 0xdc, 0x80, 0x49, 0xbd, 0xfd, 0x9f, 0x82, 0x62, 0xf1, 0x7e, 0xa1, + 0x58, 0xac, 0x94, 0xcc, 0x5f, 0xca, 0xc1, 0x78, 0xad, 0xdb, 0x7d, 0xc6, 0x2d, 0x10, 0x3f, 0xa6, + 0xcd, 0xea, 0x0b, 0x49, 0xef, 0x9d, 0xc2, 0xf8, 0xf0, 0x57, 0x06, 0x4c, 0xa5, 0x28, 0xd4, 0xd2, + 0x1b, 0x43, 0xee, 0xc8, 0x73, 0x43, 0xee, 0xc8, 0xf3, 0x83, 0x77, 0xe4, 0xea, 0x9c, 0x29, 0x7c, + 0x9c, 0x39, 0xf3, 0x0a, 0xe4, 0x6b, 0xdd, 0xae, 0x68, 0x95, 0x72, 0xd2, 0x2a, 0x9b, 0xb7, 0xf9, + 0x42, 0xe4, 0x74, 0xbb, 0x16, 0xc3, 0x30, 0x5f, 0x87, 0x12, 0x82, 0x51, 0xa2, 0x5d, 0x15, 0x53, + 0x81, 0x8b, 0x33, 0x8d, 0x8c, 0x0f, 0x7b, 0xf3, 0x7f, 0x1b, 0x30, 0x82, 0xdf, 0xcf, 0xe8, 0x70, + 0x99, 0xd3, 0x86, 0x4b, 0x45, 0x19, 0x2e, 0xc3, 0x0c, 0x94, 0x3f, 0xca, 0x63, 0x6b, 0x89, 0x21, + 0x22, 0xf6, 0x74, 0x46, 0xc6, 0x9e, 0xee, 0x63, 0x08, 0xf0, 0xfd, 0xf4, 0xee, 0x2e, 0x8f, 0x9d, + 0xf1, 0x62, 0xba, 0xa8, 0x4f, 0x65, 0x63, 0x77, 0x1f, 0xc8, 0x52, 0x27, 0xa4, 0xcd, 0x5e, 0x40, + 0x1b, 0xfb, 0x5e, 0x77, 0x93, 0x06, 0xde, 0xce, 0x81, 0xd0, 0x0c, 0x51, 0xc6, 0x7a, 0x22, 0xd5, + 0x0e, 0xf7, 0xbd, 0xae, 0xfd, 0x08, 0xd3, 0xad, 0x0c, 0x1a, 0xf2, 0x1e, 0x8c, 0x59, 0xf4, 0x71, + 0xe0, 0x45, 0x54, 0xb4, 0xed, 0x64, 0xbc, 0x0f, 0x40, 0x28, 0xd7, 0x4d, 0x02, 0xfe, 0xa1, 0xf6, + 0xbf, 0x48, 0xff, 0xe4, 0xb6, 0x51, 0xdf, 0x19, 0xc1, 0xb9, 0x70, 0xc2, 0x49, 0xd9, 0x31, 0x1b, + 0x74, 0xbd, 0x33, 0xf3, 0xa7, 0xe9, 0xcc, 0x4d, 0x28, 0xb3, 0xad, 0x5b, 0x6a, 0xa7, 0x7e, 0x25, + 0xe9, 0xcb, 0x9b, 0x6a, 0xf2, 0x71, 0x87, 0x64, 0x1a, 0x1f, 0x62, 0xa7, 0x07, 0x09, 0x3f, 0x7c, + 0x7b, 0x5e, 0x61, 0x9c, 0x31, 0x3c, 0x62, 0xd1, 0xd1, 0xe4, 0x8d, 0x75, 0xea, 0x81, 0x31, 0xfa, + 0xf1, 0x06, 0xc6, 0xd8, 0x47, 0x19, 0x18, 0xe9, 0xe3, 0xc9, 0xe2, 0x69, 0x8e, 0x27, 0x2f, 0xbf, + 0x07, 0xd3, 0x7d, 0x2d, 0x7c, 0x9a, 0x23, 0xbe, 0x4f, 0x6e, 0x58, 0xfe, 0x6c, 0xdc, 0x2e, 0x64, + 0x0e, 0xb7, 0xa3, 0x5e, 0x40, 0x9b, 0x11, 0x8a, 0x5e, 0x21, 0x2d, 0x03, 0x01, 0x4b, 0xed, 0x97, + 0x11, 0x46, 0xde, 0x85, 0x31, 0x7e, 0x44, 0x12, 0xce, 0xe4, 0xb0, 0xef, 0x27, 0x44, 0x8e, 0x1c, + 0x2a, 0xce, 0xa9, 0x39, 0x86, 0xda, 0xaa, 0x82, 0xc8, 0xbc, 0x07, 0xa3, 0xe2, 0x88, 0xe5, 0xf8, + 0x79, 0x51, 0x85, 0x91, 0xcd, 0xa4, 0x65, 0xd0, 0x2c, 0xce, 0x2b, 0x61, 0x71, 0xb8, 0xf9, 0x2b, + 0x06, 0x4c, 0xea, 0xb5, 0x24, 0x37, 0x61, 0x54, 0x9c, 0x01, 0x1a, 0x78, 0x06, 0xc8, 0x6a, 0x33, + 0xca, 0x4f, 0xff, 0xb4, 0x33, 0x3f, 0x81, 0xc5, 0x44, 0xbf, 0xe0, 0x80, 0x75, 0x11, 0xa2, 0x5f, + 0x0c, 0x52, 0x4b, 0xa6, 0xb1, 0x2d, 0x97, 0x45, 0xc3, 0x5e, 0x2b, 0x52, 0xb7, 0x5c, 0x01, 0x42, + 0x2c, 0x91, 0x62, 0x1e, 0x1a, 0x00, 0x8d, 0xc6, 0xfd, 0x07, 0xf4, 0x60, 0xcd, 0xf1, 0x02, 0xdc, + 0xb6, 0xe2, 0x6c, 0x7c, 0x20, 0x7a, 0xab, 0x2c, 0xb6, 0xad, 0x7c, 0xe6, 0xee, 0xd3, 0x03, 0x6d, + 0xdb, 0x2a, 0x51, 0x71, 0xca, 0x07, 0xde, 0x23, 0x27, 0xa2, 0x8c, 0x30, 0x87, 0x84, 0x7c, 0xca, + 0x73, 0x68, 0x8a, 0x52, 0x41, 0x26, 0x5f, 0x87, 0xc9, 0xe4, 0x0b, 0x1d, 0x0f, 0xf2, 0xb8, 0xa7, + 0x93, 0x23, 0x42, 0x4f, 0xac, 0xbf, 0x70, 0x74, 0x58, 0xbd, 0xac, 0x70, 0xb5, 0x19, 0x96, 0xc2, + 0x3a, 0xc5, 0xcc, 0xfc, 0x3d, 0x03, 0x60, 0x7d, 0xb9, 0x21, 0x2b, 0x78, 0x0d, 0x0a, 0xb1, 0x35, + 0xa8, 0xcc, 0xf7, 0xc6, 0xa9, 0xcd, 0x1f, 0xa6, 0x93, 0x17, 0x21, 0x9f, 0xd4, 0x64, 0xfa, 0xe8, + 0xb0, 0x3a, 0xa1, 0xd7, 0x80, 0xa5, 0x92, 0x7b, 0x30, 0x36, 0x54, 0x99, 0x71, 0x74, 0x66, 0x94, + 0x55, 0x52, 0x63, 0x2f, 0xbc, 0xbf, 0xb5, 0xfe, 0xe9, 0xed, 0x85, 0x6f, 0xe6, 0x60, 0x8a, 0xb5, + 0x6b, 0xad, 0x17, 0xed, 0xf9, 0x81, 0x17, 0x1d, 0x3c, 0xb3, 0xbb, 0xe2, 0xb7, 0x35, 0x85, 0xe8, + 0xb2, 0x14, 0x5b, 0x6a, 0xdd, 0x86, 0xda, 0x1c, 0xff, 0xc5, 0x18, 0x9c, 0xcd, 0xa0, 0x22, 0xaf, + 0x09, 0xef, 0x9b, 0xc4, 0x66, 0x84, 0xde, 0x35, 0x3f, 0x3c, 0xac, 0x96, 0x25, 0xfa, 0x7a, 0xe2, + 0x6d, 0x33, 0x07, 0xe3, 0x62, 0xeb, 0xb3, 0x92, 0x68, 0xd4, 0xe8, 0xb6, 0x21, 0x6d, 0x62, 0x28, + 0x9a, 0x54, 0x24, 0x52, 0x83, 0xf2, 0xfc, 0x1e, 0x6d, 0xee, 0x7b, 0x9d, 0xdd, 0x07, 0xf4, 0x80, + 0xeb, 0x4b, 0xe5, 0xfa, 0xf3, 0x6c, 0xa7, 0xd5, 0x14, 0x70, 0xd6, 0xa5, 0xfa, 0x26, 0x4e, 0x23, + 0x21, 0xef, 0xc2, 0x78, 0xc3, 0xdb, 0xed, 0x48, 0x0e, 0x05, 0xe4, 0x70, 0xe5, 0xe8, 0xb0, 0x7a, + 0x21, 0xe4, 0xe0, 0x7e, 0x06, 0x2a, 0x01, 0x79, 0x15, 0x46, 0x2c, 0xbf, 0x45, 0xf9, 0x32, 0x2c, + 0xfc, 0x39, 0x02, 0x06, 0x50, 0x6d, 0xd3, 0x88, 0x41, 0xee, 0xc3, 0x18, 0xfb, 0xf3, 0xd0, 0xe9, + 0xce, 0x8c, 0xa2, 0xdc, 0x26, 0xb1, 0x82, 0x8f, 0xd0, 0xae, 0xd7, 0xd9, 0x55, 0x75, 0xfc, 0x16, + 0xb5, 0xdb, 0x4e, 0x57, 0x5b, 0x17, 0x39, 0x22, 0xd9, 0x84, 0xf1, 0x44, 0x10, 0x84, 0x33, 0x63, + 0xda, 0x59, 0x50, 0x92, 0x52, 0xff, 0x8c, 0x60, 0x76, 0x31, 0x6a, 0x85, 0x38, 0xb6, 0xbb, 0x0c, + 0x5f, 0xaf, 0x8c, 0xc2, 0x48, 0xdb, 0x83, 0x14, 0x07, 0xef, 0x41, 0x8c, 0x13, 0xf7, 0x20, 0x2e, + 0x80, 0x68, 0xa4, 0x5a, 0x6b, 0x57, 0xb8, 0x5f, 0xbd, 0x3a, 0x78, 0x80, 0xdd, 0x4c, 0x90, 0x71, + 0x4e, 0x72, 0xcb, 0x94, 0x68, 0x7f, 0xa7, 0xb5, 0xab, 0x59, 0xa6, 0x62, 0x54, 0xd6, 0x0c, 0x89, + 0xa8, 0x91, 0x3b, 0x70, 0xd9, 0x0c, 0x49, 0x4a, 0xd2, 0x0c, 0x1f, 0x3e, 0x8e, 0x06, 0x35, 0x83, + 0xc2, 0x88, 0xac, 0x00, 0xd4, 0x9a, 0x91, 0xf7, 0x88, 0xe2, 0x90, 0x18, 0xd7, 0x1a, 0x62, 0xbe, + 0xf6, 0x80, 0x1e, 0x34, 0x68, 0x14, 0x7b, 0x36, 0x9c, 0x77, 0x10, 0x35, 0x35, 0x4c, 0x2c, 0x85, + 0x03, 0xe9, 0xc2, 0xf9, 0x9a, 0xeb, 0x7a, 0xdc, 0x25, 0x6f, 0x3d, 0x60, 0xe3, 0xd7, 0x45, 0xd6, + 0xe5, 0x6c, 0xd6, 0xaf, 0x0a, 0xd6, 0x9f, 0x71, 0x62, 0x2a, 0x3b, 0xe2, 0x64, 0xe9, 0x6c, 0xb2, + 0x19, 0x9b, 0xab, 0x30, 0xa9, 0x37, 0xa9, 0xee, 0x8c, 0x56, 0x86, 0xa2, 0xd5, 0xa8, 0xd9, 0x8d, + 0xfb, 0xb5, 0x5b, 0x15, 0x83, 0x54, 0xa0, 0x2c, 0xbe, 0xe6, 0xec, 0xb9, 0x37, 0xee, 0x54, 0x72, + 0x1a, 0xe4, 0x8d, 0x5b, 0x73, 0x95, 0xbc, 0xf9, 0x47, 0x06, 0x14, 0x65, 0xf9, 0xc8, 0x1d, 0xc8, + 0x37, 0x1a, 0xf7, 0x53, 0x47, 0x90, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53, 0x17, 0x99, + 0x46, 0xe3, 0x3e, 0xa3, 0x5b, 0x5f, 0x6e, 0x08, 0xa5, 0x25, 0x63, 0xb8, 0x4e, 0x0f, 0x38, 0x97, + 0xb9, 0x03, 0xf9, 0xf7, 0xb7, 0xd6, 0xc5, 0x6e, 0x28, 0xa3, 0x7f, 0x91, 0xee, 0xc3, 0xc7, 0xea, + 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x95, 0x88, 0xb6, 0x1f, 0xbb, 0x69, 0x09, + 0x25, 0x82, 0x41, 0x2c, 0x91, 0xc2, 0x74, 0x9e, 0x65, 0xbf, 0xe9, 0xb4, 0x84, 0x36, 0x82, 0x3a, + 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xd8, 0x80, 0xca, 0x5a, 0xe0, 0x3f, 0xf2, 0x98, 0x04, + 0x5e, 0xf7, 0xf7, 0x69, 0x67, 0xf3, 0x16, 0x79, 0x5d, 0x0a, 0x01, 0xae, 0xc2, 0x5d, 0x64, 0x54, + 0x28, 0x04, 0x7e, 0x78, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x4b, 0x97, 0x82, 0x40, 0xf1, + 0x76, 0xcb, 0x0d, 0xef, 0x41, 0x73, 0x82, 0xb7, 0x5b, 0x15, 0x46, 0xb0, 0x38, 0x8a, 0x13, 0xc3, + 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x02, 0xfb, 0xdb, 0xb9, 0xbe, 0x3a, 0xcc, 0x7d, 0xaa, 0xbc, + 0x50, 0xf4, 0xca, 0x0d, 0xb5, 0x88, 0x7d, 0x05, 0xce, 0xa5, 0x9b, 0x04, 0xed, 0x22, 0x35, 0x98, + 0xd2, 0xe1, 0xd2, 0x44, 0x72, 0x31, 0x33, 0xaf, 0xcd, 0x39, 0x2b, 0x8d, 0x6f, 0x7e, 0xdf, 0x80, + 0x12, 0xfe, 0xb5, 0x7a, 0x2d, 0xca, 0x34, 0x9b, 0xda, 0x56, 0x43, 0x1c, 0x48, 0xa9, 0x87, 0x46, + 0xce, 0xe3, 0xd0, 0x16, 0xa7, 0x57, 0x9a, 0x1c, 0x89, 0x91, 0x05, 0x29, 0x3f, 0x7e, 0x0b, 0xc5, + 0x08, 0x8d, 0x49, 0xf9, 0x39, 0x5d, 0x98, 0x22, 0x15, 0xc8, 0xac, 0xff, 0xd8, 0x97, 0xdf, 0x92, + 0xa6, 0x61, 0xec, 0x3f, 0xa4, 0xf3, 0xb5, 0x63, 0x0e, 0x89, 0x46, 0x5e, 0x87, 0x51, 0x96, 0xb5, + 0x25, 0x0f, 0x31, 0x70, 0x57, 0x81, 0x65, 0x0c, 0xb4, 0xd3, 0x40, 0x8e, 0x64, 0xfe, 0xb3, 0x5c, + 0xba, 0x01, 0x85, 0x16, 0x70, 0xca, 0xb9, 0xf1, 0x16, 0x8c, 0xd4, 0x5a, 0x2d, 0xff, 0xb1, 0x90, + 0x12, 0xd2, 0x4c, 0x13, 0xb7, 0x1f, 0x5f, 0x61, 0x1d, 0x86, 0xa2, 0x9d, 0xfe, 0x32, 0x00, 0x99, + 0x87, 0x52, 0x6d, 0xab, 0xb1, 0xb4, 0xb4, 0xb0, 0xbe, 0xbe, 0x2c, 0x9c, 0x8c, 0x5f, 0x96, 0xed, + 0xe3, 0x79, 0xae, 0x1d, 0x45, 0xad, 0x01, 0x3e, 0x88, 0x09, 0x1d, 0x79, 0x07, 0xe0, 0x7d, 0xdf, + 0xeb, 0x3c, 0xa4, 0xd1, 0x9e, 0xef, 0x8a, 0xca, 0x33, 0x95, 0x62, 0xfc, 0x43, 0xdf, 0xeb, 0xd8, + 0x6d, 0x04, 0xb3, 0xb2, 0x27, 0x48, 0x96, 0xf2, 0x9f, 0xb5, 0x74, 0xdd, 0x8f, 0x50, 0x87, 0x19, + 0x49, 0x5a, 0x7a, 0xdb, 0x8f, 0xd2, 0x67, 0x2c, 0x12, 0xcd, 0xfc, 0xd5, 0x1c, 0x4c, 0xf2, 0x9d, + 0x2a, 0x1f, 0x30, 0xcf, 0xec, 0x64, 0x7c, 0x4b, 0x9b, 0x8c, 0x97, 0xe4, 0xc2, 0xa0, 0x54, 0x6d, + 0xa8, 0xa9, 0xb8, 0x07, 0xa4, 0x9f, 0x86, 0x58, 0xd2, 0x9e, 0x32, 0xcc, 0x2c, 0xbc, 0x95, 0x9c, + 0x1d, 0x87, 0x48, 0x64, 0xa3, 0x28, 0x0c, 0x2d, 0x8d, 0x87, 0xf9, 0x2b, 0x39, 0x98, 0x50, 0xf4, + 0xc9, 0x67, 0xb6, 0xe1, 0xbf, 0xa8, 0x35, 0xbc, 0x3c, 0x83, 0x50, 0x6a, 0x36, 0x54, 0xbb, 0xf7, + 0x60, 0xba, 0x8f, 0x24, 0xad, 0x96, 0x1b, 0xc3, 0xa8, 0xe5, 0xaf, 0xf5, 0x1f, 0x6e, 0x73, 0x87, + 0xe4, 0xf8, 0x70, 0x5b, 0x3d, 0x4d, 0xff, 0x66, 0x0e, 0xce, 0x89, 0xaf, 0x5a, 0xcf, 0xf5, 0xa2, + 0x79, 0xbf, 0xb3, 0xe3, 0xed, 0x3e, 0xb3, 0x7d, 0x51, 0xd3, 0xfa, 0xa2, 0xaa, 0xf7, 0x85, 0x52, + 0xc1, 0xc1, 0x5d, 0x62, 0xfe, 0xcb, 0x22, 0xcc, 0x0c, 0x22, 0x60, 0xdb, 0x7e, 0x65, 0x57, 0x85, + 0xdb, 0xfe, 0xd4, 0x8e, 0x95, 0xef, 0xa7, 0x12, 0x67, 0x8e, 0xdc, 0x10, 0xce, 0x1c, 0xcb, 0x50, + 0xc1, 0xac, 0x1a, 0x34, 0x64, 0x8d, 0x10, 0x26, 0xde, 0x90, 0x57, 0x8f, 0x0e, 0xab, 0x57, 0x1c, + 0x96, 0x66, 0x87, 0x22, 0xd1, 0xee, 0x05, 0x9e, 0xc2, 0xa3, 0x8f, 0x92, 0xfc, 0x9e, 0x01, 0x93, + 0x08, 0x5c, 0x7c, 0x44, 0x3b, 0x11, 0x32, 0x2b, 0x88, 0x43, 0x9a, 0xf8, 0xd2, 0x49, 0x23, 0x0a, + 0xbc, 0xce, 0x2e, 0x1a, 0x92, 0xc2, 0xfa, 0x36, 0x6b, 0x85, 0x3f, 0x3f, 0xac, 0xbe, 0xfd, 0x51, + 0x2e, 0xb2, 0x08, 0x56, 0x21, 0xdb, 0xc8, 0xf3, 0x82, 0x52, 0xcc, 0x36, 0x55, 0xcc, 0x54, 0x89, + 0xc8, 0x8f, 0xc3, 0xc5, 0xc5, 0x8e, 0xb3, 0xdd, 0xa2, 0xf3, 0x7e, 0x27, 0xf2, 0x3a, 0x3d, 0xbf, + 0x17, 0xd6, 0x9d, 0xe6, 0x7e, 0xaf, 0x1b, 0x0a, 0x63, 0x27, 0xd6, 0xbc, 0x19, 0x27, 0xda, 0xdb, + 0x3c, 0x55, 0x61, 0x39, 0x88, 0x01, 0xb9, 0x0f, 0xd3, 0x3c, 0xa9, 0xd6, 0x8b, 0xfc, 0x46, 0xd3, + 0x69, 0x79, 0x9d, 0x5d, 0xb4, 0x81, 0x16, 0xeb, 0x97, 0xd9, 0xde, 0xd2, 0xe9, 0x45, 0xbe, 0x1d, + 0x72, 0xb8, 0xc2, 0xaf, 0x9f, 0x88, 0x2c, 0xc1, 0x94, 0x45, 0x1d, 0xf7, 0xa1, 0xf3, 0x64, 0xde, + 0xe9, 0x3a, 0x4d, 0x2f, 0x3a, 0xc0, 0x9d, 0x59, 0xbe, 0x5e, 0x3d, 0x3a, 0xac, 0x3e, 0x17, 0x50, + 0xc7, 0xb5, 0xdb, 0xce, 0x13, 0xbb, 0x29, 0x12, 0x15, 0x66, 0x69, 0xba, 0x98, 0x95, 0xd7, 0x89, + 0x59, 0x95, 0xd2, 0xac, 0xbc, 0xce, 0x60, 0x56, 0x09, 0x9d, 0x64, 0xb5, 0xee, 0x04, 0xbb, 0x34, + 0xe2, 0x46, 0x42, 0xb8, 0x6a, 0x5c, 0x37, 0x14, 0x56, 0x11, 0xa6, 0xd9, 0x68, 0x30, 0x4c, 0xb3, + 0x52, 0xe8, 0xd8, 0xc8, 0xdb, 0x0a, 0xbc, 0x88, 0xaa, 0x35, 0x1c, 0xc7, 0x62, 0x61, 0xfb, 0xa3, + 0x99, 0x74, 0x50, 0x15, 0xfb, 0x28, 0x13, 0x6e, 0x4a, 0x25, 0xcb, 0x7d, 0xdc, 0xb2, 0x6b, 0xd9, + 0x47, 0x19, 0x73, 0x53, 0xeb, 0x39, 0x81, 0xf5, 0x54, 0xb8, 0x0d, 0xa8, 0x68, 0x1f, 0x25, 0x59, + 0x61, 0x8d, 0x16, 0xd1, 0x0e, 0x1b, 0xd1, 0xc2, 0x48, 0x3a, 0x89, 0x45, 0x7b, 0x49, 0xec, 0xa9, + 0x2b, 0x81, 0x4c, 0xb6, 0x33, 0x4c, 0xa6, 0x69, 0xe2, 0xf7, 0x0b, 0xc5, 0x91, 0xca, 0xa8, 0x55, + 0xe1, 0x43, 0x3e, 0x62, 0x03, 0x07, 0x65, 0xb1, 0xf9, 0x5b, 0x39, 0xb8, 0x24, 0xc5, 0x31, 0x8d, + 0x1e, 0xfb, 0xc1, 0xbe, 0xd7, 0xd9, 0x7d, 0xc6, 0xa5, 0xea, 0x5d, 0x4d, 0xaa, 0xbe, 0x94, 0x5a, + 0xe1, 0x52, 0xb5, 0x3c, 0x46, 0xb4, 0xfe, 0xd9, 0x08, 0x3c, 0x7f, 0x2c, 0x15, 0xf9, 0x80, 0xad, + 0x82, 0x1e, 0xed, 0x44, 0x4b, 0x6e, 0x8b, 0xb2, 0x6d, 0x98, 0xdf, 0x8b, 0x84, 0x31, 0xfb, 0xc5, + 0xa3, 0xc3, 0xea, 0x59, 0x7e, 0x17, 0xc3, 0xf6, 0xdc, 0x16, 0xb5, 0x23, 0x9e, 0xac, 0x75, 0x53, + 0x3f, 0x35, 0x63, 0x19, 0xdf, 0x0c, 0x5b, 0xea, 0x44, 0x34, 0x78, 0xe4, 0x70, 0x97, 0x74, 0xc1, + 0x72, 0x9f, 0xd2, 0xae, 0xed, 0xb0, 0x54, 0xdb, 0x13, 0xc9, 0x3a, 0xcb, 0x3e, 0x6a, 0x72, 0x57, + 0x61, 0x39, 0xcf, 0x36, 0x07, 0x0f, 0x9d, 0x27, 0x42, 0xe3, 0x45, 0xfb, 0xaa, 0xc2, 0x92, 0xfb, + 0xc3, 0xb5, 0x9d, 0x27, 0x56, 0x3f, 0x09, 0xf9, 0x3a, 0x9c, 0x17, 0x82, 0x9b, 0x09, 0xb1, 0xc0, + 0x6f, 0xc9, 0x1a, 0x17, 0x90, 0xd7, 0x2b, 0x47, 0x87, 0xd5, 0x8b, 0x42, 0xec, 0xdb, 0x4d, 0x8e, + 0x91, 0x59, 0xeb, 0x6c, 0x2e, 0x64, 0x9d, 0x2d, 0x64, 0xa9, 0xe6, 0x78, 0x48, 0xc3, 0xd0, 0xd9, + 0x95, 0xda, 0x31, 0x3f, 0x51, 0x52, 0x1a, 0xd3, 0x6e, 0xf3, 0x74, 0x6b, 0x20, 0x25, 0xb9, 0x0f, + 0x93, 0x5b, 0x74, 0x5b, 0xed, 0x9f, 0xd1, 0x78, 0x8a, 0x57, 0x1e, 0xd3, 0xed, 0xc1, 0x9d, 0x93, + 0xa2, 0x23, 0x1e, 0x4c, 0xaf, 0x05, 0xfe, 0x93, 0x03, 0xb6, 0xd5, 0xa3, 0x1d, 0x1a, 0xa0, 0x23, + 0xd6, 0x18, 0x9a, 0xab, 0x66, 0x12, 0xcd, 0x52, 0x4f, 0xaf, 0x7f, 0xe6, 0xe8, 0xb0, 0xfa, 0x7c, + 0x97, 0x81, 0xed, 0x96, 0x80, 0xdb, 0xa9, 0x8b, 0x59, 0xfd, 0x5c, 0xc9, 0x4f, 0xc2, 0x94, 0xe5, + 0xf7, 0x22, 0xaf, 0xb3, 0xdb, 0x88, 0x02, 0x27, 0xa2, 0xbb, 0x5c, 0x90, 0x27, 0x1e, 0x5f, 0xa9, + 0x54, 0x6e, 0x98, 0x0e, 0x38, 0xd0, 0x0e, 0x05, 0x54, 0x93, 0xa4, 0x3a, 0x81, 0xf9, 0x1b, 0x39, + 0x98, 0x11, 0xdd, 0x60, 0xd1, 0xa6, 0x1f, 0xb8, 0xcf, 0xfe, 0xb4, 0x5f, 0xd4, 0xa6, 0xfd, 0x8b, + 0xb1, 0x8f, 0x52, 0x56, 0x25, 0x8f, 0x99, 0xf5, 0x7f, 0x68, 0xc0, 0x95, 0xe3, 0x88, 0x58, 0xeb, + 0xc4, 0x3e, 0x78, 0xa5, 0x3e, 0x5f, 0xbb, 0x2e, 0x9c, 0xc5, 0xfe, 0x44, 0xc3, 0x71, 0x78, 0xdf, + 0x0f, 0x23, 0xb4, 0xde, 0xe5, 0x34, 0x47, 0x82, 0xba, 0xef, 0xb7, 0x50, 0xce, 0xd7, 0x5f, 0x63, + 0xe2, 0xfc, 0xcf, 0x0f, 0xab, 0xc0, 0x40, 0xab, 0x78, 0x18, 0xc9, 0xd6, 0x7c, 0x3e, 0x62, 0xd0, + 0x2e, 0x1d, 0xda, 0xe8, 0xfd, 0xb1, 0x4f, 0x0f, 0x42, 0x2b, 0x8b, 0x35, 0x5a, 0x68, 0x6a, 0xbd, + 0x68, 0x6f, 0x2d, 0xa0, 0x3b, 0x34, 0xa0, 0x9d, 0x26, 0xfd, 0x94, 0x59, 0x68, 0xf4, 0xca, 0x0d, + 0xb5, 0x3d, 0xf9, 0xcb, 0x31, 0x38, 0x97, 0x45, 0xc6, 0xda, 0x45, 0xd1, 0x88, 0xd3, 0xb7, 0x78, + 0xff, 0x7f, 0x03, 0xca, 0x0d, 0xda, 0xf4, 0x3b, 0xee, 0x5d, 0xa7, 0x19, 0xf9, 0xd2, 0x25, 0xc3, + 0xe6, 0x92, 0x8d, 0xc1, 0xed, 0x1d, 0x4c, 0xd0, 0x2c, 0x03, 0x5f, 0x1a, 0x4e, 0x11, 0x6d, 0xfa, + 0xe8, 0xb4, 0x1a, 0xb1, 0x31, 0x99, 0x64, 0x81, 0xa7, 0x1a, 0x5a, 0xa6, 0xa4, 0x0e, 0x13, 0xf3, + 0x7e, 0xa7, 0x43, 0xd9, 0x87, 0xe2, 0x82, 0x79, 0xe5, 0xe8, 0xb0, 0x3a, 0xd3, 0x94, 0x09, 0x69, + 0x0b, 0x81, 0x4e, 0x42, 0x6e, 0x43, 0x7e, 0x63, 0xee, 0xae, 0xe8, 0x03, 0xe9, 0xac, 0xb6, 0x31, + 0x77, 0x17, 0xf7, 0xba, 0x4c, 0x7f, 0x98, 0xe8, 0xcd, 0xed, 0xa8, 0x36, 0xd0, 0x8d, 0xb9, 0xbb, + 0x64, 0x15, 0xa6, 0x2d, 0xfa, 0x53, 0x3d, 0x2f, 0xa0, 0x62, 0x02, 0x3c, 0xbc, 0x5b, 0xc3, 0xbe, + 0x28, 0x72, 0x39, 0x16, 0xf0, 0x44, 0xa9, 0xdb, 0xdb, 0xed, 0x1d, 0xf5, 0xe6, 0x5a, 0x3f, 0x2d, + 0xf9, 0x39, 0x38, 0xbf, 0xe0, 0x85, 0xa2, 0xcc, 0xdc, 0xf8, 0xe8, 0xe2, 0x39, 0xe4, 0xe8, 0x80, + 0xe9, 0xf0, 0x85, 0xcc, 0xe9, 0xf0, 0x19, 0x37, 0x66, 0x62, 0x73, 0xcb, 0xa6, 0x9b, 0xf6, 0x5d, + 0xcd, 0xce, 0x87, 0x7c, 0x08, 0x93, 0x68, 0xed, 0x41, 0x7b, 0x2c, 0xba, 0x33, 0x8f, 0x0d, 0xc8, + 0xf9, 0x73, 0x99, 0x39, 0x5f, 0x46, 0xe3, 0x91, 0x8d, 0x56, 0x5d, 0x74, 0x7d, 0xd6, 0xf6, 0x08, + 0x1a, 0x67, 0xf2, 0x3e, 0x4c, 0x89, 0x45, 0x67, 0x75, 0x67, 0x7d, 0x8f, 0x2e, 0x38, 0x07, 0xc2, + 0x09, 0x01, 0xf5, 0x3f, 0xb1, 0x52, 0xd9, 0xfe, 0x8e, 0x1d, 0xed, 0x51, 0xdb, 0x75, 0x34, 0xf1, + 0x9c, 0x22, 0x24, 0x3f, 0x03, 0xe3, 0xcb, 0x3e, 0x1e, 0x3c, 0xa1, 0xa8, 0x29, 0x21, 0x9f, 0xaf, + 0xe0, 0xcd, 0x55, 0x0e, 0x4e, 0x2d, 0x22, 0x3f, 0x3c, 0xac, 0xbe, 0x75, 0xda, 0x51, 0xa8, 0x64, + 0x60, 0xa9, 0xb9, 0x91, 0x79, 0x28, 0x6e, 0xd1, 0x6d, 0x56, 0xdb, 0xf4, 0xad, 0x2b, 0x09, 0xe6, + 0xf2, 0xe2, 0xb1, 0xf8, 0x52, 0x4f, 0x75, 0x24, 0x06, 0x09, 0x60, 0x1a, 0xdb, 0x67, 0xcd, 0x09, + 0xc3, 0xc7, 0x7e, 0xe0, 0xb6, 0x68, 0x28, 0x8f, 0x47, 0xfa, 0x1b, 0x7f, 0x2e, 0xb3, 0xf1, 0xaf, + 0xf0, 0xc6, 0xef, 0x2a, 0x1c, 0xd4, 0xe1, 0xd6, 0xc7, 0xde, 0xfc, 0xe7, 0x06, 0x8e, 0x7a, 0x72, + 0x03, 0x9d, 0xcf, 0x62, 0x0f, 0x74, 0xdc, 0xcd, 0x3a, 0xdd, 0xae, 0xee, 0x43, 0xce, 0x51, 0xd8, + 0xd6, 0xf7, 0xae, 0xd3, 0xa4, 0x91, 0xb4, 0x91, 0x22, 0xf2, 0x0e, 0x42, 0xd4, 0xad, 0x2f, 0xc7, + 0x21, 0x5f, 0x86, 0x73, 0x0b, 0xf4, 0x91, 0xd7, 0xa4, 0xb5, 0x28, 0xa2, 0x21, 0x6f, 0xe1, 0xf9, + 0x1a, 0x3f, 0x4c, 0x2c, 0xd5, 0x5f, 0x3a, 0x3a, 0xac, 0x5e, 0x75, 0x31, 0xdd, 0x76, 0x12, 0x04, + 0xbb, 0xe9, 0xa8, 0xbc, 0x32, 0x39, 0x98, 0xff, 0xcb, 0x48, 0x5a, 0x9d, 0xbc, 0x02, 0x05, 0x6b, + 0x2d, 0x2e, 0x3f, 0x3f, 0x27, 0x4c, 0x15, 0x1f, 0x11, 0xc8, 0x57, 0xe1, 0xbc, 0xc2, 0x07, 0x5b, + 0x84, 0xba, 0xac, 0x40, 0xbc, 0x32, 0x2f, 0xe3, 0xc1, 0x90, 0x52, 0x12, 0x87, 0x63, 0xa4, 0x4a, + 0x94, 0xcd, 0x83, 0x55, 0x56, 0x49, 0x58, 0xa0, 0x1d, 0x8f, 0xf3, 0x56, 0x2a, 0xab, 0xf2, 0x76, + 0x11, 0x21, 0x5d, 0xd9, 0x2c, 0x0e, 0xef, 0x17, 0x8a, 0x85, 0xca, 0x88, 0xf9, 0x57, 0x86, 0x12, + 0x76, 0xe0, 0x19, 0x5d, 0xb1, 0xee, 0x68, 0x2b, 0xd6, 0x39, 0x41, 0x1a, 0xd7, 0x8a, 0xa5, 0x65, + 0x6a, 0x19, 0x53, 0x30, 0xa1, 0x21, 0xa1, 0x9b, 0xed, 0x46, 0x48, 0x03, 0x6e, 0x93, 0xfc, 0x74, + 0xb9, 0xd9, 0xc6, 0xf5, 0x1a, 0xca, 0x7b, 0xf2, 0x2f, 0x0c, 0x98, 0x4a, 0x51, 0xb0, 0xd6, 0x60, + 0x20, 0xb5, 0x35, 0x7a, 0x21, 0x0d, 0x2c, 0x84, 0x72, 0xa7, 0xbc, 0x65, 0xdd, 0x29, 0xaf, 0x65, + 0x31, 0x18, 0xf9, 0x12, 0x8c, 0x6c, 0xe0, 0x0e, 0x42, 0xf7, 0xeb, 0x88, 0xf9, 0x63, 0x22, 0x9f, + 0x61, 0x3d, 0xf6, 0x57, 0x15, 0x10, 0x98, 0x46, 0x1a, 0x30, 0x36, 0x1f, 0x50, 0x0c, 0x30, 0x50, + 0x18, 0xfe, 0x00, 0xae, 0xc9, 0x49, 0xd2, 0x07, 0x70, 0x82, 0x93, 0xf9, 0xeb, 0x39, 0x20, 0x49, + 0x1d, 0x69, 0x33, 0xa0, 0x51, 0xf8, 0xcc, 0x76, 0xfa, 0x7b, 0x5a, 0xa7, 0x3f, 0xdf, 0xd7, 0xe9, + 0xbc, 0x7a, 0x43, 0xf5, 0xfd, 0x1f, 0x1b, 0x70, 0x21, 0x9b, 0x90, 0xbc, 0x08, 0xa3, 0xab, 0xeb, + 0x6b, 0xd2, 0x35, 0x48, 0x54, 0xc5, 0xef, 0xa2, 0x66, 0x6c, 0x89, 0x24, 0xf2, 0x3a, 0x8c, 0x7e, + 0x60, 0xcd, 0xb3, 0x25, 0x53, 0xb9, 0xe9, 0xf2, 0x53, 0x81, 0xdd, 0xd4, 0xb7, 0x5c, 0x02, 0x49, + 0xed, 0xdb, 0xfc, 0x53, 0xeb, 0xdb, 0x6f, 0xe6, 0x60, 0xaa, 0xd6, 0x6c, 0xd2, 0x30, 0x64, 0x0a, + 0x11, 0x0d, 0xa3, 0x67, 0xb6, 0x63, 0xb3, 0x9d, 0x7e, 0xb4, 0xba, 0x0d, 0xd5, 0xab, 0x7f, 0x62, + 0xc0, 0x79, 0x49, 0xf5, 0xc8, 0xa3, 0x8f, 0xd7, 0xf7, 0x02, 0x1a, 0xee, 0xf9, 0x2d, 0x77, 0xd8, + 0x3b, 0x5b, 0xb8, 0x4a, 0x7b, 0xad, 0x88, 0x06, 0xaa, 0x81, 0x7a, 0x07, 0x21, 0xda, 0x2a, 0x8d, + 0x10, 0x32, 0x0b, 0x63, 0xb5, 0x6e, 0x37, 0xf0, 0x1f, 0xf1, 0x69, 0x3f, 0x21, 0xce, 0x23, 0x39, + 0x48, 0x3b, 0xbf, 0xe4, 0x20, 0x56, 0x8c, 0x05, 0xda, 0xe1, 0x1e, 0xcd, 0x13, 0xbc, 0x18, 0x2e, + 0xed, 0xa8, 0x1a, 0x1a, 0xa6, 0x9b, 0xdf, 0x28, 0x40, 0x59, 0xad, 0x08, 0x31, 0x61, 0x94, 0xbb, + 0xa7, 0xa8, 0x6e, 0x02, 0x0e, 0x42, 0x2c, 0x91, 0x92, 0x78, 0xfd, 0xe4, 0x4e, 0xf4, 0xfa, 0xd9, + 0x82, 0x89, 0xb5, 0xc0, 0xef, 0xfa, 0x21, 0x75, 0x79, 0x8c, 0x18, 0x2e, 0xb5, 0xce, 0xc6, 0xae, + 0xb0, 0xbc, 0xcd, 0x59, 0x12, 0xdf, 0x0e, 0x74, 0x05, 0xb6, 0x9d, 0x8e, 0x20, 0xa3, 0xf3, 0xe1, + 0x06, 0x7e, 0x27, 0x14, 0xd7, 0x05, 0x62, 0x03, 0x3f, 0x83, 0xe8, 0x06, 0x7e, 0x06, 0x51, 0xa7, + 0xc5, 0xc8, 0xd3, 0x9a, 0x16, 0xe4, 0xd7, 0x0d, 0x18, 0xaf, 0x75, 0x3a, 0xc2, 0xeb, 0x47, 0x5e, + 0xb4, 0x3e, 0x9f, 0x18, 0xf9, 0xb9, 0x5b, 0x28, 0xb7, 0xf1, 0x7f, 0x4d, 0xd8, 0xf8, 0xdf, 0xfa, + 0x48, 0x36, 0xfe, 0xf5, 0xc0, 0xf1, 0xa2, 0x10, 0x0f, 0x73, 0x93, 0x0c, 0x55, 0xd7, 0x5f, 0xa5, + 0x1c, 0xe4, 0x2d, 0xa8, 0xc4, 0xe3, 0x71, 0xa9, 0xe3, 0xd2, 0x27, 0x94, 0x3b, 0x49, 0x4d, 0xf0, + 0xdb, 0x80, 0xda, 0xe1, 0x45, 0x1a, 0xd1, 0xfc, 0xa6, 0x01, 0x17, 0xd4, 0x01, 0xd1, 0xe8, 0x6d, + 0xb7, 0x3d, 0xdc, 0xfe, 0x90, 0x9b, 0x50, 0x12, 0xfd, 0x15, 0x2b, 0x72, 0xfd, 0x81, 0x85, 0x12, + 0x14, 0xb2, 0xc8, 0xba, 0x88, 0xf1, 0x10, 0xb6, 0x82, 0xb3, 0xa9, 0xe9, 0xc6, 0x92, 0xea, 0x33, + 0xa2, 0xb1, 0x2b, 0x01, 0x7e, 0xeb, 0x7d, 0xc7, 0x20, 0xe6, 0xbb, 0x30, 0xad, 0x97, 0xb2, 0x41, + 0xf1, 0x0a, 0x9a, 0xac, 0x9a, 0x91, 0x5d, 0x35, 0x99, 0x6e, 0x6e, 0x01, 0xe9, 0xa3, 0x0f, 0xf1, + 0xa0, 0x8a, 0x46, 0xf2, 0x20, 0x55, 0x9a, 0xbb, 0xfa, 0x10, 0xe3, 0x10, 0x5b, 0xe3, 0x6a, 0x73, + 0x23, 0xa9, 0xf9, 0xd7, 0x25, 0x38, 0x9b, 0x21, 0x3a, 0x4e, 0x58, 0xda, 0xab, 0xfa, 0xe4, 0x29, + 0xc5, 0x1e, 0x01, 0x72, 0xca, 0xbc, 0x2b, 0xc3, 0x29, 0x1d, 0x33, 0x55, 0x8e, 0x8b, 0xb1, 0xf4, + 0x49, 0x2c, 0xef, 0xaa, 0xd3, 0xce, 0xc8, 0x53, 0x73, 0xda, 0xa9, 0xc3, 0x84, 0xa8, 0x95, 0x98, + 0xca, 0xa3, 0x89, 0x59, 0x20, 0xe0, 0x09, 0x76, 0xdf, 0x94, 0xd6, 0x49, 0x38, 0x8f, 0xd0, 0x6f, + 0x3d, 0xa2, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x13, 0x32, 0x79, 0x28, 0x24, 0xe4, 0x1f, 0x19, 0x40, + 0x04, 0x44, 0x9d, 0xcf, 0xc5, 0xe3, 0xe6, 0xb3, 0xfb, 0x74, 0xe6, 0xf3, 0xf3, 0xb2, 0x8c, 0xd9, + 0xf3, 0x3a, 0xa3, 0x58, 0xe4, 0x1f, 0x18, 0x30, 0xcd, 0x3d, 0x47, 0xd4, 0xc2, 0x96, 0x8e, 0x2b, + 0x6c, 0xf3, 0xe9, 0x14, 0xf6, 0x4a, 0x88, 0xd9, 0x0e, 0x28, 0x6b, 0x7f, 0xa1, 0xc8, 0x8f, 0x03, + 0xc4, 0x33, 0x4a, 0x7a, 0x28, 0x5e, 0xc9, 0x90, 0x02, 0x31, 0x52, 0x72, 0xc9, 0x32, 0x8a, 0xe9, + 0x54, 0x9f, 0x9e, 0x84, 0x1b, 0xf9, 0x39, 0x38, 0xc7, 0xe6, 0x4b, 0x0c, 0x11, 0x7e, 0x6e, 0x33, + 0xe3, 0x98, 0xcb, 0xe7, 0x07, 0x2f, 0xed, 0x37, 0xb3, 0xc8, 0xf8, 0x3d, 0x91, 0xe4, 0xca, 0x7d, + 0xd4, 0x56, 0xb7, 0x7c, 0x59, 0x14, 0xe8, 0xd0, 0x8a, 0xa5, 0x0f, 0x67, 0xca, 0x98, 0x67, 0xa6, + 0x7c, 0xbb, 0x24, 0xe7, 0x02, 0x97, 0x6f, 0xa1, 0x7e, 0xd1, 0x03, 0x41, 0xe4, 0x03, 0x20, 0x8d, + 0xde, 0xee, 0x2e, 0x0d, 0x23, 0xea, 0x72, 0x18, 0x0d, 0xc2, 0x99, 0x09, 0x94, 0x0f, 0x68, 0xa6, + 0x0a, 0x65, 0xaa, 0x1d, 0xc8, 0x64, 0x75, 0x90, 0xf4, 0x13, 0x5f, 0xde, 0x86, 0x4b, 0x03, 0xab, + 0x99, 0x71, 0x89, 0x63, 0x56, 0xbf, 0xc4, 0x71, 0x69, 0x90, 0x38, 0x0c, 0xd5, 0x8b, 0x1c, 0xbf, + 0x63, 0xa4, 0xe4, 0x9f, 0x50, 0x56, 0x78, 0xe4, 0xb9, 0x41, 0x0b, 0x44, 0x0e, 0x2f, 0xe3, 0x73, + 0x09, 0x99, 0x4b, 0x94, 0x24, 0x26, 0x21, 0x55, 0x09, 0x8b, 0xb2, 0xf2, 0x63, 0x8a, 0x42, 0xf3, + 0x9f, 0x18, 0x40, 0x78, 0x09, 0xe7, 0x9d, 0xae, 0xb3, 0xed, 0xb5, 0xbc, 0xc8, 0xa3, 0x21, 0x79, + 0x00, 0x15, 0xc1, 0xc2, 0xd9, 0x6e, 0x51, 0xd5, 0x3f, 0x4b, 0x1c, 0xe0, 0xc6, 0x69, 0x76, 0x5a, + 0xad, 0xe9, 0x23, 0x1c, 0xd0, 0x79, 0xb9, 0x8f, 0xd1, 0x79, 0xe6, 0x0f, 0x0c, 0xb8, 0xd4, 0x5f, + 0x6c, 0x91, 0x73, 0xdc, 0x78, 0xc6, 0x09, 0x8d, 0x97, 0x55, 0xcb, 0x1c, 0x9a, 0x3e, 0x9f, 0x5a, + 0x2d, 0xf3, 0x89, 0x25, 0xf5, 0xf4, 0xb5, 0xfc, 0xe5, 0x1c, 0x94, 0xd7, 0x5a, 0xbd, 0x5d, 0xaf, + 0xb3, 0xe0, 0x44, 0xce, 0x33, 0xbb, 0xa5, 0x78, 0x53, 0xdb, 0x52, 0xc4, 0x1e, 0x59, 0x71, 0xc5, + 0x86, 0x8b, 0x02, 0x66, 0xc0, 0x54, 0x42, 0xc2, 0x67, 0xe9, 0x7d, 0x28, 0xb0, 0x0f, 0xa1, 0xa1, + 0x5c, 0xed, 0x63, 0x8c, 0x58, 0x37, 0xe3, 0x7f, 0x42, 0xc9, 0xd7, 0x63, 0xaf, 0x21, 0x87, 0xcb, + 0x5f, 0xe0, 0xa1, 0x93, 0x4e, 0x1f, 0xe6, 0xf1, 0x1f, 0x1b, 0x50, 0x49, 0xd7, 0x84, 0x3c, 0x80, + 0x31, 0xc6, 0xc9, 0x8b, 0xc3, 0x30, 0xbd, 0x34, 0xa0, 0xce, 0x37, 0x05, 0x1a, 0x2f, 0x1e, 0x36, + 0x3e, 0xe5, 0x10, 0x4b, 0x72, 0xb8, 0x6c, 0x41, 0x59, 0xc5, 0xca, 0x28, 0xdd, 0x6b, 0xba, 0x68, + 0xba, 0x90, 0xdd, 0x0e, 0x6a, 0xa9, 0x7f, 0x5b, 0x2b, 0xb5, 0x10, 0x4a, 0xc3, 0xc6, 0xd3, 0xc3, + 0x2b, 0x69, 0x3c, 0x6a, 0x88, 0x3a, 0xce, 0x64, 0x80, 0x11, 0xfd, 0x4a, 0x1a, 0x87, 0xb1, 0xbd, + 0x08, 0xcf, 0x4f, 0x8c, 0x33, 0xdc, 0x8b, 0x74, 0x11, 0xa2, 0xea, 0xb3, 0x1c, 0xc7, 0xfc, 0xdb, + 0x79, 0xb8, 0x90, 0x14, 0x8f, 0x47, 0x17, 0x5c, 0x73, 0x02, 0xa7, 0x1d, 0x9e, 0x30, 0x03, 0xae, + 0xf7, 0x15, 0x0d, 0xaf, 0x5c, 0xcb, 0xa2, 0x29, 0x05, 0x32, 0x53, 0x05, 0xc2, 0x4d, 0x1c, 0x2f, + 0x90, 0x2c, 0x06, 0x79, 0x00, 0xf9, 0x06, 0x8d, 0xc4, 0xc5, 0xcc, 0x6b, 0x7d, 0xad, 0xaa, 0x96, + 0xeb, 0x66, 0x83, 0x46, 0xbc, 0x13, 0xb9, 0x6f, 0x3b, 0xd5, 0x7c, 0xcd, 0x99, 0x3a, 0xbe, 0x05, + 0xa3, 0x8b, 0x4f, 0xba, 0xb4, 0x19, 0x89, 0xfb, 0x98, 0xaf, 0x1e, 0xcf, 0x8f, 0xe3, 0x2a, 0xb7, + 0x3e, 0x29, 0x02, 0xd4, 0xc6, 0xe2, 0x28, 0x97, 0xef, 0x40, 0x51, 0x66, 0x7e, 0xaa, 0xdb, 0x8b, + 0x6f, 0xc2, 0xb8, 0x92, 0xc9, 0xa9, 0x06, 0xfd, 0x5f, 0x1b, 0x30, 0xca, 0x84, 0xde, 0xe6, 0x1b, + 0xcf, 0xa8, 0x44, 0xba, 0xad, 0x49, 0xa4, 0x69, 0xe5, 0x9a, 0x0d, 0xce, 0xcb, 0x37, 0x4e, 0x90, + 0x45, 0x87, 0x06, 0x40, 0x82, 0x4c, 0xee, 0xc1, 0x18, 0x3f, 0xbf, 0x90, 0xa1, 0x3b, 0xd5, 0x7b, + 0x3b, 0x22, 0x25, 0xd1, 0x72, 0xfc, 0x6e, 0x5a, 0x2d, 0x94, 0xd4, 0x64, 0x21, 0xf1, 0x6d, 0x56, + 0x2f, 0x8a, 0x32, 0x36, 0xf3, 0x7e, 0x87, 0xdf, 0xe3, 0x08, 0x95, 0x10, 0x57, 0xd9, 0x4e, 0xce, + 0x35, 0x61, 0xd8, 0xc8, 0x1f, 0xc7, 0xe4, 0x82, 0x60, 0x92, 0x6d, 0xf3, 0xf8, 0xd6, 0x38, 0xbf, + 0x19, 0x21, 0x0b, 0xf6, 0x0e, 0x94, 0xef, 0xfa, 0xc1, 0x63, 0x27, 0x70, 0x6b, 0xbb, 0x54, 0x78, + 0xa5, 0x17, 0xd1, 0xb5, 0x7c, 0x62, 0x87, 0xc3, 0x6d, 0x87, 0x25, 0xfc, 0xf0, 0xb0, 0x5a, 0xa8, + 0xfb, 0x7e, 0xcb, 0xd2, 0xd0, 0xc9, 0x2a, 0x4c, 0x3c, 0x74, 0x9e, 0x88, 0x33, 0xc2, 0xf5, 0xf5, + 0x65, 0xe1, 0xdb, 0xf2, 0xea, 0xd1, 0x61, 0xf5, 0x52, 0xdb, 0x79, 0x12, 0x9f, 0x2d, 0x0e, 0x76, + 0xbf, 0xd6, 0xe9, 0x89, 0x07, 0x93, 0x6b, 0x7e, 0x10, 0x89, 0x4c, 0x98, 0x4e, 0x9b, 0x1f, 0x70, + 0xca, 0x34, 0x9b, 0x79, 0xca, 0x74, 0x89, 0x29, 0xf2, 0xf6, 0x4e, 0x4c, 0xae, 0x5d, 0xe7, 0xd3, + 0x18, 0x93, 0x77, 0x60, 0x7a, 0x9e, 0x06, 0x91, 0xb7, 0xe3, 0x35, 0x9d, 0x88, 0xde, 0xf5, 0x83, + 0xb6, 0x13, 0x09, 0x83, 0x0a, 0x6e, 0xa8, 0x9b, 0x94, 0x73, 0x6a, 0x3b, 0x91, 0xd5, 0x8f, 0x49, + 0xbe, 0x9a, 0xe5, 0x2d, 0x34, 0x82, 0xd5, 0x7f, 0x9d, 0x29, 0x05, 0x19, 0xde, 0x42, 0x03, 0x9a, + 0x20, 0xc3, 0x6f, 0x68, 0xf7, 0xb8, 0xa3, 0xd6, 0x62, 0xfd, 0x96, 0x38, 0xf6, 0x3d, 0xf9, 0x28, + 0x35, 0xee, 0xb7, 0x01, 0x47, 0xaa, 0x73, 0x90, 0xaf, 0xaf, 0xdd, 0x45, 0x13, 0x89, 0x38, 0xda, + 0xa4, 0x9d, 0x3d, 0xa7, 0xd3, 0x44, 0x5d, 0x46, 0xf8, 0x4b, 0xa8, 0x02, 0xaf, 0xbe, 0x76, 0x97, + 0x38, 0x70, 0x76, 0x8d, 0x06, 0x6d, 0x2f, 0xfa, 0xf2, 0xad, 0x5b, 0x4a, 0x47, 0x15, 0xb1, 0x68, + 0xb3, 0xa2, 0x68, 0xd5, 0x2e, 0xa2, 0xd8, 0x4f, 0x6e, 0xdd, 0xca, 0xec, 0x8e, 0xb8, 0x60, 0x59, + 0xbc, 0xc8, 0x22, 0x4c, 0x3e, 0x74, 0x9e, 0x88, 0x43, 0xf0, 0x78, 0x8f, 0x97, 0x47, 0x6f, 0x7c, + 0x1c, 0x58, 0xcd, 0x24, 0x49, 0xed, 0x62, 0x9d, 0x88, 0xbc, 0x0d, 0xe3, 0xc9, 0xf0, 0x0a, 0xf1, + 0xf8, 0x33, 0xcf, 0xdd, 0x30, 0x95, 0xc1, 0xa9, 0xd9, 0x92, 0x14, 0x74, 0xb2, 0x11, 0x6f, 0xd1, + 0xb9, 0x42, 0x8a, 0x07, 0x9e, 0xa5, 0xfa, 0xac, 0xba, 0x45, 0x77, 0x30, 0x45, 0xab, 0xd6, 0x54, + 0xac, 0xa2, 0x73, 0xef, 0x1c, 0x4b, 0xe7, 0xa2, 0xec, 0xfc, 0xd7, 0x02, 0xbf, 0xdd, 0x8d, 0xd0, + 0x4b, 0x31, 0xb5, 0xf3, 0xef, 0x62, 0x4a, 0xc6, 0xce, 0x9f, 0x93, 0x64, 0x9f, 0xed, 0x4f, 0x7c, + 0x8c, 0xb3, 0x7d, 0x0a, 0x85, 0x65, 0xbf, 0xb9, 0x8f, 0x6e, 0x89, 0xa5, 0xfa, 0x07, 0x4c, 0x7e, + 0xb4, 0xfc, 0xe6, 0xfe, 0xd3, 0x3b, 0x93, 0x46, 0xf6, 0x64, 0x85, 0xd5, 0x9d, 0x0d, 0x2b, 0x91, + 0xf5, 0xcc, 0x94, 0x76, 0xd2, 0xa6, 0xa5, 0x71, 0x45, 0x85, 0x8f, 0x42, 0x59, 0x11, 0x4b, 0x27, + 0x27, 0x14, 0x2a, 0x0b, 0x34, 0xdc, 0x8f, 0xfc, 0xee, 0x7c, 0xcb, 0xeb, 0x6e, 0xfb, 0x4e, 0xe0, + 0xce, 0x54, 0x06, 0x08, 0x8c, 0x57, 0x32, 0x05, 0xc6, 0xb4, 0xcb, 0xe9, 0xed, 0xa6, 0x64, 0x60, + 0xf5, 0xb1, 0x24, 0x5f, 0x85, 0x49, 0x36, 0x5b, 0x16, 0x9f, 0x44, 0xb4, 0xc3, 0x87, 0xd2, 0x34, + 0x2e, 0xf5, 0xe7, 0x94, 0x8b, 0x8d, 0x71, 0x22, 0x1f, 0xa4, 0x28, 0x3d, 0x68, 0x4c, 0xa0, 0x0e, + 0x52, 0x9d, 0x95, 0xf9, 0xe3, 0xa9, 0x36, 0x21, 0x4b, 0x30, 0x26, 0x4a, 0x20, 0x56, 0x9d, 0xfe, + 0xba, 0x3c, 0x9f, 0x59, 0x97, 0x31, 0x51, 0x17, 0x4b, 0xd2, 0x9b, 0xff, 0xca, 0x80, 0x09, 0x2d, + 0x3b, 0x72, 0x47, 0x71, 0x99, 0x49, 0x5c, 0xdd, 0x34, 0x9c, 0xcc, 0x90, 0xf8, 0x77, 0x84, 0x9f, + 0x54, 0x6e, 0x30, 0x5d, 0x66, 0xb4, 0x32, 0x19, 0x68, 0x20, 0x7f, 0x7c, 0xa0, 0x81, 0xc2, 0x80, + 0x40, 0x03, 0xdf, 0x9a, 0x80, 0x49, 0x7d, 0x81, 0x63, 0x1a, 0xe7, 0xb2, 0xbf, 0xeb, 0x75, 0xe4, + 0xbe, 0x95, 0x87, 0xce, 0x40, 0x88, 0x16, 0x5f, 0x1e, 0x21, 0xe4, 0x65, 0x80, 0xf8, 0x68, 0x56, + 0x6e, 0x4d, 0x45, 0x34, 0x7c, 0x25, 0x81, 0xfc, 0x04, 0xc0, 0x8a, 0xef, 0xd2, 0x38, 0xfa, 0xca, + 0x31, 0x06, 0xa5, 0x57, 0x84, 0x41, 0x49, 0x44, 0xb0, 0x3f, 0x3a, 0xac, 0x9e, 0xef, 0xf8, 0x2e, + 0xed, 0x0f, 0xbb, 0xa2, 0x70, 0x24, 0x5f, 0x84, 0x11, 0xab, 0xd7, 0xa2, 0x32, 0x18, 0xc8, 0xb8, + 0x1c, 0xf0, 0xbd, 0x96, 0x12, 0xd9, 0x32, 0xe8, 0xa5, 0xcf, 0x11, 0x18, 0x80, 0xbc, 0x07, 0xf0, + 0xa0, 0xb7, 0x4d, 0xef, 0x05, 0x7e, 0xaf, 0x2b, 0x6f, 0x1b, 0xe3, 0x36, 0x76, 0x3f, 0x0e, 0x1d, + 0x65, 0xef, 0x62, 0xa2, 0x9a, 0x79, 0x42, 0x42, 0x56, 0x61, 0x4c, 0x88, 0x0f, 0x61, 0xa7, 0x7f, + 0x21, 0xcb, 0x42, 0xa4, 0xe8, 0x10, 0x22, 0x3a, 0x07, 0x82, 0x75, 0xa3, 0x0d, 0xdf, 0x86, 0xbf, + 0x0d, 0x25, 0xc6, 0x9e, 0x6d, 0xb5, 0x43, 0xb1, 0x76, 0xa0, 0xcf, 0xa2, 0x52, 0x20, 0xb6, 0x2d, + 0xd7, 0x62, 0x84, 0xc5, 0x04, 0xe4, 0xab, 0x18, 0x4f, 0x47, 0x34, 0xf5, 0xb1, 0x86, 0xc6, 0x6b, + 0x7d, 0x4d, 0x7d, 0xce, 0xe9, 0x76, 0x33, 0x02, 0x90, 0xc5, 0xfc, 0xc8, 0x6e, 0x7c, 0xaf, 0x27, + 0x0e, 0x6f, 0x7c, 0x4c, 0x06, 0x37, 0xfa, 0x32, 0x98, 0x91, 0x57, 0x55, 0xfa, 0xa3, 0xe8, 0x68, + 0x7c, 0x49, 0x17, 0x2a, 0x49, 0xe8, 0x2e, 0x91, 0x17, 0x1c, 0x97, 0xd7, 0xeb, 0x7d, 0x79, 0xa9, + 0x1d, 0xd8, 0x97, 0x5d, 0x1f, 0x77, 0xe2, 0x26, 0xa1, 0x68, 0x45, 0x7e, 0xe3, 0xc7, 0xe5, 0xf7, + 0x72, 0x5f, 0x7e, 0x67, 0xdd, 0xed, 0xfe, 0x7c, 0x52, 0x3c, 0xc9, 0xdb, 0x30, 0x21, 0x21, 0x38, + 0x3f, 0xd0, 0xc0, 0x27, 0xf4, 0x7b, 0x77, 0x1b, 0x1d, 0xd5, 0xf4, 0x10, 0x32, 0x2a, 0xb2, 0x4a, + 0xcd, 0x47, 0xc7, 0x84, 0x46, 0x9d, 0x1e, 0x15, 0x3a, 0x32, 0xf9, 0x0a, 0x8c, 0x2f, 0xb5, 0x59, + 0x45, 0xfc, 0x8e, 0x13, 0x51, 0x5c, 0x8c, 0x12, 0xa3, 0xa9, 0x92, 0xa2, 0x0c, 0x55, 0x1e, 0x57, + 0x32, 0x49, 0x52, 0x17, 0x73, 0x85, 0x82, 0x35, 0x1e, 0x37, 0xbf, 0x88, 0x31, 0x1c, 0x8a, 0xa5, + 0xe7, 0xf9, 0x0c, 0xc3, 0xa5, 0xc2, 0x1e, 0x65, 0x39, 0xb7, 0xea, 0xd8, 0x62, 0x42, 0x68, 0x8d, + 0xa7, 0xf3, 0x24, 0xef, 0xc0, 0xb8, 0xb8, 0x45, 0x59, 0xb3, 0x56, 0xc2, 0x99, 0x0a, 0x56, 0x1e, + 0xe3, 0xbf, 0xc9, 0x0b, 0x97, 0xb6, 0x13, 0xa4, 0x4e, 0xaf, 0x12, 0x7c, 0xf2, 0x65, 0x38, 0xb7, + 0xe5, 0x75, 0x5c, 0xff, 0x71, 0x28, 0x04, 0xb8, 0x10, 0x74, 0xd3, 0x89, 0x8f, 0xce, 0x63, 0x9e, + 0x6e, 0xcb, 0x65, 0xab, 0x4f, 0xf0, 0x65, 0x72, 0x20, 0x3f, 0xdb, 0xc7, 0x99, 0x8f, 0x20, 0x72, + 0xdc, 0x08, 0x9a, 0xeb, 0x1b, 0x41, 0xfd, 0xd9, 0xa7, 0x87, 0x53, 0x66, 0x36, 0xc4, 0x07, 0xa2, + 0xeb, 0x1c, 0xef, 0xfb, 0x5e, 0x67, 0xe6, 0xac, 0xf6, 0x78, 0x48, 0xec, 0xa6, 0x8b, 0x78, 0x6b, + 0x7e, 0xcb, 0x6b, 0x1e, 0xd4, 0xcd, 0xa3, 0xc3, 0xea, 0x0b, 0x69, 0x6d, 0xe6, 0x43, 0x5f, 0x33, + 0x2e, 0x64, 0xb0, 0x26, 0x5f, 0x81, 0x32, 0xfb, 0x8d, 0x55, 0xbf, 0x73, 0xda, 0x51, 0x97, 0x82, + 0x29, 0xf2, 0xc1, 0x3e, 0xc2, 0x6b, 0x9e, 0x19, 0x5a, 0xa1, 0xc6, 0xca, 0xfc, 0x81, 0x01, 0xe7, + 0xb2, 0xca, 0x7a, 0x42, 0x4c, 0x1d, 0x33, 0x75, 0xe8, 0x8d, 0x76, 0x09, 0x7e, 0xe8, 0x1d, 0x1f, + 0x75, 0x57, 0x61, 0x84, 0xed, 0x95, 0xa5, 0x53, 0x16, 0x2e, 0x87, 0x6c, 0x3f, 0x1d, 0x5a, 0x1c, + 0xce, 0x10, 0xd0, 0x81, 0x1f, 0xd7, 0xcb, 0x11, 0x8e, 0x80, 0x5e, 0xfe, 0x16, 0x87, 0x33, 0x04, + 0xb6, 0xec, 0xca, 0x65, 0x02, 0x11, 0xd8, 0x6a, 0x1c, 0x5a, 0x1c, 0x4e, 0xae, 0xc1, 0xd8, 0x6a, + 0x67, 0x99, 0x3a, 0x8f, 0xa8, 0x38, 0x71, 0x42, 0x3b, 0x8a, 0xdf, 0xb1, 0x5b, 0x0c, 0x66, 0xc9, + 0x44, 0xf3, 0x3b, 0x06, 0x4c, 0xf7, 0x35, 0xd3, 0xc9, 0x61, 0x83, 0x8e, 0x3f, 0xde, 0x1b, 0xa6, + 0x7e, 0xbc, 0xf8, 0x85, 0xec, 0xe2, 0x9b, 0x7f, 0x58, 0x80, 0x8b, 0x03, 0x56, 0xad, 0xe4, 0x68, + 0xde, 0x38, 0xf1, 0x68, 0xfe, 0x6b, 0x6c, 0x95, 0x70, 0xbc, 0x76, 0xb8, 0xee, 0x27, 0x25, 0x4e, + 0x4e, 0x31, 0x30, 0x4d, 0xc6, 0xe5, 0x90, 0x31, 0x24, 0x2e, 0x35, 0x91, 0xc2, 0x8e, 0xfc, 0x3e, + 0x9b, 0xb1, 0xce, 0xac, 0xef, 0x70, 0x3c, 0xff, 0x23, 0x72, 0x38, 0xae, 0x1f, 0x49, 0x15, 0x9e, + 0xea, 0x91, 0x54, 0xb6, 0x91, 0x7c, 0xe4, 0x63, 0x1c, 0x05, 0x90, 0x79, 0x98, 0x68, 0x50, 0x27, + 0x68, 0xee, 0xd5, 0x42, 0xde, 0x49, 0xa3, 0xc8, 0x0d, 0x45, 0x72, 0x88, 0x09, 0xb6, 0x13, 0xf6, + 0xf7, 0x85, 0x46, 0x63, 0xfe, 0xdb, 0xd4, 0x99, 0xfe, 0x8f, 0xe2, 0x78, 0x79, 0x15, 0x46, 0xb6, + 0xf6, 0x68, 0x20, 0x95, 0x64, 0x2c, 0xc8, 0x63, 0x06, 0x50, 0x0b, 0x82, 0x18, 0xe6, 0xcf, 0x40, + 0x59, 0xcd, 0x0c, 0x05, 0x02, 0xfb, 0x16, 0x33, 0x92, 0x0b, 0x04, 0x06, 0xb0, 0x38, 0xfc, 0xc4, + 0x50, 0x5e, 0x49, 0x2b, 0xe4, 0x4f, 0x6a, 0x05, 0x96, 0x39, 0x8e, 0x37, 0x25, 0x73, 0xfc, 0x56, + 0x33, 0x8f, 0x18, 0xc0, 0xe2, 0xf0, 0xa7, 0x9a, 0xf9, 0xbf, 0x31, 0xa0, 0x80, 0x61, 0x14, 0xde, + 0x80, 0x92, 0x34, 0xf6, 0xaa, 0xa1, 0x05, 0xce, 0x4a, 0x5b, 0x70, 0xa8, 0x7b, 0x64, 0x08, 0x20, + 0xcb, 0x6a, 0x93, 0x06, 0xdb, 0x9a, 0xe3, 0xce, 0x23, 0x06, 0x50, 0xb3, 0x42, 0x8c, 0x53, 0xf4, + 0x07, 0x3a, 0x27, 0x09, 0x0b, 0x05, 0x17, 0x59, 0xdc, 0x39, 0xa9, 0xcf, 0x32, 0x21, 0xb1, 0xcc, + 0xdf, 0x34, 0xe0, 0x7c, 0xa6, 0x26, 0xc3, 0x72, 0xe5, 0x2a, 0x93, 0x32, 0x1c, 0xd3, 0xfa, 0x12, + 0xc7, 0x38, 0x8d, 0x13, 0xd2, 0x29, 0xc6, 0xd6, 0x67, 0xa0, 0x14, 0xef, 0x30, 0xc9, 0x39, 0xd9, + 0x75, 0x68, 0x11, 0x94, 0xdb, 0xb1, 0xbf, 0x36, 0x60, 0x94, 0x15, 0xe1, 0x99, 0xbd, 0x93, 0x92, + 0x6d, 0x1f, 0x66, 0x55, 0x1a, 0xea, 0x26, 0xca, 0xef, 0x8d, 0x02, 0x24, 0xc8, 0x64, 0x1b, 0x26, + 0x57, 0x97, 0x16, 0xe6, 0x97, 0x5c, 0xda, 0x89, 0xf0, 0x9c, 0x32, 0x15, 0x9b, 0x80, 0x6d, 0x8d, + 0x83, 0x8e, 0xd3, 0x12, 0x08, 0x07, 0x89, 0x6c, 0xf0, 0x3d, 0xb7, 0x69, 0x7b, 0x31, 0x9d, 0xaa, + 0x52, 0xea, 0x1c, 0x59, 0x1e, 0x8d, 0xda, 0xc3, 0x65, 0x25, 0x8f, 0xdc, 0x90, 0x79, 0x84, 0x4e, + 0xbb, 0x35, 0x20, 0x0f, 0x9d, 0x23, 0xd9, 0x83, 0xca, 0x3d, 0x5c, 0x7d, 0x94, 0x5c, 0xf2, 0xc7, + 0xe7, 0xf2, 0xa2, 0xc8, 0xe5, 0x39, 0xbe, 0x6c, 0x65, 0xe7, 0xd3, 0xc7, 0x35, 0x19, 0xb9, 0x85, + 0x13, 0x47, 0xee, 0xdf, 0x30, 0x60, 0x94, 0x2f, 0x6f, 0xf1, 0x0b, 0x20, 0x99, 0x0b, 0xe8, 0xd6, + 0xd3, 0x59, 0x40, 0x2b, 0x28, 0xb9, 0x34, 0x13, 0x02, 0x4f, 0x23, 0x0b, 0xa9, 0xe7, 0x44, 0xe4, + 0x21, 0x00, 0xaa, 0xd6, 0x3c, 0x25, 0x71, 0xe5, 0xe2, 0x2f, 0x89, 0xa8, 0x5c, 0x38, 0x86, 0xfa, + 0xb8, 0xe1, 0xd8, 0xc7, 0x7c, 0xdc, 0x70, 0x19, 0x4a, 0xc2, 0x37, 0xa9, 0x7e, 0x20, 0x36, 0xd0, + 0xd2, 0x44, 0x14, 0xc3, 0x95, 0x90, 0xdd, 0x1c, 0x64, 0x6f, 0x6b, 0x01, 0xf7, 0x62, 0x44, 0xb2, + 0x0a, 0xa5, 0xe4, 0x42, 0x4d, 0x49, 0x3b, 0xc9, 0x8d, 0xe1, 0xc2, 0x79, 0x97, 0xdf, 0xd9, 0xcc, + 0xbc, 0x3f, 0x93, 0xf0, 0x30, 0xbf, 0x61, 0x40, 0x25, 0x3d, 0x5e, 0xc8, 0xdb, 0x30, 0x1e, 0xdf, + 0x69, 0x8a, 0x3d, 0x24, 0xd0, 0x14, 0x9b, 0x5c, 0x82, 0xd2, 0x7c, 0x25, 0x54, 0x74, 0x32, 0x07, + 0x45, 0x36, 0xed, 0x94, 0x88, 0xcb, 0x28, 0x4f, 0x7a, 0x02, 0xa6, 0x9e, 0x4c, 0x4a, 0x3c, 0x65, + 0xd6, 0xfe, 0xfb, 0x3c, 0x8c, 0x2b, 0x9d, 0x45, 0x5e, 0x85, 0xe2, 0x52, 0xb8, 0xec, 0x37, 0xf7, + 0xa9, 0x2b, 0x0e, 0x3c, 0xf0, 0xed, 0x4a, 0x2f, 0xb4, 0x5b, 0x08, 0xb4, 0xe2, 0x64, 0x52, 0x87, + 0x09, 0xfe, 0x4f, 0xde, 0x5d, 0xcd, 0x25, 0xc6, 0x5a, 0x8e, 0x2c, 0x6f, 0xad, 0xaa, 0xcb, 0xbb, + 0x46, 0x42, 0xbe, 0x0e, 0xc0, 0x01, 0xac, 0x7f, 0x87, 0x70, 0x4d, 0x96, 0x13, 0xf8, 0xbc, 0xc8, + 0x20, 0xf2, 0xd4, 0x1a, 0xe2, 0x50, 0x50, 0x18, 0xe2, 0xbb, 0x79, 0x7e, 0x73, 0x7f, 0xf8, 0x97, + 0x33, 0x93, 0x77, 0xf3, 0xfc, 0xe6, 0xbe, 0x9d, 0xed, 0xa7, 0xa6, 0xb2, 0x24, 0xdf, 0x34, 0xe0, + 0xb2, 0x45, 0x9b, 0xfe, 0x23, 0x1a, 0x1c, 0xd4, 0x22, 0xc4, 0x52, 0x73, 0x3c, 0xd9, 0x29, 0xee, + 0xb6, 0xc8, 0xf1, 0x95, 0x40, 0x70, 0xc1, 0x0b, 0x35, 0xed, 0x6e, 0x64, 0x1f, 0x53, 0x84, 0x63, + 0xb2, 0x34, 0xff, 0xcc, 0x50, 0xa6, 0x00, 0x59, 0x81, 0x52, 0x3c, 0x58, 0x84, 0xc9, 0x34, 0xd6, + 0xcc, 0x24, 0xdc, 0xa2, 0x3b, 0xf5, 0xe7, 0xc4, 0xd9, 0xc4, 0xd9, 0x78, 0xc8, 0x69, 0x33, 0x42, + 0x02, 0xc9, 0x97, 0xa0, 0x80, 0x5d, 0x75, 0x72, 0x88, 0x2e, 0xb9, 0xd4, 0x14, 0x58, 0x1f, 0x61, + 0xa9, 0x91, 0x92, 0x7c, 0x4e, 0xf8, 0xa9, 0xe4, 0xb5, 0xe0, 0xb7, 0x0c, 0xc4, 0xca, 0x11, 0xaf, + 0x31, 0x89, 0x6b, 0xa4, 0x32, 0x5a, 0xff, 0x66, 0x0e, 0x2a, 0xe9, 0x89, 0x47, 0xde, 0x83, 0xb2, + 0xbc, 0x1c, 0x75, 0xdf, 0x09, 0xf7, 0x44, 0x40, 0x4d, 0xdc, 0xb5, 0xca, 0x1b, 0x55, 0xf6, 0x9e, + 0xa3, 0x05, 0x5e, 0xd3, 0x08, 0xd8, 0x82, 0xbc, 0x2e, 0x3c, 0xee, 0x95, 0x09, 0x14, 0xf9, 0x51, + 0x37, 0x15, 0x50, 0x53, 0xa2, 0x91, 0x37, 0x20, 0xcf, 0x6f, 0x0c, 0xaa, 0xd1, 0x98, 0x1e, 0xde, + 0xad, 0xf1, 0x0b, 0x4f, 0xfc, 0x38, 0x5c, 0x3f, 0x57, 0x60, 0xf8, 0x64, 0x59, 0xb9, 0x6f, 0x36, + 0xaa, 0x45, 0xa5, 0x91, 0xe0, 0xb8, 0x72, 0x27, 0x5f, 0x3c, 0x7b, 0xbf, 0x50, 0xcc, 0x57, 0x0a, + 0xe2, 0x86, 0xd1, 0x1f, 0xe4, 0xa1, 0x14, 0xe7, 0x4f, 0x08, 0xa0, 0xbe, 0x21, 0xce, 0xb5, 0xf1, + 0x3f, 0xb9, 0x04, 0x45, 0xa9, 0x62, 0x88, 0xb3, 0xed, 0xb1, 0x50, 0xa8, 0x17, 0x33, 0x20, 0x75, + 0x09, 0xae, 0x5e, 0x58, 0xf2, 0x93, 0xdc, 0x82, 0x58, 0x51, 0x18, 0xa4, 0x51, 0x14, 0x58, 0x87, + 0x59, 0x31, 0x1a, 0x99, 0x84, 0x9c, 0xc7, 0xbd, 0xa9, 0x4b, 0x56, 0xce, 0x73, 0xc9, 0x7b, 0x50, + 0x74, 0x5c, 0x97, 0xba, 0xb6, 0x13, 0x0d, 0xf1, 0x8a, 0x69, 0x91, 0x71, 0xe3, 0x12, 0x1d, 0xa9, + 0x6a, 0x11, 0xa9, 0x41, 0x09, 0x1f, 0xb1, 0xec, 0x85, 0x43, 0xbd, 0x7c, 0x99, 0x70, 0x28, 0x32, + 0xb2, 0x8d, 0x90, 0xba, 0xe4, 0x15, 0x28, 0xb0, 0xde, 0x14, 0xeb, 0x41, 0x1c, 0x63, 0x6f, 0x75, + 0x7d, 0x8d, 0x37, 0xd8, 0xfd, 0x33, 0x16, 0x22, 0x90, 0x97, 0x20, 0xdf, 0x9b, 0xdb, 0x11, 0x92, + 0xbe, 0x92, 0x5c, 0x26, 0x8d, 0xd1, 0x58, 0x32, 0xb9, 0x0d, 0xc5, 0xc7, 0xfa, 0xb5, 0xc1, 0xf3, + 0xa9, 0x6e, 0x8c, 0xf1, 0x63, 0xc4, 0x7a, 0x11, 0x46, 0xf9, 0x85, 0x39, 0xf3, 0x05, 0x80, 0x24, + 0xeb, 0x7e, 0x17, 0x04, 0xf3, 0xeb, 0x50, 0x8a, 0xb3, 0x24, 0xcf, 0x03, 0xec, 0xd3, 0x03, 0x7b, + 0xcf, 0xe9, 0xb8, 0xe2, 0xf1, 0x96, 0xb2, 0x55, 0xda, 0xa7, 0x07, 0xf7, 0x11, 0x40, 0x2e, 0xc2, + 0x58, 0x97, 0xf5, 0xaa, 0x0c, 0x07, 0x6b, 0x8d, 0x76, 0x7b, 0xdb, 0x6c, 0x84, 0xce, 0xc0, 0x18, + 0x1a, 0x3f, 0xc4, 0x44, 0x9b, 0xb0, 0xe4, 0xa7, 0xf9, 0x3b, 0x39, 0x0c, 0x14, 0xa0, 0x94, 0x93, + 0xbc, 0x08, 0x13, 0xcd, 0x80, 0xe2, 0x72, 0xe4, 0x30, 0xb5, 0x48, 0xe4, 0x53, 0x4e, 0x80, 0x4b, + 0x2e, 0xb9, 0x06, 0x53, 0x49, 0x7c, 0x5a, 0xbb, 0xb9, 0x2d, 0x2e, 0x0d, 0x97, 0xad, 0x89, 0xae, + 0x0c, 0x50, 0x3b, 0xbf, 0x8d, 0xb7, 0x00, 0x2a, 0xea, 0x65, 0xb9, 0x48, 0xc6, 0x9a, 0x2d, 0x59, + 0x53, 0x0a, 0x1c, 0x0f, 0x4e, 0x2e, 0xc0, 0xa8, 0xe3, 0xec, 0xf6, 0x3c, 0xee, 0x91, 0x5c, 0xb6, + 0xc4, 0x17, 0xf9, 0x2c, 0x4c, 0x87, 0xde, 0x6e, 0xc7, 0x89, 0x7a, 0x81, 0x88, 0xd4, 0x40, 0x03, + 0x1c, 0x52, 0x13, 0x56, 0x25, 0x4e, 0x98, 0xe7, 0x70, 0xf2, 0x3a, 0x10, 0x35, 0x3f, 0x7f, 0xfb, + 0x43, 0xda, 0xe4, 0x43, 0xad, 0x6c, 0x4d, 0x2b, 0x29, 0xab, 0x98, 0x40, 0x3e, 0x03, 0xe5, 0x80, + 0x86, 0xa8, 0x92, 0x61, 0xb3, 0x61, 0xfc, 0x19, 0x6b, 0x5c, 0xc2, 0x1e, 0xd0, 0x03, 0xb3, 0x0e, + 0xd3, 0x7d, 0xf3, 0x91, 0xbc, 0xce, 0xb5, 0x7b, 0xb1, 0x3e, 0x97, 0xf9, 0x66, 0x86, 0x09, 0xa9, + 0xd4, 0xbb, 0xc7, 0x1c, 0xc9, 0xec, 0x40, 0x59, 0x95, 0xaf, 0x27, 0x5c, 0xc7, 0xbe, 0x80, 0xae, + 0x91, 0x5c, 0xf8, 0x8c, 0x1e, 0x1d, 0x56, 0x73, 0x9e, 0x8b, 0x0e, 0x91, 0xd7, 0xa1, 0x28, 0xb5, + 0x04, 0xf5, 0xf1, 0x12, 0xa1, 0x50, 0x1e, 0x58, 0x71, 0xaa, 0xf9, 0x0a, 0x8c, 0x09, 0x11, 0x7a, + 0xbc, 0x21, 0xca, 0xfc, 0xc5, 0x1c, 0x4c, 0x59, 0x94, 0x4d, 0x70, 0xf1, 0x2c, 0xc8, 0xa7, 0x2c, + 0x52, 0xaf, 0x56, 0xb7, 0x63, 0xa2, 0x1f, 0x7c, 0xd7, 0x80, 0xb3, 0x19, 0xb8, 0x1f, 0x29, 0xb4, + 0xd7, 0x1d, 0x28, 0x2d, 0x78, 0x4e, 0xab, 0xe6, 0xba, 0xb1, 0x8b, 0x27, 0x6a, 0x83, 0x2e, 0x9b, + 0x4e, 0x0e, 0x83, 0xaa, 0x8b, 0x69, 0x8c, 0x4a, 0x6e, 0x88, 0x41, 0x91, 0x04, 0x1f, 0x94, 0xb1, + 0x80, 0x81, 0x97, 0x29, 0x89, 0x04, 0x8c, 0x17, 0xe9, 0x38, 0x30, 0x39, 0xc5, 0x7f, 0x66, 0xbb, + 0x2e, 0xfb, 0x22, 0x5d, 0xba, 0x7a, 0x43, 0x6d, 0x3b, 0xbf, 0x91, 0x83, 0x0b, 0xd9, 0x84, 0x1f, + 0x35, 0x4a, 0x1b, 0x86, 0x9e, 0x50, 0xc2, 0x2d, 0x63, 0x94, 0x36, 0x1e, 0xa7, 0x02, 0xf1, 0x13, + 0x04, 0xb2, 0x03, 0x13, 0xcb, 0x4e, 0x18, 0xdd, 0xa7, 0x4e, 0x10, 0x6d, 0x53, 0x27, 0x1a, 0x42, + 0x83, 0x8d, 0x5f, 0x17, 0xc6, 0x45, 0x6d, 0x4f, 0x52, 0xa6, 0x5f, 0x17, 0xd6, 0xd8, 0xc6, 0x03, + 0xa5, 0x30, 0xc4, 0x40, 0xf9, 0x29, 0x98, 0x6a, 0xd0, 0xb6, 0xd3, 0xdd, 0xf3, 0x03, 0x2a, 0x6c, + 0xe7, 0x37, 0x61, 0x22, 0x06, 0x65, 0x8e, 0x16, 0x3d, 0x59, 0xc3, 0x57, 0x1a, 0x22, 0x11, 0x25, + 0x7a, 0xb2, 0xf9, 0x5b, 0x39, 0xb8, 0x58, 0x6b, 0x8a, 0x83, 0x06, 0x91, 0x20, 0xcf, 0x43, 0x3f, + 0xe1, 0xbc, 0xc9, 0x2c, 0x94, 0x1e, 0x3a, 0x4f, 0xf0, 0x99, 0xfc, 0x50, 0xc4, 0xfa, 0xe1, 0xea, + 0x97, 0xf3, 0xc4, 0x8e, 0xcd, 0x5e, 0x56, 0x82, 0xf3, 0x34, 0x5f, 0xd2, 0x37, 0x61, 0xf4, 0xbe, + 0xdf, 0x72, 0xc5, 0xe2, 0x24, 0xce, 0x2d, 0xf6, 0x10, 0x62, 0x89, 0x14, 0xf3, 0x07, 0x06, 0x4c, + 0xc6, 0x25, 0xc6, 0x22, 0x7c, 0xe2, 0x4d, 0x72, 0x0d, 0xc6, 0x30, 0xa3, 0xf8, 0x69, 0x1d, 0x5c, + 0x34, 0x5a, 0x0c, 0x64, 0x7b, 0xae, 0x25, 0x13, 0xd5, 0x96, 0x18, 0xf9, 0x78, 0x2d, 0x61, 0xfe, + 0x43, 0x3c, 0x12, 0x51, 0x6b, 0xc9, 0x56, 0x22, 0xa5, 0x20, 0xc6, 0x90, 0x05, 0xc9, 0x3d, 0xb5, + 0x2e, 0xc9, 0x0f, 0xec, 0x92, 0x5f, 0xca, 0xc1, 0x78, 0x5c, 0xd8, 0x4f, 0xd9, 0x0d, 0xf4, 0xb8, + 0x5e, 0x43, 0xf9, 0x97, 0x37, 0x14, 0x59, 0x21, 0xdc, 0xb8, 0xbf, 0x04, 0xa3, 0x62, 0x32, 0x19, + 0xa9, 0x73, 0xc1, 0x54, 0xef, 0x26, 0x2f, 0xc4, 0x62, 0x87, 0x86, 0x96, 0xa0, 0x43, 0x07, 0xfe, + 0x2d, 0xba, 0x2d, 0x4e, 0xc8, 0x9e, 0xd9, 0x35, 0x2a, 0xdb, 0x81, 0x3f, 0xa9, 0xd8, 0x50, 0xab, + 0xd3, 0xdf, 0x2d, 0x40, 0x25, 0x4d, 0x72, 0xf2, 0x1d, 0xff, 0xb5, 0xde, 0xb6, 0x78, 0xdd, 0x01, + 0xef, 0xf8, 0x77, 0x7b, 0xdb, 0x16, 0x83, 0x91, 0x6b, 0x50, 0x58, 0x0b, 0xbc, 0x47, 0x58, 0x6b, + 0xf1, 0xb8, 0x45, 0x37, 0xf0, 0x1e, 0xa9, 0x9e, 0xac, 0x2c, 0x1d, 0x37, 0xb4, 0xcb, 0x0d, 0xe5, + 0x71, 0x6e, 0xbe, 0xa1, 0x6d, 0x85, 0xe9, 0x60, 0x32, 0x12, 0x8d, 0x2d, 0x95, 0x75, 0xea, 0x04, + 0xe2, 0x3e, 0xba, 0x10, 0x67, 0xb8, 0x54, 0x6e, 0x23, 0x98, 0x47, 0x8a, 0xb5, 0x54, 0x24, 0xd2, + 0x02, 0xa2, 0x7c, 0xca, 0x09, 0x7c, 0xf2, 0x1e, 0x4f, 0x3e, 0xca, 0x74, 0x4e, 0x65, 0x6d, 0xab, + 0xb3, 0x39, 0x83, 0xef, 0xd3, 0xb4, 0x11, 0xae, 0x41, 0x09, 0x4d, 0x5e, 0x68, 0xc8, 0x28, 0x9e, + 0xc8, 0x4c, 0x7a, 0x0d, 0x03, 0xfa, 0x13, 0xd8, 0xb1, 0x39, 0x23, 0x61, 0x42, 0xde, 0x85, 0x71, + 0xd5, 0xd5, 0x95, 0x3b, 0x64, 0x5e, 0xe1, 0x77, 0x9c, 0x06, 0x04, 0x5d, 0x53, 0x09, 0xcc, 0xcf, + 0xa9, 0xa3, 0x44, 0x2c, 0xda, 0xc7, 0x8e, 0x12, 0xf3, 0x37, 0x50, 0x8d, 0x6f, 0xfb, 0x11, 0x15, + 0xda, 0xcb, 0x33, 0x2b, 0xc7, 0x12, 0x13, 0xf2, 0x88, 0xe6, 0xd3, 0xa2, 0xd5, 0xee, 0x14, 0xcf, + 0x52, 0xff, 0xbe, 0x01, 0xe7, 0x33, 0x69, 0xc9, 0x4d, 0x80, 0x44, 0x47, 0x14, 0xad, 0xc4, 0x43, + 0xf0, 0xc6, 0x50, 0x4b, 0xc1, 0x20, 0x5f, 0x4b, 0x6b, 0x77, 0x27, 0x2f, 0x4e, 0xf2, 0xa1, 0x8a, + 0x49, 0x5d, 0xbb, 0xcb, 0xd0, 0xe9, 0xcc, 0xef, 0xe6, 0x61, 0xba, 0xef, 0x81, 0xc3, 0x13, 0xbc, + 0x08, 0xf6, 0x53, 0xcf, 0x67, 0xf1, 0xe3, 0x8e, 0x1b, 0x83, 0x9e, 0x57, 0xcc, 0x78, 0x4c, 0x0b, + 0xcd, 0x62, 0x22, 0xfa, 0xf3, 0x09, 0x6f, 0x6a, 0x85, 0xd9, 0x0f, 0xaf, 0x7d, 0x76, 0x60, 0x6e, + 0x4f, 0xe1, 0x01, 0xb6, 0x1f, 0xe1, 0xf7, 0xa9, 0x7e, 0x23, 0x07, 0x67, 0xfb, 0xea, 0xfc, 0xcc, + 0xce, 0xba, 0x2f, 0x69, 0xab, 0xdb, 0x0b, 0x83, 0xfa, 0x74, 0x28, 0x2d, 0xe2, 0x7f, 0x18, 0x70, + 0x71, 0x00, 0x25, 0x39, 0x48, 0x0f, 0x22, 0xae, 0x55, 0xdc, 0x3a, 0x3e, 0xc3, 0xa7, 0x32, 0x94, + 0x3e, 0xb1, 0x91, 0xf0, 0x8b, 0x39, 0x80, 0x2d, 0xba, 0xfd, 0x6c, 0x07, 0x30, 0xfa, 0x82, 0x36, + 0x00, 0x14, 0x03, 0xe6, 0xf0, 0xf1, 0x8b, 0x56, 0xd1, 0x90, 0x38, 0x7c, 0xf4, 0xa2, 0xf8, 0x31, + 0x8e, 0x5c, 0xf6, 0x63, 0x1c, 0xe6, 0x36, 0x9c, 0xbb, 0x47, 0xa3, 0x64, 0x25, 0x94, 0x7b, 0xc8, + 0xe3, 0xd9, 0xbe, 0x06, 0x25, 0x81, 0xaf, 0x07, 0x56, 0x97, 0x2e, 0x71, 0x9e, 0x6b, 0x25, 0x08, + 0x26, 0x85, 0x8b, 0x0b, 0xb4, 0x45, 0x23, 0xfa, 0xc9, 0x66, 0xd3, 0x00, 0xc2, 0xab, 0xc2, 0xdf, + 0x68, 0x18, 0x2a, 0x87, 0x13, 0xdb, 0x67, 0x13, 0xce, 0xc7, 0x65, 0x7f, 0x9a, 0x7c, 0x67, 0x99, + 0x2e, 0x21, 0x6e, 0x0b, 0x26, 0x1c, 0x8f, 0x31, 0x22, 0x3e, 0x81, 0xcb, 0x92, 0x60, 0xcb, 0x8b, + 0x4f, 0x62, 0x86, 0xa2, 0x25, 0x6f, 0xc3, 0xb8, 0x42, 0x23, 0xae, 0x1e, 0xe3, 0x69, 0xe7, 0x63, + 0x2f, 0xda, 0xb3, 0x43, 0x0e, 0x57, 0x4f, 0x3b, 0x15, 0x74, 0xf3, 0xab, 0xf0, 0x5c, 0xec, 0xb7, + 0x92, 0x91, 0x75, 0x8a, 0xb9, 0x71, 0x3a, 0xe6, 0x2b, 0x49, 0xb5, 0x96, 0x3a, 0xb1, 0x07, 0xbc, + 0xe4, 0x4d, 0xd4, 0x6a, 0x89, 0xca, 0x5c, 0x51, 0x02, 0xbb, 0x89, 0xb5, 0x28, 0x01, 0x98, 0x6f, + 0x29, 0x85, 0xcd, 0x60, 0xa8, 0x11, 0x1b, 0x69, 0xe2, 0x5f, 0xcc, 0xc1, 0xd4, 0xea, 0xd2, 0xc2, + 0x7c, 0x6c, 0x46, 0xfe, 0x94, 0x45, 0x57, 0xd2, 0xea, 0x36, 0x58, 0xde, 0x98, 0x1b, 0x70, 0x36, + 0xd5, 0x0c, 0xf8, 0x04, 0xcd, 0xbb, 0xdc, 0xbf, 0x24, 0x06, 0xcb, 0x95, 0xe5, 0x42, 0x16, 0xfb, + 0xcd, 0xdb, 0x56, 0x0a, 0xdb, 0xfc, 0xee, 0x68, 0x8a, 0xaf, 0x10, 0x61, 0xaf, 0x41, 0x69, 0x29, + 0x0c, 0x7b, 0x34, 0xd8, 0xb0, 0x96, 0x55, 0x1d, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, + 0x40, 0x5e, 0x85, 0xa2, 0xb8, 0xa1, 0x26, 0x65, 0x02, 0x1e, 0x97, 0xc7, 0x17, 0xdc, 0xac, 0x38, + 0x99, 0xbc, 0x01, 0x65, 0xfe, 0x9f, 0x8f, 0x36, 0xd1, 0xe0, 0x68, 0xab, 0x12, 0xe8, 0x7c, 0x74, + 0x5a, 0x1a, 0x1a, 0xdb, 0x99, 0xc9, 0x37, 0x2e, 0x59, 0x89, 0x0a, 0xc9, 0xce, 0x4c, 0x3e, 0x87, + 0x89, 0x65, 0x52, 0x91, 0xc8, 0x0d, 0xc8, 0xd7, 0xe6, 0x2d, 0x35, 0x96, 0xb4, 0xd3, 0x0c, 0x78, + 0x2c, 0x76, 0xed, 0x19, 0xa9, 0xda, 0xbc, 0x45, 0xe6, 0xa0, 0x88, 0xcf, 0x84, 0xb8, 0x34, 0x10, + 0x5e, 0xaf, 0x38, 0x6a, 0xba, 0x02, 0xa6, 0x9e, 0x3c, 0x4a, 0x3c, 0x32, 0x0b, 0x63, 0x0b, 0x5e, + 0xd8, 0x6d, 0x39, 0x07, 0x22, 0xac, 0x0a, 0x1e, 0x86, 0xb8, 0x1c, 0xa4, 0x8e, 0x33, 0x81, 0x45, + 0x5e, 0x85, 0x91, 0x46, 0xd3, 0xef, 0xb2, 0xdd, 0x56, 0xec, 0xda, 0x12, 0x32, 0x80, 0x16, 0x9b, + 0x81, 0x01, 0xf0, 0xd2, 0x34, 0xbf, 0xfb, 0x55, 0x52, 0x2e, 0x4d, 0xa7, 0xef, 0x7c, 0x09, 0x9c, + 0x7e, 0xe7, 0x43, 0x78, 0x9a, 0xce, 0x87, 0xdb, 0x70, 0xf1, 0x1e, 0xaa, 0xfa, 0x0d, 0x1a, 0x60, + 0x24, 0x4b, 0xfe, 0xe4, 0xd0, 0x86, 0xb5, 0x24, 0xee, 0xbb, 0x5d, 0x3f, 0x3a, 0xac, 0xbe, 0xc4, + 0x77, 0x03, 0x76, 0xc8, 0x71, 0xe4, 0x6b, 0x45, 0xa9, 0x77, 0x16, 0x06, 0x31, 0x22, 0x5f, 0x86, + 0x73, 0x59, 0x49, 0xe2, 0xe6, 0x1b, 0xfa, 0xb5, 0x67, 0x67, 0xa0, 0x3a, 0x96, 0x67, 0x71, 0x20, + 0xcb, 0x50, 0xe1, 0xf0, 0x9a, 0xdb, 0xf6, 0x3a, 0x8b, 0x6d, 0xc7, 0x6b, 0xe1, 0x3d, 0x38, 0x71, + 0x99, 0x51, 0x70, 0x75, 0x58, 0xa2, 0x4d, 0x59, 0xaa, 0xe6, 0x9d, 0x94, 0xa2, 0x44, 0x71, 0xd4, + 0xa8, 0x3d, 0x5c, 0x4e, 0xe6, 0xd4, 0xa7, 0xeb, 0xdc, 0x48, 0xab, 0xdb, 0x31, 0xe7, 0x46, 0x1b, + 0x70, 0x36, 0xd5, 0x0c, 0x52, 0x1c, 0x69, 0xe0, 0xb4, 0x38, 0x4a, 0xd1, 0x58, 0x29, 0x6c, 0xf3, + 0x3f, 0x8e, 0xa6, 0xf8, 0x0a, 0x5b, 0x91, 0x09, 0xa3, 0x5c, 0xda, 0xa8, 0x71, 0xd7, 0xb8, 0x2c, + 0xb2, 0x44, 0x0a, 0xb9, 0x04, 0xf9, 0x46, 0x63, 0x55, 0x8d, 0x0a, 0x19, 0x86, 0xbe, 0xc5, 0x60, + 0xac, 0x87, 0xd0, 0x0c, 0xa4, 0x5c, 0x31, 0x6b, 0xd2, 0x20, 0x12, 0x8f, 0xa0, 0xbe, 0x9c, 0xcc, + 0xe3, 0x42, 0xd2, 0xde, 0x62, 0x1e, 0x27, 0xb3, 0x77, 0x1e, 0x66, 0x6a, 0x61, 0x48, 0x83, 0x88, + 0x87, 0xb2, 0x0f, 0x7b, 0x6d, 0x1a, 0x88, 0xb1, 0x26, 0x64, 0x0c, 0x7f, 0x42, 0xbd, 0x19, 0x5a, + 0x03, 0x11, 0xc9, 0x75, 0x28, 0xd6, 0x7a, 0xae, 0x47, 0x3b, 0x4d, 0xcd, 0xbb, 0xde, 0x11, 0x30, + 0x2b, 0x4e, 0x25, 0x1f, 0xc0, 0x79, 0x41, 0x24, 0x05, 0x8e, 0x68, 0x01, 0x2e, 0x6b, 0xf8, 0x0e, + 0x56, 0xcc, 0x05, 0x29, 0xa6, 0x6c, 0xd1, 0x24, 0xd9, 0x94, 0xa4, 0x06, 0x95, 0x45, 0x3c, 0x27, + 0x95, 0x4f, 0x21, 0xfb, 0x81, 0x08, 0x59, 0x8c, 0x92, 0x8b, 0x9f, 0xa1, 0xda, 0x6e, 0x9c, 0x68, + 0xf5, 0xa1, 0x93, 0x07, 0x70, 0x36, 0x0d, 0x63, 0xf2, 0xb8, 0x94, 0x3c, 0x55, 0xd6, 0xc7, 0x05, + 0x05, 0x73, 0x16, 0x15, 0xd9, 0x86, 0xe9, 0x5a, 0x14, 0x05, 0xde, 0x76, 0x2f, 0xa2, 0x29, 0xd1, + 0x25, 0x0d, 0x8d, 0x71, 0xba, 0x14, 0x5f, 0xcf, 0x89, 0xc1, 0x78, 0xd6, 0x89, 0x29, 0x63, 0x11, + 0x66, 0xf5, 0xb3, 0x23, 0x6e, 0xfc, 0xda, 0xa1, 0x78, 0x11, 0x50, 0x5c, 0x89, 0x92, 0x06, 0xdd, + 0x5a, 0x78, 0xd0, 0x6e, 0xd3, 0x28, 0xc0, 0x93, 0x7b, 0x7c, 0x31, 0xd0, 0x14, 0x3e, 0x40, 0x97, + 0x95, 0x47, 0x3e, 0xf1, 0x55, 0x48, 0xcd, 0x3d, 0x52, 0xe3, 0xa9, 0x2d, 0x1f, 0xe5, 0x21, 0x97, + 0x8f, 0x16, 0x4c, 0x2f, 0x76, 0x9a, 0xc1, 0x01, 0xde, 0xcd, 0x94, 0x85, 0x9b, 0x38, 0xa1, 0x70, + 0xf2, 0x39, 0x90, 0x2b, 0x8e, 0x1c, 0x61, 0x59, 0xc5, 0xeb, 0x67, 0x6c, 0xfe, 0x7f, 0x50, 0x49, + 0xb7, 0xe5, 0xc7, 0x7c, 0xe2, 0xf9, 0x34, 0xae, 0xd9, 0xac, 0xa7, 0xd3, 0x75, 0x21, 0xb3, 0xda, + 0x3b, 0xbe, 0x46, 0x72, 0xaf, 0x5e, 0x79, 0x71, 0x57, 0x7b, 0xbd, 0x57, 0x4e, 0xe3, 0x5c, 0xd6, + 0x34, 0x36, 0x7f, 0x39, 0x07, 0xd3, 0xdc, 0x9b, 0xf4, 0xd9, 0xd7, 0x15, 0xdf, 0xd5, 0x84, 0xb3, + 0xb4, 0x05, 0xa6, 0x6a, 0x77, 0x8c, 0xb6, 0xf8, 0x75, 0x38, 0xdf, 0xd7, 0x14, 0x28, 0xa0, 0x17, + 0xa4, 0x1f, 0x6f, 0x9f, 0x88, 0x9e, 0xc9, 0xce, 0x64, 0xf3, 0xb6, 0xd5, 0x47, 0x61, 0xfe, 0xfd, + 0x5c, 0x1f, 0x7f, 0xa1, 0x37, 0xaa, 0x9a, 0xa0, 0x71, 0x3a, 0x4d, 0x30, 0xf7, 0x91, 0x34, 0xc1, + 0xfc, 0x30, 0x9a, 0xe0, 0x07, 0x30, 0xb1, 0x4e, 0x1d, 0xa6, 0xd1, 0x88, 0xeb, 0x72, 0x05, 0xed, + 0x8d, 0x5d, 0x96, 0x26, 0xe5, 0x4b, 0x7c, 0xd5, 0x36, 0x62, 0x04, 0x4c, 0xb4, 0xf0, 0xfb, 0x73, + 0x96, 0xce, 0x41, 0x5d, 0x34, 0x46, 0x06, 0x2f, 0x1a, 0x66, 0x00, 0xe3, 0x8d, 0xc6, 0xea, 0x96, + 0x13, 0x30, 0x69, 0x11, 0x32, 0x95, 0x51, 0xba, 0x89, 0x1a, 0x89, 0xe0, 0xed, 0xf7, 0x0f, 0x95, + 0x58, 0x4c, 0xb0, 0x48, 0x62, 0xe1, 0x52, 0xc1, 0x3d, 0xe2, 0x04, 0x4c, 0xf3, 0x88, 0x13, 0x30, + 0xf3, 0xef, 0x15, 0xa0, 0xc2, 0x5d, 0x1f, 0xd9, 0xbe, 0x57, 0x04, 0xcf, 0xe9, 0x7b, 0x64, 0xc0, + 0x38, 0xfd, 0x23, 0x03, 0x1f, 0xc1, 0xc7, 0x56, 0xb9, 0x8b, 0x9d, 0x1f, 0xe2, 0x2e, 0xf6, 0x9b, + 0xda, 0x45, 0xe6, 0x42, 0xf2, 0x8a, 0xe5, 0x7e, 0x6f, 0x9b, 0x1e, 0x7f, 0x85, 0xf9, 0x8e, 0x7a, + 0xe3, 0x78, 0x24, 0xf1, 0x3e, 0x41, 0xca, 0x63, 0xee, 0x1a, 0xc7, 0x52, 0x6c, 0xf4, 0x34, 0xfe, + 0xe6, 0x63, 0xff, 0x4f, 0xfd, 0xcd, 0x17, 0x01, 0x94, 0x88, 0x2a, 0xc5, 0xe4, 0x31, 0xcb, 0x93, + 0xa3, 0xa9, 0x28, 0x84, 0xe6, 0x7f, 0x28, 0xc2, 0x74, 0xa3, 0xb1, 0xba, 0xe0, 0x39, 0xbb, 0x1d, + 0x3f, 0x8c, 0xbc, 0xe6, 0x52, 0x67, 0xc7, 0x67, 0x53, 0x78, 0x9d, 0x86, 0xd1, 0xdd, 0x96, 0xff, + 0x58, 0xf5, 0x7d, 0x8e, 0x68, 0x18, 0xd9, 0x3b, 0x2d, 0xff, 0xb1, 0x15, 0x27, 0xb3, 0x25, 0x62, + 0x31, 0x08, 0xe2, 0x77, 0x33, 0x70, 0x89, 0xa0, 0x0c, 0x60, 0x71, 0x38, 0x9b, 0x25, 0x8d, 0x1e, + 0x0f, 0x8d, 0xc1, 0xa3, 0xa1, 0xe1, 0x2c, 0x09, 0x39, 0xc8, 0x92, 0x69, 0x84, 0xf6, 0x0f, 0x58, + 0x21, 0x35, 0x2f, 0x6a, 0x5e, 0xeb, 0x49, 0xb2, 0x78, 0x80, 0x0d, 0xa1, 0xd8, 0xbb, 0x76, 0x17, + 0xe1, 0xaa, 0xf2, 0xde, 0x37, 0x07, 0x22, 0x38, 0xcf, 0x94, 0xcb, 0x7e, 0x9d, 0x63, 0xe4, 0x78, + 0x9d, 0xe3, 0x65, 0x21, 0x13, 0x9e, 0xcf, 0xd0, 0x39, 0xd4, 0xb0, 0xfa, 0x99, 0xcc, 0xc9, 0x2f, + 0x1b, 0xf0, 0x7c, 0x66, 0x4a, 0x3c, 0xb1, 0xf5, 0x4b, 0x03, 0x8a, 0xbc, 0xc0, 0x48, 0x22, 0x9f, + 0xc5, 0x5b, 0x1a, 0x19, 0x59, 0xdb, 0x19, 0x52, 0xe0, 0xf8, 0x9c, 0xc8, 0xbf, 0x30, 0xe0, 0xa2, + 0x86, 0x81, 0x91, 0x00, 0xdb, 0xb4, 0x73, 0xd2, 0x90, 0xfe, 0xf0, 0xe9, 0x0c, 0xe9, 0x17, 0xf5, + 0xba, 0xf0, 0x30, 0xc6, 0x98, 0xbd, 0xba, 0x49, 0x1c, 0x50, 0x42, 0xf2, 0x93, 0x30, 0x8d, 0x49, + 0x52, 0xf5, 0x61, 0xc3, 0x15, 0x47, 0x7f, 0xb9, 0x3e, 0xf7, 0xe7, 0x87, 0xd5, 0x09, 0x2d, 0x01, + 0x6f, 0x14, 0x62, 0x6e, 0xb1, 0xa6, 0xe4, 0x75, 0x76, 0x7c, 0x2d, 0x24, 0x67, 0x9a, 0x19, 0xf9, + 0xd7, 0x06, 0xcc, 0x30, 0x28, 0x2f, 0xf0, 0xdd, 0xc0, 0x6f, 0xc7, 0xe9, 0x27, 0xc4, 0x09, 0x68, + 0x3d, 0x9d, 0x06, 0x7a, 0x19, 0x8b, 0xcc, 0x27, 0xbe, 0xbd, 0x13, 0xf8, 0xed, 0xa4, 0xf8, 0x6a, + 0x13, 0x0d, 0x2c, 0x24, 0xf9, 0x05, 0x03, 0x2e, 0x69, 0x3b, 0x28, 0xf5, 0x3e, 0x5e, 0xca, 0x2e, + 0xa0, 0x26, 0xd5, 0x6f, 0x8a, 0x41, 0x7e, 0x0d, 0x4b, 0x90, 0x2c, 0x09, 0x58, 0x16, 0xbb, 0xcd, + 0xb1, 0x94, 0x22, 0x0c, 0xce, 0xc5, 0xfc, 0x46, 0x0e, 0xc6, 0x95, 0x35, 0x95, 0x7c, 0x1e, 0xca, + 0xab, 0xc1, 0xae, 0xd3, 0xf1, 0x7e, 0xda, 0x51, 0xce, 0x1c, 0x71, 0xcd, 0xf6, 0x15, 0xb8, 0xa5, + 0x61, 0xa1, 0xaf, 0x28, 0x75, 0xda, 0xaa, 0xb6, 0xc7, 0xd6, 0x64, 0x0b, 0xa1, 0xa7, 0x5c, 0x57, + 0xde, 0xcb, 0x58, 0x57, 0x4e, 0x15, 0x20, 0xe3, 0xed, 0xfe, 0xd5, 0x65, 0xf8, 0x78, 0x16, 0xe6, + 0xaf, 0xe6, 0xa0, 0x22, 0x9e, 0x60, 0x97, 0x27, 0x66, 0x9f, 0xae, 0x27, 0x9b, 0xf4, 0xca, 0x1d, + 0xe3, 0x13, 0x52, 0xf8, 0xcd, 0xdf, 0xad, 0xe2, 0x83, 0xda, 0xe9, 0xe6, 0x90, 0x0f, 0x6a, 0xeb, + 0xf0, 0xf4, 0x75, 0xb9, 0x34, 0x95, 0x95, 0xc6, 0x37, 0xff, 0x34, 0x97, 0xe6, 0x2d, 0x4c, 0x08, + 0x2f, 0xc3, 0x18, 0x7f, 0x41, 0x53, 0xde, 0xe8, 0x11, 0x21, 0x17, 0x11, 0x64, 0xc9, 0xb4, 0xd3, + 0x5c, 0x9c, 0x3c, 0xe9, 0x55, 0x75, 0x72, 0x07, 0xca, 0xe8, 0x24, 0x59, 0x73, 0xdd, 0x80, 0x2d, + 0x81, 0x85, 0x24, 0xba, 0xe2, 0x63, 0xba, 0x6d, 0x73, 0x67, 0x4a, 0xc7, 0x75, 0x03, 0x4b, 0xc3, + 0x23, 0xf3, 0x70, 0x4e, 0xf3, 0xc9, 0x95, 0xf4, 0x23, 0xc9, 0x16, 0x29, 0xc2, 0x04, 0x4e, 0x9c, + 0x89, 0x8c, 0x01, 0x78, 0xf9, 0x03, 0xf7, 0xa8, 0xd9, 0xe8, 0x91, 0xe9, 0xe4, 0xa4, 0x97, 0x07, + 0xf5, 0x04, 0x03, 0x4f, 0xb4, 0x9d, 0xae, 0x16, 0xcb, 0x85, 0x23, 0x9a, 0x7f, 0x69, 0xb0, 0xb9, + 0xd6, 0xdc, 0xff, 0x94, 0x5d, 0xe9, 0x64, 0x55, 0x3a, 0xc6, 0xc2, 0xf5, 0xef, 0x0c, 0x7e, 0x29, + 0x4b, 0x0c, 0x9f, 0x37, 0x61, 0x94, 0xbf, 0xd7, 0x29, 0xae, 0x0f, 0xa9, 0x5c, 0x78, 0x42, 0xe2, + 0x94, 0xc1, 0x5f, 0xfd, 0xb4, 0x04, 0x81, 0xaa, 0xf4, 0xe7, 0x86, 0x52, 0xfa, 0x95, 0x70, 0xe2, + 0xc3, 0x3d, 0x53, 0x61, 0x9c, 0x1c, 0x4e, 0xdc, 0xfc, 0x3f, 0x39, 0x5e, 0x1f, 0x51, 0xa8, 0x61, + 0xe3, 0xe4, 0x5e, 0x83, 0x02, 0xbe, 0x0c, 0xaf, 0x04, 0x23, 0x4e, 0xbd, 0x0a, 0x8f, 0xe9, 0x6c, + 0xde, 0xa0, 0xac, 0x55, 0x6f, 0x11, 0xa3, 0x38, 0x56, 0xe7, 0x0d, 0x62, 0xe0, 0x23, 0x10, 0xbe, + 0x4b, 0xd5, 0xe9, 0xd0, 0xd1, 0xdf, 0xeb, 0xc0, 0x74, 0xa6, 0xd1, 0xc7, 0x97, 0x79, 0x54, 0x2b, + 0x7e, 0x7b, 0xc7, 0xb1, 0xf9, 0x25, 0x12, 0x55, 0xda, 0x26, 0xf7, 0x7e, 0x16, 0x61, 0x52, 0x0f, + 0x31, 0x22, 0x2c, 0x6d, 0x18, 0x16, 0x20, 0x15, 0x9e, 0x44, 0xb5, 0xe9, 0xe8, 0x44, 0x6c, 0xc7, + 0xa4, 0xc5, 0x91, 0x50, 0x63, 0xa7, 0xf3, 0xa0, 0x6e, 0x76, 0x7f, 0x00, 0x24, 0x9d, 0x44, 0x39, + 0x25, 0xfe, 0x1c, 0x54, 0xc4, 0xcc, 0x8c, 0x2f, 0x74, 0xa3, 0x3d, 0x63, 0x69, 0xc1, 0x52, 0x67, + 0x53, 0xd3, 0x73, 0x03, 0x0b, 0xa1, 0xe6, 0x77, 0x0c, 0xb8, 0x24, 0xde, 0x21, 0xb5, 0x68, 0x18, + 0x05, 0x1e, 0xbf, 0x1f, 0x8e, 0xe3, 0xf1, 0xf3, 0xe4, 0x6d, 0x19, 0x2f, 0x52, 0x17, 0x90, 0xe9, + 0x3c, 0xea, 0x13, 0x62, 0x50, 0x8e, 0x60, 0xc4, 0x48, 0x19, 0x27, 0xf2, 0x4d, 0x11, 0x27, 0x32, + 0x77, 0x3c, 0x71, 0x3c, 0x2f, 0x5c, 0xda, 0x91, 0xf1, 0x21, 0xbf, 0x9d, 0x83, 0xf3, 0x19, 0xc5, + 0xda, 0xfc, 0xfc, 0x33, 0x2a, 0x1c, 0xea, 0x9a, 0x70, 0x90, 0x81, 0x84, 0x07, 0x36, 0x7c, 0xa6, + 0xac, 0xf8, 0x6d, 0x03, 0x2e, 0xea, 0xa3, 0x47, 0x18, 0x60, 0x37, 0x6f, 0x93, 0xb7, 0x60, 0xf4, + 0x3e, 0x75, 0x5c, 0x2a, 0xef, 0x1d, 0xc6, 0x41, 0x39, 0xc5, 0x91, 0x28, 0x4f, 0xe4, 0x6c, 0xff, + 0x94, 0x4f, 0xe5, 0x33, 0x96, 0x20, 0x21, 0x0b, 0xa2, 0x70, 0xdc, 0x27, 0xc3, 0x94, 0xee, 0x09, + 0x59, 0x59, 0x1d, 0x63, 0x0d, 0xfa, 0x7d, 0x03, 0x9e, 0x3b, 0x86, 0x86, 0x75, 0x1c, 0xeb, 0x7a, + 0xb5, 0xe3, 0x70, 0x61, 0x41, 0x28, 0x79, 0x17, 0xa6, 0xd6, 0x85, 0xea, 0x2a, 0xbb, 0x43, 0x79, + 0x94, 0x45, 0x6a, 0xb5, 0xb6, 0xec, 0x97, 0x34, 0x32, 0xb9, 0x0e, 0xc5, 0xfb, 0x7e, 0x18, 0x75, + 0x92, 0x18, 0x6f, 0x68, 0xf2, 0xde, 0x13, 0x30, 0x2b, 0x4e, 0x65, 0x6a, 0x81, 0x5e, 0x4c, 0xe1, + 0x03, 0xf8, 0x22, 0x8c, 0x32, 0x9c, 0xd8, 0xa4, 0x84, 0xe3, 0x00, 0x5f, 0xc9, 0xf4, 0x5c, 0x4b, + 0x24, 0xc5, 0xc6, 0xcc, 0x5c, 0xe6, 0x51, 0xfd, 0x37, 0x0c, 0xa8, 0xe8, 0xbc, 0x3f, 0x6e, 0xd7, + 0xbc, 0xa3, 0x75, 0xcd, 0x73, 0xd9, 0x5d, 0x33, 0xb8, 0x4f, 0xfa, 0xc2, 0x2d, 0x0d, 0xd5, 0x17, + 0x26, 0x8c, 0x2e, 0xf8, 0x6d, 0xc7, 0xeb, 0xa8, 0x21, 0x82, 0x5c, 0x84, 0x58, 0x22, 0x45, 0x69, + 0xad, 0xfc, 0xc0, 0xd6, 0x32, 0xbf, 0x55, 0x80, 0x4b, 0x16, 0xdd, 0xf5, 0x98, 0x82, 0xb4, 0x11, + 0x7a, 0x9d, 0x5d, 0xcd, 0x91, 0xc2, 0x4c, 0x35, 0xb8, 0x70, 0x1f, 0x67, 0x90, 0xb8, 0xbd, 0x5f, + 0x85, 0x22, 0x93, 0xd2, 0x4a, 0x9b, 0xa3, 0x99, 0x00, 0x03, 0xdd, 0xf1, 0x7e, 0x95, 0xc9, 0xe4, + 0x86, 0x58, 0x43, 0x94, 0x0b, 0x3e, 0x6c, 0x0d, 0xf9, 0xe1, 0x61, 0x15, 0xf8, 0xab, 0x08, 0x2c, + 0x55, 0xac, 0x23, 0xb1, 0x52, 0x55, 0x18, 0xa0, 0x54, 0x3d, 0x84, 0x73, 0x35, 0x97, 0xcb, 0x27, + 0xa7, 0xb5, 0x16, 0x78, 0x9d, 0xa6, 0xd7, 0x75, 0x5a, 0x52, 0x29, 0x47, 0x63, 0x91, 0x13, 0xa7, + 0xdb, 0xdd, 0x18, 0xc1, 0xca, 0x24, 0x63, 0xd5, 0x58, 0x58, 0x69, 0xf0, 0x38, 0x66, 0xdc, 0x02, + 0x84, 0xd5, 0x70, 0x3b, 0x21, 0x0f, 0x64, 0x66, 0xc5, 0xc9, 0xa8, 0xce, 0xe1, 0x1d, 0xbf, 0xf5, + 0xe5, 0xc6, 0x03, 0x71, 0x67, 0x4e, 0xfa, 0x1f, 0xf3, 0x2b, 0x81, 0x51, 0x2b, 0x44, 0xa3, 0xb5, + 0x86, 0x97, 0xd0, 0x35, 0x1a, 0xf7, 0x19, 0x5d, 0xb1, 0x8f, 0x2e, 0x0c, 0xf7, 0x54, 0x3a, 0x8e, + 0x47, 0x66, 0x01, 0xb8, 0x07, 0x27, 0x0e, 0x88, 0x52, 0xa2, 0xfc, 0x05, 0x08, 0xe5, 0xca, 0x9f, + 0x82, 0x42, 0xde, 0x86, 0xb3, 0x8b, 0xf3, 0x73, 0xf2, 0x32, 0xdc, 0x82, 0xdf, 0xec, 0xb1, 0x7d, + 0x33, 0x5e, 0xce, 0x2c, 0xf3, 0x3e, 0xa4, 0xcd, 0x39, 0x36, 0x0a, 0xb2, 0xd0, 0xc4, 0x95, 0x38, + 0x7e, 0xa1, 0x7a, 0xde, 0x77, 0x69, 0xb8, 0x79, 0xeb, 0x53, 0x76, 0x25, 0x4e, 0xa9, 0x1b, 0xce, + 0xb6, 0x5b, 0x99, 0x33, 0xf3, 0x6f, 0xe1, 0x95, 0xb8, 0x3e, 0x5c, 0xf2, 0x63, 0x30, 0x82, 0x9f, + 0x62, 0xc5, 0x3d, 0x9b, 0xc1, 0x36, 0x59, 0x6d, 0x9b, 0x3c, 0x24, 0x15, 0x12, 0x90, 0xa5, 0xe4, + 0xcd, 0x99, 0x53, 0x5c, 0xec, 0x10, 0x51, 0x19, 0xf4, 0xc7, 0xc6, 0x5c, 0x28, 0xab, 0x19, 0xb2, + 0x31, 0x72, 0xdf, 0x09, 0xf7, 0xa8, 0x3b, 0x2f, 0x9f, 0x28, 0x2e, 0xf3, 0x31, 0xb2, 0x87, 0x50, + 0x7c, 0x08, 0xcd, 0x52, 0x50, 0x98, 0x74, 0x58, 0x0a, 0x37, 0x42, 0x51, 0x14, 0xb1, 0x0b, 0xf2, + 0x70, 0xf7, 0xea, 0x5a, 0x22, 0x09, 0xa5, 0xa5, 0xb4, 0x13, 0x06, 0x4e, 0x73, 0x9f, 0x06, 0x9b, + 0xb7, 0x3e, 0x09, 0x69, 0xa9, 0xe7, 0x71, 0x4c, 0x9f, 0xfc, 0x5a, 0x31, 0x8e, 0xa8, 0xa6, 0x21, + 0x33, 0x1d, 0x31, 0x71, 0x47, 0x33, 0x12, 0x1d, 0x31, 0x71, 0x47, 0x53, 0x75, 0xc4, 0x18, 0x35, + 0x0e, 0x78, 0x9f, 0x3b, 0x21, 0xe0, 0xfd, 0x80, 0x37, 0x36, 0xe4, 0x4d, 0x86, 0x4f, 0xd1, 0x73, + 0x43, 0x5f, 0x84, 0x72, 0x2d, 0x8a, 0x9c, 0xe6, 0x1e, 0x75, 0xf1, 0x61, 0x05, 0xc5, 0x0b, 0xc6, + 0x11, 0x70, 0xd5, 0x47, 0x5a, 0xc5, 0x55, 0x9e, 0x1b, 0x1b, 0x1b, 0xe2, 0xb9, 0xb1, 0x59, 0x18, + 0x5b, 0xea, 0x3c, 0xf2, 0x58, 0x9b, 0x14, 0x93, 0x88, 0x48, 0x1e, 0x07, 0xe9, 0x6f, 0x54, 0x21, + 0x88, 0xbc, 0xa9, 0x68, 0x10, 0xa5, 0x44, 0x95, 0xe7, 0xdb, 0x2c, 0x5b, 0x2a, 0x12, 0xea, 0xf1, + 0x83, 0x44, 0x27, 0x77, 0x60, 0x4c, 0xee, 0x9e, 0x21, 0x51, 0xdf, 0x05, 0xa5, 0xc3, 0x53, 0xb4, + 0x20, 0x4c, 0x62, 0xf7, 0xfc, 0xb6, 0x7e, 0x69, 0x72, 0x5c, 0x09, 0x46, 0xa2, 0x5c, 0x9a, 0xd4, + 0x82, 0x91, 0x28, 0xd7, 0x27, 0xe3, 0xcd, 0x50, 0xf9, 0xc4, 0xcd, 0xd0, 0x26, 0x94, 0xd7, 0x9c, + 0x20, 0xf2, 0xd8, 0x72, 0xd4, 0x89, 0x78, 0x34, 0xcc, 0x64, 0xaf, 0xae, 0x24, 0xd5, 0x5f, 0x90, + 0x41, 0x39, 0xba, 0x0a, 0xbe, 0x1e, 0xcd, 0x21, 0x81, 0x93, 0x95, 0x0c, 0xb7, 0x7a, 0x11, 0xbb, + 0x19, 0x4d, 0xe7, 0x8a, 0xe1, 0x4a, 0xd4, 0x48, 0xb5, 0x8c, 0xf6, 0x7b, 0xe4, 0xdf, 0xe6, 0x7d, + 0x80, 0x7b, 0xc6, 0x29, 0x64, 0x83, 0x21, 0xb5, 0x50, 0xaf, 0x48, 0x6d, 0x1c, 0x63, 0x44, 0xf2, + 0x35, 0x28, 0xb3, 0xff, 0x18, 0x1a, 0xd0, 0xa3, 0x3c, 0xda, 0x65, 0xe2, 0x66, 0xad, 0x4f, 0x68, + 0x1e, 0x3f, 0xb0, 0x41, 0x23, 0x3e, 0x81, 0x91, 0x71, 0xda, 0xf0, 0xa2, 0x71, 0x33, 0x7f, 0x60, + 0xc0, 0xc5, 0x01, 0x3c, 0x86, 0x7e, 0x68, 0x70, 0x36, 0x59, 0x90, 0x94, 0xbd, 0xb9, 0x58, 0x90, + 0xd4, 0x81, 0x21, 0x97, 0xa6, 0xec, 0x38, 0x95, 0xf9, 0x4f, 0x2c, 0x4e, 0xa5, 0x79, 0x68, 0xc0, + 0xb8, 0xd2, 0xb3, 0x4f, 0xf1, 0xfd, 0xa0, 0x6b, 0x22, 0x60, 0x73, 0x3e, 0xc1, 0x6b, 0xa7, 0xf6, + 0xe1, 0x18, 0xa0, 0xf9, 0xeb, 0x00, 0xcb, 0x4e, 0x18, 0xd5, 0x9a, 0x91, 0xf7, 0x88, 0x0e, 0x21, + 0xc6, 0x92, 0xe8, 0x34, 0x0e, 0xc6, 0x3f, 0x67, 0x64, 0x7d, 0xd1, 0x69, 0x62, 0x86, 0xe6, 0x0a, + 0x8c, 0x36, 0xfc, 0x20, 0xaa, 0x1f, 0xf0, 0xb5, 0x69, 0x81, 0x86, 0x4d, 0xd5, 0x42, 0xe7, 0xe1, + 0x5e, 0xbd, 0x69, 0x89, 0x24, 0xa6, 0x20, 0xde, 0xf5, 0x68, 0xcb, 0x55, 0xcf, 0x9c, 0x76, 0x18, + 0xc0, 0xe2, 0xf0, 0x1b, 0xef, 0xc1, 0x94, 0x8c, 0x19, 0xbb, 0xbe, 0xdc, 0xc0, 0x1a, 0x4c, 0xc1, + 0xf8, 0xe6, 0xa2, 0xb5, 0x74, 0xf7, 0x2b, 0xf6, 0xdd, 0x8d, 0xe5, 0xe5, 0xca, 0x19, 0x32, 0x01, + 0x25, 0x01, 0x98, 0xaf, 0x55, 0x0c, 0x52, 0x86, 0xe2, 0xd2, 0x4a, 0x63, 0x71, 0x7e, 0xc3, 0x5a, + 0xac, 0xe4, 0x6e, 0xbc, 0x0c, 0x93, 0x89, 0xd3, 0x01, 0x06, 0x26, 0x18, 0x83, 0xbc, 0x55, 0xdb, + 0xaa, 0x9c, 0x21, 0x00, 0xa3, 0x6b, 0x0f, 0xe6, 0x1b, 0xb7, 0x6e, 0x55, 0x8c, 0x1b, 0x9f, 0x83, + 0x69, 0xb4, 0xda, 0x2d, 0x33, 0x25, 0xba, 0x43, 0x03, 0xcc, 0xa9, 0x0c, 0xc5, 0x06, 0xed, 0x3a, + 0x81, 0x13, 0x51, 0x9e, 0xcd, 0xc3, 0x5e, 0x2b, 0xf2, 0xba, 0x2d, 0xfa, 0xa4, 0x62, 0xdc, 0x78, + 0x13, 0xa6, 0x2c, 0xbf, 0x17, 0x79, 0x9d, 0x5d, 0x19, 0xf9, 0x9d, 0x9c, 0x87, 0xe9, 0x8d, 0x95, + 0xda, 0xc3, 0xfa, 0xd2, 0xbd, 0x8d, 0xd5, 0x8d, 0x86, 0xfd, 0xb0, 0xb6, 0x3e, 0x7f, 0xbf, 0x72, + 0x86, 0x15, 0xf8, 0xe1, 0x6a, 0x63, 0xdd, 0xb6, 0x16, 0xe7, 0x17, 0x57, 0xd6, 0x2b, 0xc6, 0x8d, + 0x5f, 0x31, 0x60, 0x52, 0x7f, 0xc4, 0x96, 0x5c, 0x85, 0x2b, 0x1b, 0x8d, 0x45, 0xcb, 0x5e, 0x5f, + 0x7d, 0xb0, 0xb8, 0x62, 0x6f, 0x34, 0x6a, 0xf7, 0x16, 0xed, 0x8d, 0x95, 0xc6, 0xda, 0xe2, 0xfc, + 0xd2, 0xdd, 0xa5, 0xc5, 0x85, 0xca, 0x19, 0x52, 0x85, 0xe7, 0x14, 0x0c, 0x6b, 0x71, 0x7e, 0x75, + 0x73, 0xd1, 0xb2, 0xd7, 0x6a, 0x8d, 0xc6, 0xd6, 0xaa, 0xb5, 0x50, 0x31, 0xc8, 0x65, 0xb8, 0x90, + 0x81, 0xf0, 0xf0, 0x6e, 0xad, 0x92, 0xeb, 0x4b, 0x5b, 0x59, 0xdc, 0xaa, 0x2d, 0xdb, 0xf5, 0xd5, + 0xf5, 0x4a, 0xfe, 0xc6, 0x7b, 0x4c, 0x0b, 0x49, 0x5e, 0x99, 0x22, 0x45, 0x28, 0xac, 0xac, 0xae, + 0x2c, 0x56, 0xce, 0x90, 0x71, 0x18, 0x5b, 0x5b, 0x5c, 0x59, 0x58, 0x5a, 0xb9, 0xc7, 0x9b, 0xb5, + 0xb6, 0xb6, 0x66, 0xad, 0x6e, 0x2e, 0x2e, 0x54, 0x72, 0xac, 0xed, 0x16, 0x16, 0x57, 0x58, 0xc9, + 0xf2, 0x37, 0x4c, 0xfe, 0xb2, 0x82, 0x16, 0x18, 0x9c, 0xb5, 0xd6, 0xe2, 0x97, 0xd7, 0x17, 0x57, + 0x1a, 0x4b, 0xab, 0x2b, 0x95, 0x33, 0x37, 0xae, 0xa4, 0x70, 0x64, 0x4f, 0x34, 0x1a, 0xf7, 0x2b, + 0x67, 0x6e, 0x7c, 0x0d, 0xca, 0xea, 0x22, 0x4c, 0x2e, 0xc2, 0x59, 0xf5, 0x7b, 0x8d, 0x76, 0x5c, + 0xaf, 0xb3, 0x5b, 0x39, 0x93, 0x4e, 0xb0, 0x7a, 0x9d, 0x0e, 0x4b, 0xc0, 0xca, 0xab, 0x09, 0xeb, + 0x34, 0x68, 0x7b, 0x1d, 0xb6, 0xbe, 0x56, 0x72, 0xf5, 0xca, 0xf7, 0xfe, 0xe2, 0x85, 0x33, 0xdf, + 0xfb, 0xfe, 0x0b, 0xc6, 0x9f, 0x7e, 0xff, 0x05, 0xe3, 0xbf, 0x7e, 0xff, 0x05, 0x63, 0x7b, 0x14, + 0x07, 0xfa, 0xed, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x87, 0xf8, 0xbd, 0x1a, 0x9a, 0xbd, 0x00, + 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -19261,7 +19264,7 @@ func (m *GithubConnectorSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SAMLAttributesToRolesWarnings) Marshal() (dAtA []byte, err error) { +func (m *SSOWarnings) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -19271,12 +19274,12 @@ func (m *SAMLAttributesToRolesWarnings) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SAMLAttributesToRolesWarnings) MarshalTo(dAtA []byte) (int, error) { +func (m *SSOWarnings) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SAMLAttributesToRolesWarnings) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SSOWarnings) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -19431,7 +19434,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x4a + dAtA[i] = 0x52 } } { @@ -19443,7 +19446,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x42 + dAtA[i] = 0x4a if m.SAMLAssertionInfo != nil { { size := m.SAMLAssertionInfo.Size() @@ -19454,7 +19457,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x3a + dAtA[i] = 0x42 } { size := m.SAMLAttributeStatements.Size() @@ -19465,7 +19468,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x3a if m.SAMLAttributesToRolesWarnings != nil { { size, err := m.SAMLAttributesToRolesWarnings.MarshalToSizedBuffer(dAtA[:i]) @@ -19476,7 +19479,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 } if len(m.SAMLAttributesToRoles) > 0 { for iNdEx := len(m.SAMLAttributesToRoles) - 1; iNdEx >= 0; iNdEx-- { @@ -19489,7 +19492,7 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } } if m.CreateUserParams != nil { @@ -19502,21 +19505,34 @@ func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTypes(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } - if len(m.Success) > 0 { - i -= len(m.Success) - copy(dAtA[i:], m.Success) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Success))) + if m.Success { i-- - dAtA[i] = 0x12 + if m.Success { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if m.TestFlow { + i-- + if m.TestFlow { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -25151,7 +25167,7 @@ func (m *GithubConnectorSpecV3) Size() (n int) { return n } -func (m *SAMLAttributesToRolesWarnings) Size() (n int) { +func (m *SSOWarnings) Size() (n int) { if m == nil { return 0 } @@ -25228,13 +25244,15 @@ func (m *SSODiagnosticInfo) Size() (n int) { } var l int _ = l + if m.TestFlow { + n += 2 + } l = len(m.Error) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - l = len(m.Success) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) + if m.Success { + n += 2 } if m.CreateUserParams != nil { l = m.CreateUserParams.Size() @@ -54046,7 +54064,7 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLAttributesToRolesWarnings) Unmarshal(dAtA []byte) error { +func (m *SSOWarnings) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -54069,10 +54087,10 @@ func (m *SAMLAttributesToRolesWarnings) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLAttributesToRolesWarnings: wiretype end group for non-group") + return fmt.Errorf("proto: SSOWarnings: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLAttributesToRolesWarnings: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SSOWarnings: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -54486,6 +54504,26 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TestFlow", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TestFlow = bool(v != 0) + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } @@ -54517,11 +54555,11 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 2 { + case 3: + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -54531,25 +54569,13 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Success = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: + m.Success = bool(v != 0) + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field CreateUserParams", wireType) } @@ -54585,7 +54611,7 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRoles", wireType) } @@ -54619,7 +54645,7 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRolesWarnings", wireType) } @@ -54649,13 +54675,13 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.SAMLAttributesToRolesWarnings == nil { - m.SAMLAttributesToRolesWarnings = &SAMLAttributesToRolesWarnings{} + m.SAMLAttributesToRolesWarnings = &SSOWarnings{} } if err := m.SAMLAttributesToRolesWarnings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributeStatements", wireType) } @@ -54688,7 +54714,7 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 7: + case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLAssertionInfo", wireType) } @@ -54717,13 +54743,13 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var v AssertionInfoWrapper + var v AssertionInfo m.SAMLAssertionInfo = &v if err := m.SAMLAssertionInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 8: + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLTraitsFromAssertions", wireType) } @@ -54756,7 +54782,7 @@ func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 9: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SAMLConnectorTraitMapping", wireType) } diff --git a/api/types/types.proto b/api/types/types.proto index 14069f38b51c7..1b715c345bbce 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -2634,9 +2634,8 @@ message GithubConnectorSpecV3 { string Display = 5 [ (gogoproto.jsontag) = "display" ]; } -// SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the SAML -// attributes to roles. -message SAMLAttributesToRolesWarnings { +// SSOWarnings conveys a user-facing main message along with auxiliary warnings. +message SSOWarnings { // Message is main user-facing message to be shown. string Message = 1 [ (gogoproto.jsontag) = "message,omitempty" ]; // Warnings is a set of distinct warnings to be reported. @@ -2672,47 +2671,50 @@ message CreateUserParams { // SSODiagnosticInfo is a single SSO diagnostic info entry. message SSODiagnosticInfo { + // TestFlow indicates the SSO flow was a test one. + bool TestFlow = 1 [ (gogoproto.jsontag) = "test_flow" ]; + // Error stores user-friendly error message. - string Error = 1 [ (gogoproto.jsontag) = "error" ]; + string Error = 2 [ (gogoproto.jsontag) = "error" ]; // Success if present, marks the flow as finished with success. - string Success = 2 [ (gogoproto.jsontag) = "success" ]; + bool Success = 3 [ (gogoproto.jsontag) = "success" ]; // CreateUserParams represents the user creation parameters as called during SSO login flow. - CreateUserParams CreateUserParams = 3 [ (gogoproto.jsontag) = "create_user_params,omitempty" ]; + CreateUserParams CreateUserParams = 4 [ (gogoproto.jsontag) = "create_user_params,omitempty" ]; // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login // flow. - repeated AttributeMapping SAMLAttributesToRoles = 4 + repeated AttributeMapping SAMLAttributesToRoles = 5 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes_to_roles,omitempty" ]; // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the // SAML attributes to roles. - SAMLAttributesToRolesWarnings SAMLAttributesToRolesWarnings = 5 + SSOWarnings SAMLAttributesToRolesWarnings = 6 [ (gogoproto.jsontag) = "saml_attributes_to_roles_warnings,omitempty" ]; // SAMLAttributeStatements represents SAML attribute statements. - wrappers.LabelValues SAMLAttributeStatements = 6 [ + wrappers.LabelValues SAMLAttributeStatements = 7 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "saml_attribute_statements,omitempty", (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" ]; // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow. - bytes SAMLAssertionInfo = 7 [ + bytes SAMLAssertionInfo = 8 [ (gogoproto.jsontag) = "saml_assertion_info,omitempty", - (gogoproto.customtype) = "AssertionInfoWrapper" + (gogoproto.customtype) = "AssertionInfo" ]; // SAMLTraitsFromAssertions represents traits translated from SAML assertions. - wrappers.LabelValues SAMLTraitsFromAssertions = 8 [ + wrappers.LabelValues SAMLTraitsFromAssertions = 9 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "saml_traits_from_assertions,omitempty", (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits" ]; // SAMLConnectorTraitMapping represents connector-specific trait mapping. - repeated TraitMapping SAMLConnectorTraitMapping = 9 [ + repeated TraitMapping SAMLConnectorTraitMapping = 10 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "saml_connector_trait_mapping,omitempty" ]; diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 0cc68e61a0452..2f0ae46ccc554 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -125,6 +125,10 @@ func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services. func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLAuthRequest) (types.SAMLConnector, *saml2.SAMLServiceProvider, error) { if req.SSOTestFlow { + if req.ConnectorSpec == nil { + return nil, nil, trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") + } + // stateless test flow connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) if err != nil { @@ -178,29 +182,6 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr return serviceProvider, nil } -type ssoDiagContext struct { - authKind string - createSSODiagnosticInfo func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error - - requestID string - testFlow bool - info types.SSODiagnosticInfo -} - -func (c *ssoDiagContext) Write(ctx context.Context) { - err := c.createSSODiagnosticInfo(ctx, c.authKind, c.requestID, c.info) - if err != nil { - log.WithError(err).WithField("requestID", c.requestID).Warn("failed to write SSO diag info data") - } -} - -func (a *Server) newSSODiagContext(authKind string) *ssoDiagContext { - return &ssoDiagContext{ - authKind: authKind, - createSSODiagnosticInfo: a.Identity.CreateSSODiagnosticInfo, - } -} - func (a *Server) calculateSAMLUser(diagCtx *ssoDiagContext, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) { p := createUserParams{ connectorName: connector.GetName(), @@ -217,12 +198,12 @@ func (a *Server) calculateSAMLUser(diagCtx *ssoDiagContext, connector types.SAML if len(p.roles) == 0 { if len(warnings) != 0 { log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings) - diagCtx.info.SAMLAttributesToRolesWarnings = &types.SAMLAttributesToRolesWarnings{ + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{ Message: "No roles mapped for the user", Warnings: warnings, } } else { - diagCtx.info.SAMLAttributesToRolesWarnings = &types.SAMLAttributesToRolesWarnings{ + diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{ Message: "No roles mapped for the user. The mappings may contain typos.", } } @@ -389,7 +370,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) diagCtx.info.Error = trace.UserMessage(err) } - diagCtx.Write(ctx) + diagCtx.writeToBackend(ctx) attributeStatements := diagCtx.info.SAMLAttributeStatements if attributeStatements != nil { @@ -404,7 +385,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) if err != nil { event.Code = events.UserSSOLoginFailureCode - if diagCtx.testFlow { + if diagCtx.info.TestFlow { event.Code = events.UserSSOTestFlowLoginFailureCode } event.Status.Success = false @@ -419,7 +400,7 @@ func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) event.Status.Success = true event.User = auth.Username event.Code = events.UserSSOLoginCode - if diagCtx.testFlow { + if diagCtx.info.TestFlow { event.Code = events.UserSSOTestFlowLoginCode } @@ -442,9 +423,9 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID) if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to get SAML Auth Request") + return nil, trace.Wrap(err, "Failed to get SAML Auth Request") } - diagCtx.testFlow = request.SSOTestFlow + diagCtx.info.TestFlow = request.SSOTestFlow connector, provider, err := a.getConnectorAndProvider(ctx, *request) if err != nil { @@ -456,8 +437,8 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte return nil, trace.AccessDenied("received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err).AddUserMessage("Failed to retrieve assertion info. This may indicate IdP configuration error.") } - if diagCtx.testFlow { - diagCtx.info.SAMLAssertionInfo = (*types.AssertionInfoWrapper)(assertionInfo) + if assertionInfo != nil { + diagCtx.info.SAMLAssertionInfo = (*types.AssertionInfo)(assertionInfo) } if assertionInfo.WarningInfo.InvalidTime { @@ -511,7 +492,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte user, err := a.createSAMLUser(params, request.SSOTestFlow) if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to create user from provided parameters.") + return nil, trace.Wrap(err, "Failed to create user from provided parameters.") } // Auth was successful, return session, certificate, etc. to caller. @@ -526,7 +507,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte // In test flow skip signing and creating web sessions. if request.SSOTestFlow { - diagCtx.info.Success = "test flow" + diagCtx.info.Success = true return auth, nil } @@ -541,7 +522,7 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte }) if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to create web session.") + return nil, trace.Wrap(err, "Failed to create web session.") } auth.Session = session @@ -551,11 +532,11 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte if len(request.PublicKey) != 0 { sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster) if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to create session certificate.") + return nil, trace.Wrap(err, "Failed to create session certificate.") } clusterName, err := a.GetClusterName() if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to obtain cluster name.") + return nil, trace.Wrap(err, "Failed to obtain cluster name.") } auth.Cert = sshCert auth.TLSCert = tlsCert @@ -566,11 +547,11 @@ func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagConte DomainName: clusterName.GetClusterName(), }, false) if err != nil { - return nil, trace.Wrap(err).AddUserMessage("Failed to obtain cluster's host CA.") + return nil, trace.Wrap(err, "Failed to obtain cluster's host CA.") } auth.HostSigners = append(auth.HostSigners, authority) } - diagCtx.info.Success = "regular flow" + diagCtx.info.Success = true return auth, nil } diff --git a/lib/auth/sso_diag_context.go b/lib/auth/sso_diag_context.go new file mode 100644 index 0000000000000..a3d873583432b --- /dev/null +++ b/lib/auth/sso_diag_context.go @@ -0,0 +1,53 @@ +/* +Copyright 2022 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 auth + +import ( + "context" + "github.com/gravitational/teleport/api/types" +) + +// ssoDiagContext is a helper type for accumulating the SSO diagnostic info prior to writing it to the backend. +type ssoDiagContext struct { + // authKind is auth kind such as types.KindSAML + authKind string + // createSSODiagnosticInfo is a callback to create the types.SSODiagnosticInfo record in the backend. + createSSODiagnosticInfo func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error + // requestID is the ID of the auth request being processed. + requestID string + // info accumulates SSO diagnostic info + info types.SSODiagnosticInfo +} + +// writeToBackend saves the accumulated SSO diagnostic information to the backend. +func (c *ssoDiagContext) writeToBackend(ctx context.Context) { + if c.info.TestFlow { + err := c.createSSODiagnosticInfo(ctx, c.authKind, c.requestID, c.info) + if err != nil { + log.WithError(err).WithField("requestID", c.requestID).Warn("failed to write SSO diag info data") + } + } +} + +// newSSODiagContext returns new ssoDiagContext referencing particular Server. +// authKind must be one of supported auth kinds (e.g. types.KindSAML). +func (a *Server) newSSODiagContext(authKind string) *ssoDiagContext { + return &ssoDiagContext{ + authKind: authKind, + createSSODiagnosticInfo: a.Identity.CreateSSODiagnosticInfo, + } +} From 49587f3ae17aac148b87b3e86debbb59ee3987e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 25 Apr 2022 14:21:46 +0200 Subject: [PATCH 42/50] Add check against empty ConnectorID. --- lib/auth/saml.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/auth/saml.go b/lib/auth/saml.go index 2f0ae46ccc554..aa0f13153deaf 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -129,6 +129,10 @@ func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLA return nil, nil, trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") } + if req.ConnectorID == "" { + return nil, nil, trace.BadParameter("ConnectorID cannot be empty") + } + // stateless test flow connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec) if err != nil { @@ -146,6 +150,7 @@ func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLA if err != nil { return nil, nil, trace.Wrap(err) } + return connector, provider, nil } From a98fbf07668c043ec5e21033cc5a7b3423691c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 25 Apr 2022 14:22:08 +0200 Subject: [PATCH 43/50] Add several tests. --- lib/auth/saml_test.go | 400 ++++++++++++++++++++++++++++++ lib/auth/sso_diag_context_test.go | 38 +++ lib/services/local/users_test.go | 38 +++ 3 files changed, 476 insertions(+) create mode 100644 lib/auth/sso_diag_context_test.go diff --git a/lib/auth/saml_test.go b/lib/auth/saml_test.go index bbbbc602deeed..60bd679e958ce 100644 --- a/lib/auth/saml_test.go +++ b/lib/auth/saml_test.go @@ -18,17 +18,28 @@ package auth import ( "context" + "crypto/rand" + "crypto/rsa" + "crypto/x509/pkix" + "encoding/base64" + "encoding/xml" "net/url" "testing" "time" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" authority "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/backend/lite" + "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" "github.com/jonboulle/clockwork" + saml2 "github.com/russellhaering/gosaml2" + samltypes "github.com/russellhaering/gosaml2/types" "github.com/stretchr/testify/require" ) @@ -56,6 +67,21 @@ func TestCreateSAMLUser(t *testing.T) { a, err := NewServer(authConfig) require.NoError(t, err) + // Dry-run creation of SAML user. + user, err := a.createSAMLUser(&createUserParams{ + connectorName: "samlService", + username: "foo@example.com", + logins: []string{"foo"}, + roles: []string{"admin"}, + sessionTTL: 1 * time.Minute, + }, true) + require.NoError(t, err) + require.Equal(t, "foo@example.com", user.GetName()) + + // Dry-run must not create a user. + _, err = a.GetUser("foo@example.com", false) + require.Error(t, err) + // Create SAML user with 1 minute expiry. _, err = a.createSAMLUser(&createUserParams{ connectorName: "samlService", @@ -221,3 +247,377 @@ func TestPingSAMLWorkaround(t *testing.T) { require.NotEmpty(t, parsed.Query().Get("SigAlg"), "SigAlg is required for provider: ping") require.NotEmpty(t, parsed.Query().Get("Signature"), "Signature is required for provider: ping") } + +func TestServer_getConnectorAndProvider(t *testing.T) { + // Create a Server instance for testing. + c := clockwork.NewFakeClockAt(time.Now()) + b, err := lite.NewWithConfig(context.Background(), lite.Config{ + Path: t.TempDir(), + PollStreamPeriod: 200 * time.Millisecond, + Clock: c, + }) + require.NoError(t, err) + + clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ + ClusterName: "me.localhost", + }) + require.NoError(t, err) + + authConfig := &InitConfig{ + ClusterName: clusterName, + Backend: b, + Authority: authority.New(), + SkipPeriodicOperations: true, + } + + a, err := NewServer(authConfig) + require.NoError(t, err) + + caKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(t, err) + + tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner( + caKey, + pkix.Name{ + CommonName: "server1", + Organization: []string{"server1"}, + }, nil, defaults.CATTL) + require.NoError(t, err) + require.NotNil(t, tlsCert) + + keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{ + Organization: []string{"Teleport OSS"}, + CommonName: "teleport.localhost.localdomain", + }, nil, 10*365*24*time.Hour) + require.NoError(t, err) + + request := services.SAMLAuthRequest{ + ID: "ABC", + ConnectorID: "zzz", + CheckUser: false, + PublicKey: nil, + CertTTL: 0, + CreateWebSession: false, + SSOTestFlow: true, + ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "test", + Audience: "test", + ServiceProviderIssuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: string(keyPEM), + Cert: string(certPEM), + }, + }, + } + + connector, provider, err := a.getConnectorAndProvider(context.Background(), request) + require.NoError(t, err) + require.NotNil(t, connector) + require.NotNil(t, provider) + + expectedConnector := &types.SAMLConnectorV2{Kind: "saml", Version: "v2", Metadata: types.Metadata{Name: "zzz", Namespace: apidefaults.Namespace}, Spec: *request.ConnectorSpec} + require.Equal(t, expectedConnector, connector) + + require.Equal(t, "test", provider.IdentityProviderSSOURL) + require.Equal(t, "test", provider.IdentityProviderIssuer) + require.Equal(t, "test", provider.AssertionConsumerServiceURL) + require.Equal(t, "test", provider.ServiceProviderIssuer) + + conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }) + require.NoError(t, err) + + err = a.CreateSAMLConnector(conn) + require.NoError(t, err) + + request2 := services.SAMLAuthRequest{ + ID: "ABC", + ConnectorID: "foo", + SSOTestFlow: false, + } + + connector, provider, err = a.getConnectorAndProvider(context.Background(), request2) + require.NoError(t, err) + require.NotNil(t, connector) + require.NotNil(t, provider) + +} + +func TestServer_ValidateSAMLResponse(t *testing.T) { + // Create a Server instance for testing. + c := clockwork.NewFakeClockAt(time.Date(2022, 04, 25, 9, 0, 0, 0, time.UTC)) + b, err := lite.NewWithConfig(context.Background(), lite.Config{ + Path: t.TempDir(), + PollStreamPeriod: 200 * time.Millisecond, + Clock: c, + }) + require.NoError(t, err) + + clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ + ClusterName: "me.localhost", + }) + require.NoError(t, err) + + authConfig := &InitConfig{ + ClusterName: clusterName, + Backend: b, + Authority: authority.New(), + SkipPeriodicOperations: true, + } + + a, err := NewServer(authConfig) + require.NoError(t, err) + + a.SetClock(c) + + // empty response gives error. + response, err := a.ValidateSAMLResponse(context.Background(), "") + require.Nil(t, response) + require.Error(t, err) + + // create role referenced in request. + role, err := types.NewRole("access", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Logins: []string{"dummy"}, + }, + }) + require.NoError(t, err) + err = a.CreateRole(role) + require.NoError(t, err) + + // real response from Okta + respOkta := `http://www.okta.com/exk14fxcpjuKMcor30h8uBRfvYvl5C/LPCh36uAmRLHW76+aDP3ngChtIwP3/Fc=M1VfkOOBH6r7niHhfGvf4OJ1HH5QJl83aD/b+mTDUUnXzHXgXlkb0BGQkSFn6ixojwCoXchpxCNzVLPN/tvfyY1dxP4MO8b+/07bGuVD2yTNlhN43/FFcDpmZ1ZDW8w2nPF1E5gy1lR8Wx2NgT3kQ2Ui1vRNX/KeX/P9NnABj4AjcshyHK2e49WLM/D4U84XOl7ODtzS7PTvtB0SGIwRE25G//8AsAv81eBfHL54Nz1HAqinMhxQtz32ZDXpKaAV6GypyBTvk6vo7Pkk4OiL6G9VIGC8Bd/gnavsc+Ickfuo7KTq8NDKTLB5WG34XKJqq6dGopSMrxr67oYjCEDZfw==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG +A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU +MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW +DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE +BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV +BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ +KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq +2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ +EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP +Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ +T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL +f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE +RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU +RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC +XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL +V115UGOwvjOOxmOFbYBn865SHgMndFtrhttp://www.okta.com/exk14fxcpjuKMcor30h8XwJSotSzU2qLdzu/WDk8dpQ/Cy1Id88932S/95+N+Ds=qyIvGi1+w93AdGUj0+T5RYAq+CAjLSScMTMc7dLTEze6qr3mP51W/bCoZz8E47lpsbLeh0EiATa6h2Uaj6/34rILfCt3aQRNjNicu0gBKhePyNraapdnoyeqJEV8UrAOOKFiH30e5AvQ1nRZqfgY7KMt6cZH5/eXjUS63lPJJn4yr9vLw9loCdHCoHlaseh2IHi7CickyyxSMTX+Y58zpBy2g/KwN3K4oZM4a10ZYWkZpzkZJXDRSUkEc/wTTO7IPPY7Zv7R7UC+zjf5Px1sYeKTkkIxlZViZmtqjYuhibnTmhroJx7wX/LtOPxCkwLHlQRDACBNbP/UtrudU1ZMxA==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG +A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU +MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW +DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE +BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV +BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ +KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq +2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ +EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP +Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ +T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL +f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE +RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU +RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC +XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL +V115UGOwvjOOxmOFbYBn865SHgMndFtrops@gravitational.iohttps://boson.tener.io:3080/v1/webapi/saml/acsurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransportops@gravitational.ioEveryoneokta-adminokta-dev` + + caKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(t, err) + + tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner( + caKey, + pkix.Name{ + CommonName: "server1", + Organization: []string{"server1"}, + }, nil, defaults.CATTL) + require.NoError(t, err) + require.NotNil(t, tlsCert) + + keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{ + Organization: []string{"Teleport OSS"}, + CommonName: "teleport.localhost.localdomain", + }, nil, 10*365*24*time.Hour) + require.NoError(t, err) + + conn, err := types.NewSAMLConnector("saml-test-conn", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: string(tlsCert), + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: string(keyPEM), + Cert: string(certPEM), + }, + }) + require.NoError(t, err) + + err = a.CreateSAMLConnector(conn) + require.NoError(t, err) + + err = a.Identity.CreateSAMLAuthRequest(services.SAMLAuthRequest{ + ID: "_4f256462-6c2d-466d-afc0-6ee36602b6f2", + ConnectorID: "saml-test-conn", + SSOTestFlow: true, + RedirectURL: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml?SAMLRequest=lFZZk6JKE%2F0rHc6jYbOIiMbtiSgWEREEQVBfbrAUUMiiFFLgr%2F9i7Jm%2BPXf75j5mUifz5MmMJH%2FDQVlcl%2BDeZtUe3u4Qty99WVR4%2BfzwNro31bIOMMLLKighXrbR0gHGdsm%2B0strU7d1VBejT5B%2FRwQYw6ZFdTV60eS30e9cws54jmcnfMTGE47n40mQRPSEh3DK8zQb8gk7evFgg1FdvY3YV3r0Yn3PKqIqRlX67wnD90d4uXZda2LtHHf0An6QkOoK30vYOLDpUAQP%2B%2B3bKGvbK15SVFjjunptYQWbV1Qvp7RAUx1DERgGV0R9q5QKIjx60TC%2BQ63CbVC1byOWZtkJzU3YmUsLy9lsyQjn0YsMcYuqoH3W8CNBDLuJwEynM%2B61vrTBtYEdguQ1qksquF4%2Fff790jwG%2FGjrBOM6ht3vDAX7C8MlfXTN77oR1c2UzgQK4%2FrJa%2FT12dTlk1nz9b8V9Bv1GftbjJcOSqugvTfwe5Nj%2FF7DkqIIIa9k%2Blo3KcXSNE3RC6ovixij9MvoAwtjrUrqpykFVV2hKCjQ4ymGAdusjl9AkdYNarPyHwLzFMN%2BCzyJGK5imBH1M69fjMJQNPeD3qSsG%2FilwcEEZwE747%2BH3MMENrCK4Mthr72NvvzaeD6hbhNUOKmbEv9s%2Fl9aP6kGqw4W9RXGE%2Fyjuu%2FUfj3g36hF%2FZWgjFKI2%2F8oHayiLz8J9h7FC4o7%2FGogv2z54Iyj8bXj7FAoDc5Dwf3O0atwvsq3Ju%2FKBm0Bcnh7MvoMfjo%2B5H83%2FzQ8H%2F1%2BR2wJqAs5PUmLBA%2B5pPtrwRn4rhbER6QzrNHr9h1nztqm1S0kJT1Oo0NfxHRdnvx%2B27Lurbdl8FgdEZvM3FBqnV1DeHisSX7ezTHT24DMvdJBpb%2FlrVj0UmQk%2BVHhB1MyU65CSl2t1cHyBANokpgwPbrm86ne%2BBssK0UEVoAqlKFREkvel%2BWM7Qkv7MVOsUg0X%2FM3Yc1x2prVjXw4CUVxccn6UO53BsObdG4MpcBNGcYaWyp9NBQXcRTKtqSdVpyo7zM7PA6OQ53nJ0%2BMTGtqHpFmVLfxdnaKUpMa32Wt2N%2Bsy0NYr8aC7gxb5KPAnR%2Flta%2B0VaWa8I5XdyHSZ3XZiMM4Ho9tKaHA29uH9J%2B0%2Fia%2FDoePVhxn9EIO2uDDkL7t0wRFQQu%2FGpom6w9JAtkuBUQTQartwVbT871EMqWEfmR2ZGASUToQ2T5t9PqsZV1kAlvZijYgtqx4hmiogDkoUmYYnurh81HsospOXcZ0DSciG%2Fske7YtK%2F2MPvt9EamLIZZmOGTNLFSzLpra91Bd5Ce%2Fv4QskwU%2BR9ZZZBq5RkxZYww5ZYyHwvnffI%2Bnb%2Fjw5SIw9geikGcOXSH94Y8conVgjH7zAIWYmp4IDHdd7YtQ9Ug43dDbsu9O7AoH6uLxB599F%2Fqra5hLEnC0P9csijaQ01SxgCxJwK6lNFVEYAZRd7v7M%2BFkb1nIzriDojbZoOe3vb2z8xUppklq%2BWaQ9tNq84j53vOPQqEG7KbjFFo93MIT2GoBVXgNOCVuy9oqdDirWoiHq6pTV9NKdySK52MZjvO5hjMLye6miZrHoqR7nN96vqwyTKsb%2FZTz7W63urT12CWsdlmV05vNRw6rcpcdjw26i3w%2FgNhShGyfn%2BVNfM%2Bgf7xk1IWiu16cx7QVxoXZFJej1yyctR%2FHM51Hjqe4xgy4sraoSXSSbuJj8O%2F0GMw4xO38u5s6F3Z6m7GPqddGEb3SRKII6%2FMBGHGHUkd30Km51Xi%2FSFhm3%2FN%2BRBToqKs5ZeJzCQKj7u1wk%2FYL9mblYsBeBAkQBYDASA2RI3J6kr09bQF7TYnAlkEKgQHIt7mLFaKIFLElA4C%2Fm1H52SP56MXrtT1di%2FxxbqOHV9mUlKYPZacgQ2KkAveXIzxXIrPm3etKKRd5787nrSeqIt0vYjAopNyRE0iT8WrmbrSCL2%2FJoIVHfXxc9bcgquX1tWmt9lbe1ky7Z2l1EVlC2SdhOQ5v3LzZ%2BSbTpqDUir4P9vyZVV2Ffehk1g15fMYOiqX%2BEixOsS%2BAVImuldfCW583mHN2UYjijYbHC7PqW3DdWIa%2B2l3CS5dv%2BtkCXxIJm1VzEeSpBJGM3Dm1NuStwUXCVHFVmpMo52E6nVpcE54uXS2%2FDI8hBnqnIR2hBWZLRkfuDqu6d5GVZmyFRl1zA3%2Fci3Tr1WUs2f1DOm9lzCPSIVU9wGZOtPcF9Oel8uF8XzvU54X008L6%2Bv2gNYMSarJVFygaXkBR1ERqYNDCt1Hb3OHoZVU3ZdD%2B8%2B3IvDJPD4onyfPp8l7hK4xQgmD8%2FKf%2B9XD%2B%2Br8AAAD%2F%2Fw%3D%3D", + ClientRedirectURL: "http://127.0.0.1:57293/callback?secret_key=70e98f8871530e66e6a136ae71fe002454dc1c76d754f090f895508a2226c36b", + ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "http://www.okta.com/exk14fxcpjuKMcor30h8", + SSO: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml", + Cert: "", + Display: "Okta", + AssertionConsumerService: "https://boson.tener.io:3080/v1/webapi/saml/acs", + Audience: "https://boson.tener.io:3080/v1/webapi/saml/acs", + ServiceProviderIssuer: "https://boson.tener.io:3080/v1/webapi/saml/acs", + EntityDescriptor: "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003cmd:EntityDescriptor entityID=\"http://www.okta.com/exk14fxcpjuKMcor30h8\" xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\"\u003e\u003cmd:IDPSSODescriptor WantAuthnRequestsSigned=\"false\" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol\"\u003e\u003cmd:KeyDescriptor use=\"signing\"\u003e\u003cds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\u003e\u003cds:X509Data\u003e\u003cds:X509Certificate\u003eMIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG\nA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU\nMBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW\nDWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE\nBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV\nBAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ\nKoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nxQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq\n2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ\nEBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP\nLp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ\nT8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL\nf3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE\nRcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU\nRAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC\nXXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL\nV115UGOwvjOOxmOFbYBn865SHgMndFtr\u003c/ds:X509Certificate\u003e\u003c/ds:X509Data\u003e\u003c/ds:KeyInfo\u003e\u003c/md:KeyDescriptor\u003e\u003cmd:NameIDFormat\u003eurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\u003c/md:NameIDFormat\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003c/md:IDPSSODescriptor\u003e\u003c/md:EntityDescriptor\u003e", + EntityDescriptorURL: "", + AttributesToRoles: []types.AttributeMapping{ + { + Name: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + SigningKeyPair: &types.AsymmetricKeyPair{ + PrivateKey: "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1py+q5bnxhAvZ7bnhQQauHIqOpFA5CMXCXd+A9Y1qDHecnN3\nrFVZfyUZrYm/gTQZSptgAshr+VWsBh9O3ZAZ5Lg+f0FSkYr+k0+A7Bx3v4N76Psi\nyE+INMmtyvP2bTGyOrHqaeGzQYkpiPq044WS2j5PDYiQWbepDpxLYbiQ7qwzS9xZ\nZp6w8TyFGNkMl26F5ZeSH+T/S/EHt3Q9t2U2uWRdWv1IdZ13krqJJURMzkBMMj2j\nBxgKoHPJa7T4DniLg5a5OBKTbernbPdW1xzQUgHATwdlQAx2+KBIpKJiuqixH1/b\nVHHpZzAR5IYXv82xmYBoyjFBsmDH3ao+MFraTwIDAQABAoIBAQCEXZbINEHtiiwC\n1u/Cvb5RRrC/ALm6O95Ii3egnCzp+SAPDSKhmt6hKdvFifEgmmaC+oPkE4Ns/Ccm\ne4bj5q3hwLVjPYHUnJrZdq64cfJ1n338O3C/hTYoAL/9Li0uOfmIdBV1iqxJ3nRM\ntPx+W/MwQj/1w+XsP/e4ODPSKMjTOyZkLVhArLA2qBM3l1NBWQw4EV96m1Dvjq2o\nxFYhSODZOYDYXq82NZya3cBzj30kEB/6fNk6qPAsMa3Ck7F/9mx3MA2XM/S0aB/U\nq+5I1g+mTAMPKa2c2Tv2hwWuRU9ddKGiXuw/gHPoBwEU7AVNk+nNSVDhj5/pqcFB\nM/lPNg6xAoGBAPu/oICyXwlXYfsvkTx+HHpY7Imq8RtBUjVpD3z+LC6+QydlF2Z/\nNqLDxBPZAAdA7VGzw5QdNR8DKY9EgeRQAcci8FIqjueTPQDVKl9kwJzOxqg8DM8t\nR8YpIOtP22JvjHAkFafBq9cWYZNLQwVabIkCdc0jUruN53WKRkj+b0npAoGBANo8\nkX7ypsS+riLu6Ez89tXHV78CW8eMb/Wxsa2hgrzd7KmgjYdj2wlfRaEY6pSvBA1Y\nMvy/Emvm2KhwuGzWWPJvoaQq/Hr6Puns9DVP8U3TTJDC3R5dDZUQ0DiVUGyez9Qu\nXV5aNMnXFjGPdRQYjGM1zG6677dM0CVYu/6MVSd3AoGBAN5X3tALufgsHzOUTXfa\nAhjk1PS573yc8piNk8pXSnp2PCVdGY/DJ2QV9uV4sJe3dmLEnCYCrdoYFuqcHQSi\nzQ8uAobvY4uP9T75BhV+jMdxsO8BKmcInO2dgZ+SxjZoQucAV8f0O2saL0/CFw1x\nUY6oh5aIbheMOzMKzwzE+1GRAoGAYm5FFWPuUfjK49irj+XckulZKz6uFJ/D86YU\nxIJ/TB4wWwWeL/2a0mxVJGbvjuYtRrOMM7EeZup0t+w3UmePMLGmzzvQKstpyupj\n7xPCe16dPwGU59gCg0RVFeBKqOMsS8Apvp+jBZJsYSgaH1k/IJQoQ50u95a+nsmZ\n6SJ0WdsCgYBfTcIJ456LNPQ7sjDtcqIQcbBgXYIt/u4dIhz0zuLSfvTrXAtcy7nU\nEDU+N2Ay715GmS+/iwc592Itam93t3sl1ql/Y+SrrxGQ7zRd6MALKIxM0+4qptB5\nDFXT1B5qhKHdZFr71AIGPrUjfsRQV8tPKFjRkuQ0zqEPvi4g06RMRw==\n-----END RSA PRIVATE KEY-----\n", + Cert: "-----BEGIN CERTIFICATE-----\nMIIDKzCCAhOgAwIBAgIRALIKjRCwhEmeWcNvwy1fBCUwDQYJKoZIhvcNAQELBQAw\nQDEVMBMGA1UEChMMVGVsZXBvcnQgT1NTMScwJQYDVQQDEx50ZWxlcG9ydC5sb2Nh\nbGhvc3QubG9jYWxkb21haW4wHhcNMjIwNDI1MDg1MzE4WhcNMzIwNDIyMDg1MzE4\nWjBAMRUwEwYDVQQKEwxUZWxlcG9ydCBPU1MxJzAlBgNVBAMTHnRlbGVwb3J0Lmxv\nY2FsaG9zdC5sb2NhbGRvbWFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBANacvquW58YQL2e254UEGrhyKjqRQOQjFwl3fgPWNagx3nJzd6xVWX8lGa2J\nv4E0GUqbYALIa/lVrAYfTt2QGeS4Pn9BUpGK/pNPgOwcd7+De+j7IshPiDTJrcrz\n9m0xsjqx6mnhs0GJKYj6tOOFkto+Tw2IkFm3qQ6cS2G4kO6sM0vcWWaesPE8hRjZ\nDJduheWXkh/k/0vxB7d0PbdlNrlkXVr9SHWdd5K6iSVETM5ATDI9owcYCqBzyWu0\n+A54i4OWuTgSk23q52z3Vtcc0FIBwE8HZUAMdvigSKSiYrqosR9f21Rx6WcwEeSG\nF7/NsZmAaMoxQbJgx92qPjBa2k8CAwEAAaMgMB4wDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBADXVdHHQ3HB6X7QizVnQ/Cgg\nzEOEiMC1ClsxkXeZnB1H6TpFEm9jxT77tVBGB0x9dAyEwmOwYAgf+F5TJIl6mqfy\nIbXK+XFxqacoDHprtPtqmqH1tR20G9cP8mxfbm+bq47rOWN1tgAmIlxxaR6Z2GTE\n2zKw5vyjdZsSidCxka9YdW8AgEcpnVteqxjrs4SOcbidJIs+9NnxtApJPMKFOkbk\nvjJx59skfCsNnrk8D3CeiDiT7/HMDLM4c83ETG04C/SzNSvGlpf60mTIjkyzydAK\nvIiKii9s2m1KiTOsGKVkDEr+PbMoo4y6XRB0tVomdCQxzCZLDs6iwviGGUer7wI=\n-----END CERTIFICATE-----\n", + }, + Provider: "", + EncryptionKeyPair: nil, + }, + }, defaults.SAMLAuthRequestTTL) + require.NoError(t, err) + + // check ValidateSAMLResponse + response, err = a.ValidateSAMLResponse(context.Background(), base64.StdEncoding.EncodeToString([]byte(respOkta))) + require.NoError(t, err) + require.NotNil(t, response) + + // check internal method, validate diagnostic outputs. + diagCtx := a.newSSODiagContext(types.KindSAML) + auth, err := a.validateSAMLResponse(context.Background(), diagCtx, base64.StdEncoding.EncodeToString([]byte(respOkta))) + require.NoError(t, err) + + // ensure diag info got stored and is identical. + infoFromBackend, err := a.GetSSODiagnosticInfo(context.Background(), types.KindSAML, auth.Req.ID) + require.NoError(t, err) + require.Equal(t, &diagCtx.info, infoFromBackend) + + // verify values + require.Equal(t, "ops@gravitational.io", auth.Username) + require.Equal(t, "ops@gravitational.io", auth.Identity.Username) + require.Equal(t, "saml-test-conn", auth.Identity.ConnectorID) + require.Equal(t, "_4f256462-6c2d-466d-afc0-6ee36602b6f2", auth.Req.ID) + require.Equal(t, 0, len(auth.HostSigners)) + + authnInstant := time.Date(2022, 04, 25, 8, 3, 11, 779000000, time.UTC) + + // ignore, this is boring and very complex. + require.NotNil(t, diagCtx.info.SAMLAssertionInfo.Assertions) + diagCtx.info.SAMLAssertionInfo.Assertions = nil + + require.Equal(t, types.SSODiagnosticInfo{ + TestFlow: true, + Error: "", + Success: true, + CreateUserParams: &types.CreateUserParams{ + ConnectorName: "saml-test-conn", + Username: "ops@gravitational.io", + Roles: []string{"access"}, + Traits: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SessionTTL: 108000000000000, + }, + SAMLAttributesToRoles: []types.AttributeMapping{ + { + Name: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + SAMLAttributesToRolesWarnings: nil, + SAMLAttributeStatements: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SAMLAssertionInfo: &types.AssertionInfo{ + NameID: "ops@gravitational.io", + Values: map[string]samltypes.Attribute{ + "groups": { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"}, + Name: "groups", + NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified", + Values: []samltypes.AttributeValue{ + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "Everyone", + }, + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "okta-admin", + }, + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "okta-dev", + }, + }, + }, + "username": { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"}, + Name: "username", + NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified", + Values: []samltypes.AttributeValue{ + { + XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}, + Value: "ops@gravitational.io", + }, + }, + }, + }, + WarningInfo: &saml2.WarningInfo{}, + SessionIndex: "_4f256462-6c2d-466d-afc0-6ee36602b6f2", + AuthnInstant: &authnInstant, + SessionNotOnOrAfter: nil, + Assertions: nil, + ResponseSignatureValidated: true, + }, + SAMLTraitsFromAssertions: map[string][]string{ + "groups": {"Everyone", "okta-admin", "okta-dev"}, + "username": {"ops@gravitational.io"}, + }, + SAMLConnectorTraitMapping: []types.TraitMapping{ + { + Trait: "groups", + Value: "okta-admin", + Roles: []string{"access"}, + }, + }, + }, diagCtx.info) + + // make sure no users have been created. + users, err := a.GetUsers(false) + require.NoError(t, err) + require.Equal(t, 0, len(users)) +} diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go new file mode 100644 index 0000000000000..90e6b8ba83ae4 --- /dev/null +++ b/lib/auth/sso_diag_context_test.go @@ -0,0 +1,38 @@ +package auth + +import ( + "context" + "github.com/stretchr/testify/require" + "testing" + + "github.com/gravitational/teleport/api/types" +) + +func Test_ssoDiagContext_writeToBackend(t *testing.T) { + diag := &ssoDiagContext{ + authKind: types.KindSAML, + requestID: "123", + info: types.SSODiagnosticInfo{}, + } + + callCount := 0 + + diag.createSSODiagnosticInfo = func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error { + callCount++ + require.Truef(t, info.TestFlow, "createSSODiagnosticInfo must not be called if info.TestFlow is false.") + require.Equal(t, diag.authKind, authKind) + require.Equal(t, diag.requestID, authRequestID) + require.Equal(t, diag.info, info) + return nil + } + + // with TestFlow: false, no call is made. + diag.info.TestFlow = false + diag.writeToBackend(context.Background()) + require.Equal(t, 0, callCount) + + // with TestFlow: true, a call is made. + diag.info.TestFlow = true + diag.writeToBackend(context.Background()) + require.Equal(t, 1, callCount) +} diff --git a/lib/services/local/users_test.go b/lib/services/local/users_test.go index 424d78d8e09d9..21cc1485023f1 100644 --- a/lib/services/local/users_test.go +++ b/lib/services/local/users_test.go @@ -762,3 +762,41 @@ func TestIdentityService_UpsertGlobalWebauthnSessionData_maxLimit(t *testing.T) require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeLogin, id3, sd)) require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeOther, id3, sd)) } + +func TestIdentityService_SSODiagnosticInfoCrud(t *testing.T) { + identity := newIdentityService(t, clockwork.NewFakeClock()) + ctx := context.Background() + + nilInfo, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "BAD_ID") + require.Nil(t, nilInfo) + require.Error(t, err) + + info := types.SSODiagnosticInfo{ + TestFlow: true, + Error: "foo bar baz", + Success: false, + CreateUserParams: &types.CreateUserParams{ + ConnectorName: "bar", + Username: "baz", + }, + SAMLAttributesToRoles: []types.AttributeMapping{ + { + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }, + }, + SAMLAttributesToRolesWarnings: nil, + SAMLAttributeStatements: nil, + SAMLAssertionInfo: nil, + SAMLTraitsFromAssertions: nil, + SAMLConnectorTraitMapping: nil, + } + + err = identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID", info) + require.NoError(t, err) + + infoGet, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID") + require.NoError(t, err) + require.Equal(t, &info, infoGet) +} From 667aeecd540fc4ea19345c6fc02d8ad6f339606a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 25 Apr 2022 14:46:46 +0200 Subject: [PATCH 44/50] Imports. --- lib/auth/sso_diag_context.go | 1 + lib/auth/sso_diag_context_test.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/auth/sso_diag_context.go b/lib/auth/sso_diag_context.go index a3d873583432b..415de9d0c3aff 100644 --- a/lib/auth/sso_diag_context.go +++ b/lib/auth/sso_diag_context.go @@ -18,6 +18,7 @@ package auth import ( "context" + "github.com/gravitational/teleport/api/types" ) diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go index 90e6b8ba83ae4..8f7c0b4fb9196 100644 --- a/lib/auth/sso_diag_context_test.go +++ b/lib/auth/sso_diag_context_test.go @@ -2,10 +2,11 @@ package auth import ( "context" - "github.com/stretchr/testify/require" "testing" "github.com/gravitational/teleport/api/types" + + "github.com/stretchr/testify/require" ) func Test_ssoDiagContext_writeToBackend(t *testing.T) { From ce09f34c2d0e2a71fc77e97365d89915fe03d8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 25 Apr 2022 15:02:29 +0200 Subject: [PATCH 45/50] Lint. --- lib/auth/sso_diag_context_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go index 8f7c0b4fb9196..b57d7667a17ba 100644 --- a/lib/auth/sso_diag_context_test.go +++ b/lib/auth/sso_diag_context_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/gravitational/teleport/api/types" - "github.com/stretchr/testify/require" ) From 8c9419908fd0f5f70aeeb27a4e8a720ddfd8f914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Mon, 25 Apr 2022 15:14:05 +0200 Subject: [PATCH 46/50] License. --- lib/auth/sso_diag_context_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go index b57d7667a17ba..ca9fc6a5d65ae 100644 --- a/lib/auth/sso_diag_context_test.go +++ b/lib/auth/sso_diag_context_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 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 auth import ( From bc7446ca1d76a2986b80a4ee2d26a942e6fe6c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 26 Apr 2022 16:16:04 +0200 Subject: [PATCH 47/50] Additional tests. --- lib/auth/auth_with_roles_test.go | 240 +++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 0c341575908d7..364e517014a8a 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth/native" libdefaults "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" @@ -285,6 +286,245 @@ func TestSSOUserCanReissueCert(t *testing.T) { require.NoError(t, err) } +func TestSAMLAuthRequest(t *testing.T) { + ctx := context.Background() + srv := newTestTLSServer(t) + + emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{}) + require.NoError(t, err) + + access1Role, err := CreateRole(ctx, srv.Auth(), "test-access-1", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + access2Role, err := CreateRole(ctx, srv.Auth(), "test-access-2", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAML}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + access3Role, err := CreateRole(ctx, srv.Auth(), "test-access-3", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAML, types.KindSAMLRequest}, + Verbs: []string{types.VerbCreate}, + }, + }, + }, + }) + require.NoError(t, err) + + readerRole, err := CreateRole(ctx, srv.Auth(), "test-access-4", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbRead}, + }, + }, + }, + }) + require.NoError(t, err) + + conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{ + Issuer: "test", + SSO: "test", + Cert: fixtures.TLSCACertPEM, + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }) + require.NoError(t, err) + + err = srv.Auth().CreateSAMLConnector(conn) + require.NoError(t, err) + + reqNormal := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML} + reqTest := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML, SSOTestFlow: true, ConnectorSpec: &types.SAMLConnectorSpecV2{ + Issuer: "test", + Audience: "test", + ServiceProviderIssuer: "test", + SSO: "test", + Cert: fixtures.TLSCACertPEM, + AssertionConsumerService: "test", + AttributesToRoles: []types.AttributeMapping{{ + Name: "foo", + Value: "bar", + Roles: []string{"baz"}, + }}, + }} + + tests := []struct { + desc string + roles []string + request services.SAMLAuthRequest + expectAccessDenied bool + }{ + { + desc: "empty role - no access", + roles: []string{emptyRole.GetName()}, + request: reqNormal, + expectAccessDenied: true, + }, + { + desc: "can create regular request with normal access", + roles: []string{access1Role.GetName()}, + request: reqNormal, + expectAccessDenied: false, + }, + { + desc: "cannot create sso test request with normal access", + roles: []string{access1Role.GetName()}, + request: reqTest, + expectAccessDenied: true, + }, + { + desc: "cannot create normal request with connector access", + roles: []string{access2Role.GetName()}, + request: reqNormal, + expectAccessDenied: true, + }, + { + desc: "cannot create sso test request with connector access", + roles: []string{access2Role.GetName()}, + request: reqTest, + expectAccessDenied: true, + }, + { + desc: "can create regular request with combined access", + roles: []string{access3Role.GetName()}, + request: reqNormal, + expectAccessDenied: false, + }, + { + desc: "can create sso test request with combined access", + roles: []string{access3Role.GetName()}, + request: reqTest, + expectAccessDenied: false, + }, + } + + user, err := CreateUser(srv.Auth(), "dummy") + require.NoError(t, err) + + userReader, err := CreateUser(srv.Auth(), "dummy-reader", readerRole) + require.NoError(t, err) + + clientReader, err := srv.NewClient(TestUser(userReader.GetName())) + require.NoError(t, err) + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + user.SetRoles(tt.roles) + err = srv.Auth().UpsertUser(user) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + request, err := client.CreateSAMLAuthRequest(tt.request) + if tt.expectAccessDenied { + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err), "expected access denied, got: %v", err) + } else { + if err != nil { + if reporter, ok := err.(trace.DebugReporter); ok { + fmt.Println(reporter.DebugReport()) + } + } + require.NoError(t, err) + require.NotEmpty(t, request.ID) + require.Equal(t, tt.request.ConnectorID, request.ConnectorID) + + requestCopy, err := clientReader.GetSAMLAuthRequest(ctx, request.ID) + require.NoError(t, err) + require.Equal(t, request, requestCopy) + } + }) + } +} + +func TestSSODiagnosticInfo(t *testing.T) { + ctx := context.Background() + srv := newTestTLSServer(t) + + // empty role + emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{}) + + // privileged role + privRole, err := CreateRole(ctx, srv.Auth(), "priv-access", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + { + Resources: []string{types.KindSAMLRequest}, + Verbs: []string{types.VerbRead}, + }, + }, + }, + }) + require.NoError(t, err) + + user, err := CreateUser(srv.Auth(), "dummy", emptyRole) + require.NoError(t, err) + + userPriv, err := CreateUser(srv.Auth(), "superDummy", privRole) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + clientPriv, err := srv.NewClient(TestUser(userPriv.GetName())) + require.NoError(t, err) + + // fresh server, no SSO diag info, request fails + info, err := client.GetSSODiagnosticInfo(ctx, types.KindSAML, "XXX-INVALID-ID") + require.Error(t, err) + require.Nil(t, info) + + infoCreate := types.SSODiagnosticInfo{ + TestFlow: true, + Error: "aaa bbb ccc", + } + + // invalid auth kind returns error, no information stored. + err = srv.Auth().CreateSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "ABC123", infoCreate) + require.Error(t, err) + info, err = client.GetSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "XXX-INVALID-ID") + require.Error(t, err) + require.Nil(t, info) + + // proper record can be stored, retrieved, if user has access. + err = srv.Auth().CreateSSODiagnosticInfo(ctx, types.KindSAML, "ABC123", infoCreate) + require.NoError(t, err) + + info, err = client.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err)) + + info, err = clientPriv.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") + require.NoError(t, err) + require.Equal(t, &infoCreate, info) + +} + func TestGenerateUserCertsWithRoleRequest(t *testing.T) { ctx := context.Background() srv := newTestTLSServer(t) From 6a4e849dd8696d394cb422e7fb66c2102ea55c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 26 Apr 2022 16:57:18 +0200 Subject: [PATCH 48/50] Expand test coverage in lib/services for SAML. --- lib/services/identity_test.go | 115 ++++++++++++++++++++++++++++++++++ lib/services/saml_test.go | 19 ++++++ 2 files changed, 134 insertions(+) create mode 100644 lib/services/identity_test.go diff --git a/lib/services/identity_test.go b/lib/services/identity_test.go new file mode 100644 index 0000000000000..43b81ca52bfc6 --- /dev/null +++ b/lib/services/identity_test.go @@ -0,0 +1,115 @@ +/* +Copyright 2022 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 services + +import ( + "testing" + "time" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestSAMLAuthRequest_Check(t *testing.T) { + const exampleSSHCert = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgb1srW/W3ZDjYAO45xLYAwzHBDLsJ4Ux6ICFIkTjb1LEAAAADAQABAAAAYQCkoR51poH0wE8w72cqSB8Sszx+vAhzcMdCO0wqHTj7UNENHWEXGrU0E0UQekD7U+yhkhtoyjbPOVIP7hNa6aRk/ezdh/iUnCIt4Jt1v3Z1h1P+hA4QuYFMHNB+rmjPwAcAAAAAAAAAAAAAAAEAAAAEdGVzdAAAAAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAAHcAAAAHc3NoLXJzYQAAAAMBAAEAAABhANFS2kaktpSGc+CcmEKPyw9mJC4nZKxHKTgLVZeaGbFZOvJTNzBspQHdy7Q1uKSfktxpgjZnksiu/tFF9ngyY2KFoc+U88ya95IZUycBGCUbBQ8+bhDtw/icdDGQD5WnUwAAAG8AAAAHc3NoLXJzYQAAAGC8Y9Z2LQKhIhxf52773XaWrXdxP0t3GBVo4A10vUWiYoAGepr6rQIoGGXFxT4B9Gp+nEBJjOwKDXPrAevow0T9ca8gZN+0ykbhSrXLE5Ao48rqr3zP4O1/9P7e6gp0gw8=` + + tests := []struct { + name string + req SAMLAuthRequest + wantErr bool + }{ + { + name: "normal request", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + }, + wantErr: false, + }, + { + name: "below min CertTTL", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 1 * time.Second, + }, + wantErr: true, + }, + { + name: "above max CertTTL", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 1000 * time.Hour, + }, + wantErr: true, + }, + { + name: "TTL ignored without cert", + req: SAMLAuthRequest{ + ConnectorID: "foo", + CertTTL: 60 * time.Minute, + }, + wantErr: false, + }, + { + name: "SSOTestFlow requires ConnectorSpec", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + SSOTestFlow: true, + }, + wantErr: true, + }, + { + name: "ConnectorSpec requires SSOTestFlow", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"}, + }, + wantErr: true, + }, + { + name: "ConnectorSpec with SSOTestFlow works", + req: SAMLAuthRequest{ + ConnectorID: "foo", + PublicKey: []byte(exampleSSHCert), + CertTTL: 60 * time.Minute, + SSOTestFlow: true, + ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"}, + }, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.req.Check() + if tt.wantErr { + require.Error(t, err) + require.True(t, trace.IsBadParameter(err)) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/lib/services/saml_test.go b/lib/services/saml_test.go index d1d77509cef6e..551a97299f7a5 100644 --- a/lib/services/saml_test.go +++ b/lib/services/saml_test.go @@ -18,10 +18,12 @@ package services import ( "strings" + "testing" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" + "github.com/stretchr/testify/require" "gopkg.in/check.v1" kyaml "k8s.io/apimachinery/pkg/util/yaml" ) @@ -49,3 +51,20 @@ func (s *SAMLSuite) TestParseFromMetadata(c *check.C) { c.Assert(oc.GetSigningKeyPair(), check.NotNil) c.Assert(oc.GetAttributes(), check.DeepEquals, []string{"groups"}) } + +func TestCheckSAMLEntityDescriptor(t *testing.T) { + input := fixtures.SAMLOktaConnectorV2 + + decoder := kyaml.NewYAMLOrJSONDecoder(strings.NewReader(input), defaults.LookaheadBufSize) + var raw UnknownResource + err := decoder.Decode(&raw) + require.NoError(t, err) + + oc, err := UnmarshalSAMLConnector(raw.Raw) + require.NoError(t, err) + + ed := oc.GetEntityDescriptor() + certs, err := CheckSAMLEntityDescriptor(ed) + require.NoError(t, err) + require.Len(t, certs, 1) +} From 7e00976fa827111874f57ffc362fc4f1dd88bfc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Tue, 26 Apr 2022 17:09:33 +0200 Subject: [PATCH 49/50] Check all returned values in test. --- lib/auth/auth_with_roles_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 364e517014a8a..c4d4a1da01460 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -468,6 +468,7 @@ func TestSSODiagnosticInfo(t *testing.T) { // empty role emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{}) + require.NoError(t, err) // privileged role privRole, err := CreateRole(ctx, srv.Auth(), "priv-access", types.RoleSpecV5{ @@ -518,6 +519,7 @@ func TestSSODiagnosticInfo(t *testing.T) { info, err = client.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") require.Error(t, err) require.True(t, trace.IsAccessDenied(err)) + require.Nil(t, info) info, err = clientPriv.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123") require.NoError(t, err) From 8b311cf1811aed58a4e496b63e23f8df2545fe01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Skrz=C4=99tnicki?= Date: Wed, 4 May 2022 11:06:35 +0200 Subject: [PATCH 50/50] Cleanup go.mod post merge. --- api/go.mod | 1 - api/go.sum | 1 - go.mod | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/api/go.mod b/api/go.mod index 462ae691ceabd..733cc580d378f 100644 --- a/api/go.mod +++ b/api/go.mod @@ -15,6 +15,5 @@ require ( golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd google.golang.org/grpc v1.45.0 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/api/go.sum b/api/go.sum index 18629fe44e802..da574cadfa641 100644 --- a/api/go.sum +++ b/api/go.sum @@ -94,7 +94,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/go.mod b/go.mod index 399b16af5501a..861028b82be46 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/ec2 v1.16.0 github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 github.com/beevik/etree v1.1.0 - github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 github.com/coreos/go-oidc v0.0.0 github.com/coreos/go-semver v0.3.0 github.com/denisenkom/go-mssqldb v0.11.0 @@ -147,6 +146,7 @@ require ( github.com/boombuler/barcode v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect + github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/creack/pty v1.1.11 // indirect