diff --git a/README.md b/README.md index 7f2dd65c..2c29a84b 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ To start the server there are environment variables, as well as command line opt ```bash cd server export DB_DSN="Your gorm DB connection string for example: gorm:GORM_USER_PASSWORD@tcp(localhost:3306)/campus_backend" -go run ./main.go [-MensaCron 0] +go run ./main.go ``` #### Environment Variables @@ -72,10 +72,6 @@ There are a few environment variables available: * [REQUIRED] `DB_DSN`: The [GORM](https://gorm.io/) [DB connection string](https://gorm.io/docs/connecting_to_the_database.html#MySQL) for connecting to the MySQL DB. Example: `gorm@tcp(localhost:3306)/campus_backend` * [OPTIONAL] `SENTRY_DSN`: The Sentry [Data Source Name](https://sentry-docs-git-patch-1.sentry.dev/product/sentry-basics/dsn-explainer/) for reporting issues and crashes. -#### Command Line Arguments - -* [OPTIONAL] `-MensaCron 0`: Providing this argument deactivates the Mensa Rating cronjobs if not needed in a local setup. Be aware, this option will change in a future version ([#117](https://github.com/TUM-Dev/Campus-Backend/issues/117) and [#115](https://github.com/TUM-Dev/Campus-Backend/issues/115)). - ## Running the Server (Docker) ```bash docker compose up -d diff --git a/client/go.mod b/client/go.mod index dac32653..2dd88216 100644 --- a/client/go.mod +++ b/client/go.mod @@ -3,23 +3,19 @@ module github.com/TUM-Dev/Campus-Backend/client go 1.21 require ( - github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617 - github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3 + github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 github.com/sirupsen/logrus v1.9.3 - google.golang.org/grpc v1.57.0 + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 ) require ( - github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect ) diff --git a/client/go.sum b/client/go.sum index 21378bde..128161a1 100644 --- a/client/go.sum +++ b/client/go.sum @@ -1,7 +1,5 @@ -github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617 h1:/o27aY5kfd4JnrqtbsMLIGwe+VBqS7j3ovCG/cXtAWk= -github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617/go.mod h1:hDLh5lxHD53m8/eDGsXJDqc9ONXqbJPa9b6uzpfl8Ow= -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3 h1:b585GRp+ZPA9j2EM0KQSSFiknR2SVF18FcRHRHnIIA4= -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3/go.mod h1:1gTg0lAImFNZiYKrJ/5OLM2UWoj7zeLzTX1WLJhF7LY= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 h1:/yMB5hJjFjEPB/HVP6wLTJWGqoCqQksXke+DiV2xUWY= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5/go.mod h1:7XoRdXmxK852GxcyraiovgyS5z/eZ9wsofV9on7wvGQ= 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= @@ -13,45 +11,37 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= 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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/client/localServer/localTestClient.go b/client/localServer/client.go similarity index 97% rename from client/localServer/localTestClient.go rename to client/localServer/client.go index d6c2a2f4..813c8ae7 100644 --- a/client/localServer/localTestClient.go +++ b/client/localServer/client.go @@ -11,7 +11,7 @@ import ( "os" "time" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -48,7 +48,7 @@ func canteenHeadCount(c pb.CampusClient, ctx context.Context) { }) if err != nil { - log.Error(err) + log.WithError(err).Error("Canteen HeadCount data request failed.") } else { log.WithField("res", res).Info("Canteen HeadCount data request successful.") } @@ -245,8 +245,7 @@ func getImageToBytes(path string) []byte { } defer func(file *os.File) { - err := file.Close() - if err != nil { + if err := file.Close(); err != nil { log.WithError(err).Error("could not close file") } }(file) @@ -291,8 +290,7 @@ func storeImage(path string, i []byte) (string, error) { log.WithError(errFile).Error("Unable to create the new testfile") } defer func(out *os.File) { - err := out.Close() - if err != nil { + if err := out.Close(); err != nil { log.WithError(err).Error("File was not closed successfully") } }(out) diff --git a/client/publicServer/client.go b/client/publicServer/client.go index 7db84b6a..cc5a0fbd 100644 --- a/client/publicServer/client.go +++ b/client/publicServer/client.go @@ -3,7 +3,7 @@ package main import ( "context" "crypto/x509" - pb "github.com/TUM-Dev/Campus-Backend/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -25,11 +25,10 @@ func main() { conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds)) if err != nil { - log.WithError(err).Fatalf("did not connect") + log.WithError(err).Fatal("did not connect") } defer func(conn *grpc.ClientConn) { - err := conn.Close() - if err != nil { + if err := conn.Close(); err != nil { log.WithError(err).Error("did not close connection") } }(conn) diff --git a/deployment/charts/backend/templates/deployments/backend-v2.yaml b/deployment/charts/backend/templates/deployments/backend-v2.yaml index 310387e7..f037f8f9 100644 --- a/deployment/charts/backend/templates/deployments/backend-v2.yaml +++ b/deployment/charts/backend/templates/deployments/backend-v2.yaml @@ -39,6 +39,8 @@ spec: env: - name: ENVIRONMENT value: prod + - name: MensaCronDisabled + value: "false" - name: APNS_P8_FILE_PATH value: /etc/apns_auth_key.p8 - name: SENTRY_DSN diff --git a/docker-compose.yaml b/docker-compose.yaml index 3e4f3727..4a4a9174 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,8 +16,11 @@ services: - APNS_KEY_ID=${APNS_KEY_ID} - APNS_TEAM_ID=${APNS_TEAM_ID} - APNS_P8_FILE_PATH=${APNS_P8_FILE_PATH} + - MensaCronDisabled=false volumes: + - backend-storage:/Storage - ./apns_auth_key.p8:${APNS_P8_FILE_PATH} + user: 1000:3000 depends_on: db: condition: service_healthy @@ -41,4 +44,6 @@ services: volumes: campus-db-data: + driver: local + backend-storage: driver: local \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile index dad8bf1f..66da46dd 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -14,6 +14,7 @@ COPY go.mod go.sum ./ RUN go mod download # Copy source code +COPY api/tumdev/campus_backend.swagger.json ./swagger/swagger.json COPY . . # bundle version into binary if specified in build-args, dev otherwise. @@ -29,6 +30,11 @@ COPY --from=builder /backend /backend COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder /etc/passwd /etc/passwd +# make sure that /Storage is mounted with the correct access permissions even in docker-compose +RUN mkdir /Storage +RUN chown appuser /Storage +VOLUME /Storage + # Use an unprivileged user USER appuser diff --git a/server/api/CampusService.pb.go b/server/api/CampusService.pb.go deleted file mode 100644 index eed692c3..00000000 --- a/server/api/CampusService.pb.go +++ /dev/null @@ -1,5460 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc (unknown) -// source: CampusService.proto - -package api - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type DeviceType int32 - -const ( - DeviceType_IOS DeviceType = 0 - DeviceType_ANDROID DeviceType = 1 - DeviceType_WINDOWS DeviceType = 2 -) - -// Enum value maps for DeviceType. -var ( - DeviceType_name = map[int32]string{ - 0: "IOS", - 1: "ANDROID", - 2: "WINDOWS", - } - DeviceType_value = map[string]int32{ - "IOS": 0, - "ANDROID": 1, - "WINDOWS": 2, - } -) - -func (x DeviceType) Enum() *DeviceType { - p := new(DeviceType) - *p = x - return p -} - -func (x DeviceType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DeviceType) Descriptor() protoreflect.EnumDescriptor { - return file_CampusService_proto_enumTypes[0].Descriptor() -} - -func (DeviceType) Type() protoreflect.EnumType { - return &file_CampusService_proto_enumTypes[0] -} - -func (x DeviceType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DeviceType.Descriptor instead. -func (DeviceType) EnumDescriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{0} -} - -type RegisterDeviceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` - PublicKey *string `protobuf:"bytes,2,opt,name=publicKey,proto3,oneof" json:"publicKey,omitempty"` - DeviceType DeviceType `protobuf:"varint,3,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` -} - -func (x *RegisterDeviceRequest) Reset() { - *x = RegisterDeviceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterDeviceRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterDeviceRequest) ProtoMessage() {} - -func (x *RegisterDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterDeviceRequest.ProtoReflect.Descriptor instead. -func (*RegisterDeviceRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{0} -} - -func (x *RegisterDeviceRequest) GetDeviceId() string { - if x != nil { - return x.DeviceId - } - return "" -} - -func (x *RegisterDeviceRequest) GetPublicKey() string { - if x != nil && x.PublicKey != nil { - return *x.PublicKey - } - return "" -} - -func (x *RegisterDeviceRequest) GetDeviceType() DeviceType { - if x != nil { - return x.DeviceType - } - return DeviceType_IOS -} - -type RegisterDeviceReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` -} - -func (x *RegisterDeviceReply) Reset() { - *x = RegisterDeviceReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegisterDeviceReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegisterDeviceReply) ProtoMessage() {} - -func (x *RegisterDeviceReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegisterDeviceReply.ProtoReflect.Descriptor instead. -func (*RegisterDeviceReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{1} -} - -func (x *RegisterDeviceReply) GetDeviceId() string { - if x != nil { - return x.DeviceId - } - return "" -} - -type RemoveDeviceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` - DeviceType DeviceType `protobuf:"varint,2,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` -} - -func (x *RemoveDeviceRequest) Reset() { - *x = RemoveDeviceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoveDeviceRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoveDeviceRequest) ProtoMessage() {} - -func (x *RemoveDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoveDeviceRequest.ProtoReflect.Descriptor instead. -func (*RemoveDeviceRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{2} -} - -func (x *RemoveDeviceRequest) GetDeviceId() string { - if x != nil { - return x.DeviceId - } - return "" -} - -func (x *RemoveDeviceRequest) GetDeviceType() DeviceType { - if x != nil { - return x.DeviceType - } - return DeviceType_IOS -} - -type RemoveDeviceReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` -} - -func (x *RemoveDeviceReply) Reset() { - *x = RemoveDeviceReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoveDeviceReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoveDeviceReply) ProtoMessage() {} - -func (x *RemoveDeviceReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoveDeviceReply.ProtoReflect.Descriptor instead. -func (*RemoveDeviceReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{3} -} - -func (x *RemoveDeviceReply) GetDeviceId() string { - if x != nil { - return x.DeviceId - } - return "" -} - -type IOSDeviceRequestResponseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` - Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` -} - -func (x *IOSDeviceRequestResponseRequest) Reset() { - *x = IOSDeviceRequestResponseRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IOSDeviceRequestResponseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IOSDeviceRequestResponseRequest) ProtoMessage() {} - -func (x *IOSDeviceRequestResponseRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IOSDeviceRequestResponseRequest.ProtoReflect.Descriptor instead. -func (*IOSDeviceRequestResponseRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{4} -} - -func (x *IOSDeviceRequestResponseRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -func (x *IOSDeviceRequestResponseRequest) GetPayload() string { - if x != nil { - return x.Payload - } - return "" -} - -type IOSDeviceRequestResponseReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *IOSDeviceRequestResponseReply) Reset() { - *x = IOSDeviceRequestResponseReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IOSDeviceRequestResponseReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IOSDeviceRequestResponseReply) ProtoMessage() {} - -func (x *IOSDeviceRequestResponseReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IOSDeviceRequestResponseReply.ProtoReflect.Descriptor instead. -func (*IOSDeviceRequestResponseReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{5} -} - -func (x *IOSDeviceRequestResponseReply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type NewsSourceArray struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Sources []*NewsSource `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` -} - -func (x *NewsSourceArray) Reset() { - *x = NewsSourceArray{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NewsSourceArray) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NewsSourceArray) ProtoMessage() {} - -func (x *NewsSourceArray) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NewsSourceArray.ProtoReflect.Descriptor instead. -func (*NewsSourceArray) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{6} -} - -func (x *NewsSourceArray) GetSources() []*NewsSource { - if x != nil { - return x.Sources - } - return nil -} - -type NewsSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Icon string `protobuf:"bytes,3,opt,name=icon,proto3" json:"icon,omitempty"` -} - -func (x *NewsSource) Reset() { - *x = NewsSource{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NewsSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NewsSource) ProtoMessage() {} - -func (x *NewsSource) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. -func (*NewsSource) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{7} -} - -func (x *NewsSource) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *NewsSource) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *NewsSource) GetIcon() string { - if x != nil { - return x.Icon - } - return "" -} - -type GetTopNewsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ImageUrl string `protobuf:"bytes,1,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"` - Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` - Created *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` - From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` - To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3" json:"to,omitempty"` -} - -func (x *GetTopNewsReply) Reset() { - *x = GetTopNewsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetTopNewsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTopNewsReply) ProtoMessage() {} - -func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetTopNewsReply.ProtoReflect.Descriptor instead. -func (*GetTopNewsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{8} -} - -func (x *GetTopNewsReply) GetImageUrl() string { - if x != nil { - return x.ImageUrl - } - return "" -} - -func (x *GetTopNewsReply) GetLink() string { - if x != nil { - return x.Link - } - return "" -} - -func (x *GetTopNewsReply) GetCreated() *timestamppb.Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetTopNewsReply) GetFrom() *timestamppb.Timestamp { - if x != nil { - return x.From - } - return nil -} - -func (x *GetTopNewsReply) GetTo() *timestamppb.Timestamp { - if x != nil { - return x.To - } - return nil -} - -type CafeteriaRatingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Optional Parameter to define an interval for the ratings (Lower bound) - From *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` - // Optional Parameter to define an interval for the ratings (Upper bound) - To *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` - // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` -} - -func (x *CafeteriaRatingRequest) Reset() { - *x = CafeteriaRatingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CafeteriaRatingRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CafeteriaRatingRequest) ProtoMessage() {} - -func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CafeteriaRatingRequest.ProtoReflect.Descriptor instead. -func (*CafeteriaRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{9} -} - -func (x *CafeteriaRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *CafeteriaRatingRequest) GetFrom() *timestamppb.Timestamp { - if x != nil { - return x.From - } - return nil -} - -func (x *CafeteriaRatingRequest) GetTo() *timestamppb.Timestamp { - if x != nil { - return x.To - } - return nil -} - -func (x *CafeteriaRatingRequest) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -type DishRatingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - Dish string `protobuf:"bytes,2,opt,name=dish,proto3" json:"dish,omitempty"` - // Optional Parameter to define an interval for the ratings (Lower bound) - From *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - // Optional Parameter to define an interval for the ratings (Upper bound) - To *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` - // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` -} - -func (x *DishRatingRequest) Reset() { - *x = DishRatingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DishRatingRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DishRatingRequest) ProtoMessage() {} - -func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DishRatingRequest.ProtoReflect.Descriptor instead. -func (*DishRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{10} -} - -func (x *DishRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *DishRatingRequest) GetDish() string { - if x != nil { - return x.Dish - } - return "" -} - -func (x *DishRatingRequest) GetFrom() *timestamppb.Timestamp { - if x != nil { - return x.From - } - return nil -} - -func (x *DishRatingRequest) GetTo() *timestamppb.Timestamp { - if x != nil { - return x.To - } - return nil -} - -func (x *DishRatingRequest) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -type CafeteriaRatingReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` - Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` - Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` - Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` - Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` - RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` -} - -func (x *CafeteriaRatingReply) Reset() { - *x = CafeteriaRatingReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CafeteriaRatingReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CafeteriaRatingReply) ProtoMessage() {} - -func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CafeteriaRatingReply.ProtoReflect.Descriptor instead. -func (*CafeteriaRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{11} -} - -func (x *CafeteriaRatingReply) GetRating() []*SingleRatingReply { - if x != nil { - return x.Rating - } - return nil -} - -func (x *CafeteriaRatingReply) GetAvg() float64 { - if x != nil { - return x.Avg - } - return 0 -} - -func (x *CafeteriaRatingReply) GetStd() float64 { - if x != nil { - return x.Std - } - return 0 -} - -func (x *CafeteriaRatingReply) GetMin() int32 { - if x != nil { - return x.Min - } - return 0 -} - -func (x *CafeteriaRatingReply) GetMax() int32 { - if x != nil { - return x.Max - } - return 0 -} - -func (x *CafeteriaRatingReply) GetRatingTags() []*RatingTagResult { - if x != nil { - return x.RatingTags - } - return nil -} - -type DishRatingReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` - Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` - Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` - Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` - Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` - RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - NameTags []*RatingTagResult `protobuf:"bytes,7,rep,name=nameTags,proto3" json:"nameTags,omitempty"` -} - -func (x *DishRatingReply) Reset() { - *x = DishRatingReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DishRatingReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DishRatingReply) ProtoMessage() {} - -func (x *DishRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DishRatingReply.ProtoReflect.Descriptor instead. -func (*DishRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{12} -} - -func (x *DishRatingReply) GetRating() []*SingleRatingReply { - if x != nil { - return x.Rating - } - return nil -} - -func (x *DishRatingReply) GetAvg() float64 { - if x != nil { - return x.Avg - } - return 0 -} - -func (x *DishRatingReply) GetStd() float64 { - if x != nil { - return x.Std - } - return 0 -} - -func (x *DishRatingReply) GetMin() int32 { - if x != nil { - return x.Min - } - return 0 -} - -func (x *DishRatingReply) GetMax() int32 { - if x != nil { - return x.Max - } - return 0 -} - -func (x *DishRatingReply) GetRatingTags() []*RatingTagResult { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *DishRatingReply) GetNameTags() []*RatingTagResult { - if x != nil { - return x.NameTags - } - return nil -} - -type SingleRatingReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - // Optional JPEG image in Base64 - Image []byte `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,3,opt,name=comment,proto3" json:"comment,omitempty"` - RatingTags []*RatingTagNewRequest `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - Visited *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=visited,proto3" json:"visited,omitempty"` -} - -func (x *SingleRatingReply) Reset() { - *x = SingleRatingReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SingleRatingReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SingleRatingReply) ProtoMessage() {} - -func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. -func (*SingleRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{13} -} - -func (x *SingleRatingReply) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -func (x *SingleRatingReply) GetImage() []byte { - if x != nil { - return x.Image - } - return nil -} - -func (x *SingleRatingReply) GetComment() string { - if x != nil { - return x.Comment - } - return "" -} - -func (x *SingleRatingReply) GetRatingTags() []*RatingTagNewRequest { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *SingleRatingReply) GetVisited() *timestamppb.Timestamp { - if x != nil { - return x.Visited - } - return nil -} - -type NewCafeteriaRatingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - Image []byte `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` - // Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags - RatingTags []*RatingTag `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,6,opt,name=comment,proto3" json:"comment,omitempty"` -} - -func (x *NewCafeteriaRatingRequest) Reset() { - *x = NewCafeteriaRatingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NewCafeteriaRatingRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NewCafeteriaRatingRequest) ProtoMessage() {} - -func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NewCafeteriaRatingRequest.ProtoReflect.Descriptor instead. -func (*NewCafeteriaRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{14} -} - -func (x *NewCafeteriaRatingRequest) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -func (x *NewCafeteriaRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *NewCafeteriaRatingRequest) GetImage() []byte { - if x != nil { - return x.Image - } - return nil -} - -func (x *NewCafeteriaRatingRequest) GetRatingTags() []*RatingTag { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *NewCafeteriaRatingRequest) GetComment() string { - if x != nil { - return x.Comment - } - return "" -} - -type NewDishRatingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa - CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - Dish string `protobuf:"bytes,3,opt,name=dish,proto3" json:"dish,omitempty"` - // Optional JPEG image in Base64 - Image []byte `protobuf:"bytes,4,opt,name=image,proto3" json:"image,omitempty"` - // Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags - RatingTags []*RatingTag `protobuf:"bytes,5,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` -} - -func (x *NewDishRatingRequest) Reset() { - *x = NewDishRatingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NewDishRatingRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NewDishRatingRequest) ProtoMessage() {} - -func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NewDishRatingRequest.ProtoReflect.Descriptor instead. -func (*NewDishRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{15} -} - -func (x *NewDishRatingRequest) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -func (x *NewDishRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *NewDishRatingRequest) GetDish() string { - if x != nil { - return x.Dish - } - return "" -} - -func (x *NewDishRatingRequest) GetImage() []byte { - if x != nil { - return x.Image - } - return nil -} - -func (x *NewDishRatingRequest) GetRatingTags() []*RatingTag { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *NewDishRatingRequest) GetComment() string { - if x != nil { - return x.Comment - } - return "" -} - -type GetTagsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` -} - -func (x *GetTagsReply) Reset() { - *x = GetTagsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetTagsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTagsReply) ProtoMessage() {} - -func (x *GetTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetTagsReply.ProtoReflect.Descriptor instead. -func (*GetTagsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{16} -} - -func (x *GetTagsReply) GetRatingTags() []*TagsOverview { - if x != nil { - return x.RatingTags - } - return nil -} - -type TagsOverview struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` - De string `protobuf:"bytes,2,opt,name=de,proto3" json:"de,omitempty"` - En string `protobuf:"bytes,3,opt,name=en,proto3" json:"en,omitempty"` -} - -func (x *TagsOverview) Reset() { - *x = TagsOverview{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TagsOverview) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TagsOverview) ProtoMessage() {} - -func (x *TagsOverview) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TagsOverview.ProtoReflect.Descriptor instead. -func (*TagsOverview) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{17} -} - -func (x *TagsOverview) GetTagId() int32 { - if x != nil { - return x.TagId - } - return 0 -} - -func (x *TagsOverview) GetDe() string { - if x != nil { - return x.De - } - return "" -} - -func (x *TagsOverview) GetEn() string { - if x != nil { - return x.En - } - return "" -} - -type RatingTag struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` - Points float64 `protobuf:"fixed64,2,opt,name=points,proto3" json:"points,omitempty"` -} - -func (x *RatingTag) Reset() { - *x = RatingTag{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RatingTag) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RatingTag) ProtoMessage() {} - -func (x *RatingTag) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RatingTag.ProtoReflect.Descriptor instead. -func (*RatingTag) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{18} -} - -func (x *RatingTag) GetTagId() int32 { - if x != nil { - return x.TagId - } - return 0 -} - -func (x *RatingTag) GetPoints() float64 { - if x != nil { - return x.Points - } - return 0 -} - -type RatingTagNewRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` - Points int32 `protobuf:"varint,2,opt,name=points,proto3" json:"points,omitempty"` -} - -func (x *RatingTagNewRequest) Reset() { - *x = RatingTagNewRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RatingTagNewRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RatingTagNewRequest) ProtoMessage() {} - -func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RatingTagNewRequest.ProtoReflect.Descriptor instead. -func (*RatingTagNewRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{19} -} - -func (x *RatingTagNewRequest) GetTagId() int32 { - if x != nil { - return x.TagId - } - return 0 -} - -func (x *RatingTagNewRequest) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -type RatingTagResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` - Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` - Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` - Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` - Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` -} - -func (x *RatingTagResult) Reset() { - *x = RatingTagResult{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RatingTagResult) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RatingTagResult) ProtoMessage() {} - -func (x *RatingTagResult) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RatingTagResult.ProtoReflect.Descriptor instead. -func (*RatingTagResult) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{20} -} - -func (x *RatingTagResult) GetTagId() int32 { - if x != nil { - return x.TagId - } - return 0 -} - -func (x *RatingTagResult) GetAvg() float64 { - if x != nil { - return x.Avg - } - return 0 -} - -func (x *RatingTagResult) GetStd() float64 { - if x != nil { - return x.Std - } - return 0 -} - -func (x *RatingTagResult) GetMin() int32 { - if x != nil { - return x.Min - } - return 0 -} - -func (x *RatingTagResult) GetMax() int32 { - if x != nil { - return x.Max - } - return 0 -} - -type GetCafeteriaReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cafeteria []*Cafeteria `protobuf:"bytes,1,rep,name=cafeteria,proto3" json:"cafeteria,omitempty"` -} - -func (x *GetCafeteriaReply) Reset() { - *x = GetCafeteriaReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetCafeteriaReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetCafeteriaReply) ProtoMessage() {} - -func (x *GetCafeteriaReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetCafeteriaReply.ProtoReflect.Descriptor instead. -func (*GetCafeteriaReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{21} -} - -func (x *GetCafeteriaReply) GetCafeteria() []*Cafeteria { - if x != nil { - return x.Cafeteria - } - return nil -} - -type Cafeteria struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` - Longitude float64 `protobuf:"fixed64,3,opt,name=longitude,proto3" json:"longitude,omitempty"` - Latitude float64 `protobuf:"fixed64,4,opt,name=latitude,proto3" json:"latitude,omitempty"` -} - -func (x *Cafeteria) Reset() { - *x = Cafeteria{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Cafeteria) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Cafeteria) ProtoMessage() {} - -func (x *Cafeteria) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Cafeteria.ProtoReflect.Descriptor instead. -func (*Cafeteria) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{22} -} - -func (x *Cafeteria) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Cafeteria) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -func (x *Cafeteria) GetLongitude() float64 { - if x != nil { - return x.Longitude - } - return 0 -} - -func (x *Cafeteria) GetLatitude() float64 { - if x != nil { - return x.Latitude - } - return 0 -} - -type GetDishesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // >=2022 until the current year - Year int32 `protobuf:"varint,2,opt,name=year,proto3" json:"year,omitempty"` - // range 1 - 53 - Week int32 `protobuf:"varint,3,opt,name=week,proto3" json:"week,omitempty"` - // range 0 (Monday) - 4 (Friday) - Day int32 `protobuf:"varint,4,opt,name=day,proto3" json:"day,omitempty"` -} - -func (x *GetDishesRequest) Reset() { - *x = GetDishesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetDishesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDishesRequest) ProtoMessage() {} - -func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDishesRequest.ProtoReflect.Descriptor instead. -func (*GetDishesRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{23} -} - -func (x *GetDishesRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *GetDishesRequest) GetYear() int32 { - if x != nil { - return x.Year - } - return 0 -} - -func (x *GetDishesRequest) GetWeek() int32 { - if x != nil { - return x.Week - } - return 0 -} - -func (x *GetDishesRequest) GetDay() int32 { - if x != nil { - return x.Day - } - return 0 -} - -type GetDishesReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Dish []string `protobuf:"bytes,1,rep,name=dish,proto3" json:"dish,omitempty"` -} - -func (x *GetDishesReply) Reset() { - *x = GetDishesReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetDishesReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDishesReply) ProtoMessage() {} - -func (x *GetDishesReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDishesReply.ProtoReflect.Descriptor instead. -func (*GetDishesReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{24} -} - -func (x *GetDishesReply) GetDish() []string { - if x != nil { - return x.Dish - } - return nil -} - -type GetResponsiblePersonReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ResponsiblePerson []*ResponsiblePersonElement `protobuf:"bytes,1,rep,name=responsiblePerson,proto3" json:"responsiblePerson,omitempty"` -} - -func (x *GetResponsiblePersonReply) Reset() { - *x = GetResponsiblePersonReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetResponsiblePersonReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetResponsiblePersonReply) ProtoMessage() {} - -func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetResponsiblePersonReply.ProtoReflect.Descriptor instead. -func (*GetResponsiblePersonReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{25} -} - -func (x *GetResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePersonElement { - if x != nil { - return x.ResponsiblePerson - } - return nil -} - -type ResponsiblePersonElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Telephone string `protobuf:"bytes,2,opt,name=telephone,proto3" json:"telephone,omitempty"` - Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` - Faculty string `protobuf:"bytes,4,opt,name=faculty,proto3" json:"faculty,omitempty"` - TumID string `protobuf:"bytes,5,opt,name=tumID,proto3" json:"tumID,omitempty"` -} - -func (x *ResponsiblePersonElement) Reset() { - *x = ResponsiblePersonElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ResponsiblePersonElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResponsiblePersonElement) ProtoMessage() {} - -func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResponsiblePersonElement.ProtoReflect.Descriptor instead. -func (*ResponsiblePersonElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{26} -} - -func (x *ResponsiblePersonElement) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ResponsiblePersonElement) GetTelephone() string { - if x != nil { - return x.Telephone - } - return "" -} - -func (x *ResponsiblePersonElement) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *ResponsiblePersonElement) GetFaculty() string { - if x != nil { - return x.Faculty - } - return "" -} - -func (x *ResponsiblePersonElement) GetTumID() string { - if x != nil { - return x.TumID - } - return "" -} - -type GetBuilding2GpsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Building2Gps []*Building2GpsElement `protobuf:"bytes,1,rep,name=building2Gps,proto3" json:"building2Gps,omitempty"` -} - -func (x *GetBuilding2GpsReply) Reset() { - *x = GetBuilding2GpsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetBuilding2GpsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetBuilding2GpsReply) ProtoMessage() {} - -func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetBuilding2GpsReply.ProtoReflect.Descriptor instead. -func (*GetBuilding2GpsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{27} -} - -func (x *GetBuilding2GpsReply) GetBuilding2Gps() []*Building2GpsElement { - if x != nil { - return x.Building2Gps - } - return nil -} - -type Building2GpsElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Latitude string `protobuf:"bytes,2,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude string `protobuf:"bytes,3,opt,name=longitude,proto3" json:"longitude,omitempty"` -} - -func (x *Building2GpsElement) Reset() { - *x = Building2GpsElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Building2GpsElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Building2GpsElement) ProtoMessage() {} - -func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Building2GpsElement.ProtoReflect.Descriptor instead. -func (*Building2GpsElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{28} -} - -func (x *Building2GpsElement) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Building2GpsElement) GetLatitude() string { - if x != nil { - return x.Latitude - } - return "" -} - -func (x *Building2GpsElement) GetLongitude() string { - if x != nil { - return x.Longitude - } - return "" -} - -type GetAreaFacilitiesByBuildingNrReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AreaFacilitiesByBuildingNr []*RoomInformationElement `protobuf:"bytes,1,rep,name=areaFacilitiesByBuildingNr,proto3" json:"areaFacilitiesByBuildingNr,omitempty"` -} - -func (x *GetAreaFacilitiesByBuildingNrReply) Reset() { - *x = GetAreaFacilitiesByBuildingNrReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetAreaFacilitiesByBuildingNrReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAreaFacilitiesByBuildingNrReply) ProtoMessage() {} - -func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAreaFacilitiesByBuildingNrReply.ProtoReflect.Descriptor instead. -func (*GetAreaFacilitiesByBuildingNrReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{29} -} - -func (x *GetAreaFacilitiesByBuildingNrReply) GetAreaFacilitiesByBuildingNr() []*RoomInformationElement { - if x != nil { - return x.AreaFacilitiesByBuildingNr - } - return nil -} - -type GetAreaFacilitiesByBuildingNrRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - BuildingNr string `protobuf:"bytes,1,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` -} - -func (x *GetAreaFacilitiesByBuildingNrRequest) Reset() { - *x = GetAreaFacilitiesByBuildingNrRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetAreaFacilitiesByBuildingNrRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAreaFacilitiesByBuildingNrRequest) ProtoMessage() {} - -func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAreaFacilitiesByBuildingNrRequest.ProtoReflect.Descriptor instead. -func (*GetAreaFacilitiesByBuildingNrRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{30} -} - -func (x *GetAreaFacilitiesByBuildingNrRequest) GetBuildingNr() string { - if x != nil { - return x.BuildingNr - } - return "" -} - -type GetListOfToiletsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ListOfToilets []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfToilets,proto3" json:"listOfToilets,omitempty"` -} - -func (x *GetListOfToiletsReply) Reset() { - *x = GetListOfToiletsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetListOfToiletsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetListOfToiletsReply) ProtoMessage() {} - -func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetListOfToiletsReply.ProtoReflect.Descriptor instead. -func (*GetListOfToiletsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{31} -} - -func (x *GetListOfToiletsReply) GetListOfToilets() []*RoomInformationElement { - if x != nil { - return x.ListOfToilets - } - return nil -} - -type RoomInformationElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RoomId int32 `protobuf:"varint,1,opt,name=roomId,proto3" json:"roomId,omitempty"` - RoomCode string `protobuf:"bytes,2,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` - BuildingNr string `protobuf:"bytes,3,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` - ArchId string `protobuf:"bytes,4,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` - Info string `protobuf:"bytes,5,opt,name=info,proto3" json:"info,omitempty"` - Address string `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"` - Purpose string `protobuf:"bytes,7,opt,name=purpose,proto3" json:"purpose,omitempty"` - Campus string `protobuf:"bytes,8,opt,name=campus,proto3" json:"campus,omitempty"` - Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *RoomInformationElement) Reset() { - *x = RoomInformationElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RoomInformationElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RoomInformationElement) ProtoMessage() {} - -func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RoomInformationElement.ProtoReflect.Descriptor instead. -func (*RoomInformationElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{32} -} - -func (x *RoomInformationElement) GetRoomId() int32 { - if x != nil { - return x.RoomId - } - return 0 -} - -func (x *RoomInformationElement) GetRoomCode() string { - if x != nil { - return x.RoomCode - } - return "" -} - -func (x *RoomInformationElement) GetBuildingNr() string { - if x != nil { - return x.BuildingNr - } - return "" -} - -func (x *RoomInformationElement) GetArchId() string { - if x != nil { - return x.ArchId - } - return "" -} - -func (x *RoomInformationElement) GetInfo() string { - if x != nil { - return x.Info - } - return "" -} - -func (x *RoomInformationElement) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -func (x *RoomInformationElement) GetPurpose() string { - if x != nil { - return x.Purpose - } - return "" -} - -func (x *RoomInformationElement) GetCampus() string { - if x != nil { - return x.Campus - } - return "" -} - -func (x *RoomInformationElement) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type GetListOfElevatorsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ListOfElevators []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfElevators,proto3" json:"listOfElevators,omitempty"` -} - -func (x *GetListOfElevatorsReply) Reset() { - *x = GetListOfElevatorsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetListOfElevatorsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetListOfElevatorsReply) ProtoMessage() {} - -func (x *GetListOfElevatorsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetListOfElevatorsReply.ProtoReflect.Descriptor instead. -func (*GetListOfElevatorsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{33} -} - -func (x *GetListOfElevatorsReply) GetListOfElevators() []*RoomInformationElement { - if x != nil { - return x.ListOfElevators - } - return nil -} - -type GetMoreInformationReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Information []*MoreInformationElement `protobuf:"bytes,1,rep,name=information,proto3" json:"information,omitempty"` -} - -func (x *GetMoreInformationReply) Reset() { - *x = GetMoreInformationReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetMoreInformationReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetMoreInformationReply) ProtoMessage() {} - -func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetMoreInformationReply.ProtoReflect.Descriptor instead. -func (*GetMoreInformationReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{34} -} - -func (x *GetMoreInformationReply) GetInformation() []*MoreInformationElement { - if x != nil { - return x.Information - } - return nil -} - -type MoreInformationElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` -} - -func (x *MoreInformationElement) Reset() { - *x = MoreInformationElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MoreInformationElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MoreInformationElement) ProtoMessage() {} - -func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MoreInformationElement.ProtoReflect.Descriptor instead. -func (*MoreInformationElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{35} -} - -func (x *MoreInformationElement) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *MoreInformationElement) GetCategory() string { - if x != nil { - return x.Category - } - return "" -} - -func (x *MoreInformationElement) GetUrl() string { - if x != nil { - return x.Url - } - return "" -} - -type GetOpeningTimesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"` -} - -func (x *GetOpeningTimesRequest) Reset() { - *x = GetOpeningTimesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetOpeningTimesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetOpeningTimesRequest) ProtoMessage() {} - -func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetOpeningTimesRequest.ProtoReflect.Descriptor instead. -func (*GetOpeningTimesRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{36} -} - -func (x *GetOpeningTimesRequest) GetLanguage() string { - if x != nil { - return x.Language - } - return "" -} - -type GetOpeningTimesReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Facilities []*OpeningTimesMsgElement `protobuf:"bytes,1,rep,name=facilities,proto3" json:"facilities,omitempty"` -} - -func (x *GetOpeningTimesReply) Reset() { - *x = GetOpeningTimesReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetOpeningTimesReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetOpeningTimesReply) ProtoMessage() {} - -func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetOpeningTimesReply.ProtoReflect.Descriptor instead. -func (*GetOpeningTimesReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{37} -} - -func (x *GetOpeningTimesReply) GetFacilities() []*OpeningTimesMsgElement { - if x != nil { - return x.Facilities - } - return nil -} - -type OpeningTimesMsgElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` - Room string `protobuf:"bytes,5,opt,name=room,proto3" json:"room,omitempty"` - TransportStation string `protobuf:"bytes,6,opt,name=transport_station,json=transportStation,proto3" json:"transport_station,omitempty"` - OpeningHours string `protobuf:"bytes,7,opt,name=opening_hours,json=openingHours,proto3" json:"opening_hours,omitempty"` - Infos string `protobuf:"bytes,8,opt,name=infos,proto3" json:"infos,omitempty"` - Url string `protobuf:"bytes,9,opt,name=url,proto3" json:"url,omitempty"` - Language string `protobuf:"bytes,10,opt,name=language,proto3" json:"language,omitempty"` - ReferenceId int32 `protobuf:"varint,11,opt,name=reference_id,json=referenceId,proto3" json:"reference_id,omitempty"` -} - -func (x *OpeningTimesMsgElement) Reset() { - *x = OpeningTimesMsgElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OpeningTimesMsgElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OpeningTimesMsgElement) ProtoMessage() {} - -func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OpeningTimesMsgElement.ProtoReflect.Descriptor instead. -func (*OpeningTimesMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{38} -} - -func (x *OpeningTimesMsgElement) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *OpeningTimesMsgElement) GetCategory() string { - if x != nil { - return x.Category - } - return "" -} - -func (x *OpeningTimesMsgElement) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *OpeningTimesMsgElement) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -func (x *OpeningTimesMsgElement) GetRoom() string { - if x != nil { - return x.Room - } - return "" -} - -func (x *OpeningTimesMsgElement) GetTransportStation() string { - if x != nil { - return x.TransportStation - } - return "" -} - -func (x *OpeningTimesMsgElement) GetOpeningHours() string { - if x != nil { - return x.OpeningHours - } - return "" -} - -func (x *OpeningTimesMsgElement) GetInfos() string { - if x != nil { - return x.Infos - } - return "" -} - -func (x *OpeningTimesMsgElement) GetUrl() string { - if x != nil { - return x.Url - } - return "" -} - -func (x *OpeningTimesMsgElement) GetLanguage() string { - if x != nil { - return x.Language - } - return "" -} - -func (x *OpeningTimesMsgElement) GetReferenceId() int32 { - if x != nil { - return x.ReferenceId - } - return 0 -} - -type GetUpdateNoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` -} - -func (x *GetUpdateNoteRequest) Reset() { - *x = GetUpdateNoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUpdateNoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUpdateNoteRequest) ProtoMessage() {} - -func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUpdateNoteRequest.ProtoReflect.Descriptor instead. -func (*GetUpdateNoteRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{39} -} - -func (x *GetUpdateNoteRequest) GetVersion() int32 { - if x != nil { - return x.Version - } - return 0 -} - -type GetUpdateNoteReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *GetUpdateNoteReply) Reset() { - *x = GetUpdateNoteReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUpdateNoteReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUpdateNoteReply) ProtoMessage() {} - -func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUpdateNoteReply.ProtoReflect.Descriptor instead. -func (*GetUpdateNoteReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{40} -} - -func (x *GetUpdateNoteReply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type GetStudyRoomListReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rooms []*StudyRoomMsgElement `protobuf:"bytes,1,rep,name=rooms,proto3" json:"rooms,omitempty"` -} - -func (x *GetStudyRoomListReply) Reset() { - *x = GetStudyRoomListReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetStudyRoomListReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetStudyRoomListReply) ProtoMessage() {} - -func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetStudyRoomListReply.ProtoReflect.Descriptor instead. -func (*GetStudyRoomListReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{41} -} - -func (x *GetStudyRoomListReply) GetRooms() []*StudyRoomMsgElement { - if x != nil { - return x.Rooms - } - return nil -} - -type StudyRoomMsgElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` - Rooms []*StudyRoom `protobuf:"bytes,4,rep,name=rooms,proto3" json:"rooms,omitempty"` -} - -func (x *StudyRoomMsgElement) Reset() { - *x = StudyRoomMsgElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StudyRoomMsgElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StudyRoomMsgElement) ProtoMessage() {} - -func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StudyRoomMsgElement.ProtoReflect.Descriptor instead. -func (*StudyRoomMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{42} -} - -func (x *StudyRoomMsgElement) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *StudyRoomMsgElement) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *StudyRoomMsgElement) GetDetails() string { - if x != nil { - return x.Details - } - return "" -} - -func (x *StudyRoomMsgElement) GetRooms() []*StudyRoom { - if x != nil { - return x.Rooms - } - return nil -} - -type StudyRoom struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GroupId int32 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - RoomId int32 `protobuf:"varint,2,opt,name=roomId,proto3" json:"roomId,omitempty"` - RoomCode string `protobuf:"bytes,3,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` - RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` - BuildingName string `protobuf:"bytes,5,opt,name=building_name,json=buildingName,proto3" json:"building_name,omitempty"` -} - -func (x *StudyRoom) Reset() { - *x = StudyRoom{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StudyRoom) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StudyRoom) ProtoMessage() {} - -func (x *StudyRoom) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StudyRoom.ProtoReflect.Descriptor instead. -func (*StudyRoom) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{43} -} - -func (x *StudyRoom) GetGroupId() int32 { - if x != nil { - return x.GroupId - } - return 0 -} - -func (x *StudyRoom) GetRoomId() int32 { - if x != nil { - return x.RoomId - } - return 0 -} - -func (x *StudyRoom) GetRoomCode() string { - if x != nil { - return x.RoomCode - } - return "" -} - -func (x *StudyRoom) GetRoomName() string { - if x != nil { - return x.RoomName - } - return "" -} - -func (x *StudyRoom) GetBuildingName() string { - if x != nil { - return x.BuildingName - } - return "" -} - -type GetKinoRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LastId int32 `protobuf:"varint,1,opt,name=lastId,proto3" json:"lastId,omitempty"` -} - -func (x *GetKinoRequest) Reset() { - *x = GetKinoRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetKinoRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetKinoRequest) ProtoMessage() {} - -func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetKinoRequest.ProtoReflect.Descriptor instead. -func (*GetKinoRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{44} -} - -func (x *GetKinoRequest) GetLastId() int32 { - if x != nil { - return x.LastId - } - return 0 -} - -type GetKinoReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Kinos []*KinoMsgElement `protobuf:"bytes,1,rep,name=kinos,proto3" json:"kinos,omitempty"` -} - -func (x *GetKinoReply) Reset() { - *x = GetKinoReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetKinoReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetKinoReply) ProtoMessage() {} - -func (x *GetKinoReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetKinoReply.ProtoReflect.Descriptor instead. -func (*GetKinoReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{45} -} - -func (x *GetKinoReply) GetKinos() []*KinoMsgElement { - if x != nil { - return x.Kinos - } - return nil -} - -type KinoMsgElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Kino int32 `protobuf:"varint,3,opt,name=kino,proto3" json:"kino,omitempty"` - Date *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=date,proto3" json:"date,omitempty"` - Created *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created,proto3" json:"created,omitempty"` - Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` - Year string `protobuf:"bytes,7,opt,name=year,proto3" json:"year,omitempty"` - Runtime string `protobuf:"bytes,8,opt,name=runtime,proto3" json:"runtime,omitempty"` - Genre string `protobuf:"bytes,9,opt,name=genre,proto3" json:"genre,omitempty"` - Director string `protobuf:"bytes,10,opt,name=director,proto3" json:"director,omitempty"` - Actors string `protobuf:"bytes,11,opt,name=actors,proto3" json:"actors,omitempty"` - Rating string `protobuf:"bytes,12,opt,name=rating,proto3" json:"rating,omitempty"` - Description string `protobuf:"bytes,13,opt,name=description,proto3" json:"description,omitempty"` - Cover int32 `protobuf:"varint,14,opt,name=cover,proto3" json:"cover,omitempty"` - Trailer string `protobuf:"bytes,15,opt,name=trailer,proto3" json:"trailer,omitempty"` - Link string `protobuf:"bytes,16,opt,name=link,proto3" json:"link,omitempty"` -} - -func (x *KinoMsgElement) Reset() { - *x = KinoMsgElement{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *KinoMsgElement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KinoMsgElement) ProtoMessage() {} - -func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KinoMsgElement.ProtoReflect.Descriptor instead. -func (*KinoMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{46} -} - -func (x *KinoMsgElement) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *KinoMsgElement) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *KinoMsgElement) GetKino() int32 { - if x != nil { - return x.Kino - } - return 0 -} - -func (x *KinoMsgElement) GetDate() *timestamppb.Timestamp { - if x != nil { - return x.Date - } - return nil -} - -func (x *KinoMsgElement) GetCreated() *timestamppb.Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *KinoMsgElement) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *KinoMsgElement) GetYear() string { - if x != nil { - return x.Year - } - return "" -} - -func (x *KinoMsgElement) GetRuntime() string { - if x != nil { - return x.Runtime - } - return "" -} - -func (x *KinoMsgElement) GetGenre() string { - if x != nil { - return x.Genre - } - return "" -} - -func (x *KinoMsgElement) GetDirector() string { - if x != nil { - return x.Director - } - return "" -} - -func (x *KinoMsgElement) GetActors() string { - if x != nil { - return x.Actors - } - return "" -} - -func (x *KinoMsgElement) GetRating() string { - if x != nil { - return x.Rating - } - return "" -} - -func (x *KinoMsgElement) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *KinoMsgElement) GetCover() int32 { - if x != nil { - return x.Cover - } - return 0 -} - -func (x *KinoMsgElement) GetTrailer() string { - if x != nil { - return x.Trailer - } - return "" -} - -func (x *KinoMsgElement) GetLink() string { - if x != nil { - return x.Link - } - return "" -} - -type SendFeedbackRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - EmailId string `protobuf:"bytes,3,opt,name=emailId,proto3" json:"emailId,omitempty"` - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` - ImageCount int32 `protobuf:"varint,5,opt,name=image_count,json=imageCount,proto3" json:"image_count,omitempty"` - Latitude float64 `protobuf:"fixed64,6,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude float64 `protobuf:"fixed64,7,opt,name=longitude,proto3" json:"longitude,omitempty"` - OsVersion string `protobuf:"bytes,8,opt,name=osVersion,proto3" json:"osVersion,omitempty"` - AppVersion string `protobuf:"bytes,9,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *SendFeedbackRequest) Reset() { - *x = SendFeedbackRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendFeedbackRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendFeedbackRequest) ProtoMessage() {} - -func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendFeedbackRequest.ProtoReflect.Descriptor instead. -func (*SendFeedbackRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{47} -} - -func (x *SendFeedbackRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -func (x *SendFeedbackRequest) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *SendFeedbackRequest) GetEmailId() string { - if x != nil { - return x.EmailId - } - return "" -} - -func (x *SendFeedbackRequest) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *SendFeedbackRequest) GetImageCount() int32 { - if x != nil { - return x.ImageCount - } - return 0 -} - -func (x *SendFeedbackRequest) GetLatitude() float64 { - if x != nil { - return x.Latitude - } - return 0 -} - -func (x *SendFeedbackRequest) GetLongitude() float64 { - if x != nil { - return x.Longitude - } - return 0 -} - -func (x *SendFeedbackRequest) GetOsVersion() string { - if x != nil { - return x.OsVersion - } - return "" -} - -func (x *SendFeedbackRequest) GetAppVersion() string { - if x != nil { - return x.AppVersion - } - return "" -} - -type SendFeedbackImageReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` -} - -func (x *SendFeedbackImageReply) Reset() { - *x = SendFeedbackImageReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendFeedbackImageReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendFeedbackImageReply) ProtoMessage() {} - -func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendFeedbackImageReply.ProtoReflect.Descriptor instead. -func (*SendFeedbackImageReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{48} -} - -func (x *SendFeedbackImageReply) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -type SendFeedbackImageRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - ImageNr int32 `protobuf:"varint,2,opt,name=imageNr,proto3" json:"imageNr,omitempty"` //todo where does the file come from? -} - -func (x *SendFeedbackImageRequest) Reset() { - *x = SendFeedbackImageRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SendFeedbackImageRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SendFeedbackImageRequest) ProtoMessage() {} - -func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SendFeedbackImageRequest.ProtoReflect.Descriptor instead. -func (*SendFeedbackImageRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{49} -} - -func (x *SendFeedbackImageRequest) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *SendFeedbackImageRequest) GetImageNr() int32 { - if x != nil { - return x.ImageNr - } - return 0 -} - -type GetMembersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` -} - -func (x *GetMembersRequest) Reset() { - *x = GetMembersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetMembersRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetMembersRequest) ProtoMessage() {} - -func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetMembersRequest.ProtoReflect.Descriptor instead. -func (*GetMembersRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{50} -} - -func (x *GetMembersRequest) GetLrzId() string { - if x != nil { - return x.LrzId - } - return "" -} - -type GetMembersReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - MemberId int32 `protobuf:"varint,3,opt,name=memberId,proto3" json:"memberId,omitempty"` -} - -func (x *GetMembersReply) Reset() { - *x = GetMembersReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetMembersReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetMembersReply) ProtoMessage() {} - -func (x *GetMembersReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetMembersReply.ProtoReflect.Descriptor instead. -func (*GetMembersReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{51} -} - -func (x *GetMembersReply) GetLrzId() string { - if x != nil { - return x.LrzId - } - return "" -} - -func (x *GetMembersReply) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *GetMembersReply) GetMemberId() int32 { - if x != nil { - return x.MemberId - } - return 0 -} - -type GetUploadStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` -} - -func (x *GetUploadStatusRequest) Reset() { - *x = GetUploadStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUploadStatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUploadStatusRequest) ProtoMessage() {} - -func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUploadStatusRequest.ProtoReflect.Descriptor instead. -func (*GetUploadStatusRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{52} -} - -func (x *GetUploadStatusRequest) GetLrzId() string { - if x != nil { - return x.LrzId - } - return "" -} - -type GetUploadStatusReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FcmToken string `protobuf:"bytes,1,opt,name=fcm_token,json=fcmToken,proto3" json:"fcm_token,omitempty"` - PublicKey string `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - StudentId bool `protobuf:"varint,3,opt,name=student_id,json=studentId,proto3" json:"student_id,omitempty"` - EmployeeId bool `protobuf:"varint,4,opt,name=employee_id,json=employeeId,proto3" json:"employee_id,omitempty"` - ExternalId bool `protobuf:"varint,5,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"` -} - -func (x *GetUploadStatusReply) Reset() { - *x = GetUploadStatusReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUploadStatusReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUploadStatusReply) ProtoMessage() {} - -func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUploadStatusReply.ProtoReflect.Descriptor instead. -func (*GetUploadStatusReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{53} -} - -func (x *GetUploadStatusReply) GetFcmToken() string { - if x != nil { - return x.FcmToken - } - return "" -} - -func (x *GetUploadStatusReply) GetPublicKey() string { - if x != nil { - return x.PublicKey - } - return "" -} - -func (x *GetUploadStatusReply) GetStudentId() bool { - if x != nil { - return x.StudentId - } - return false -} - -func (x *GetUploadStatusReply) GetEmployeeId() bool { - if x != nil { - return x.EmployeeId - } - return false -} - -func (x *GetUploadStatusReply) GetExternalId() bool { - if x != nil { - return x.ExternalId - } - return false -} - -type GetNotificationsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` - Type int32 `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"` - Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - Signature string `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (x *GetNotificationsReply) Reset() { - *x = GetNotificationsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetNotificationsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetNotificationsReply) ProtoMessage() {} - -func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetNotificationsReply.ProtoReflect.Descriptor instead. -func (*GetNotificationsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{54} -} - -func (x *GetNotificationsReply) GetNotificationId() int32 { - if x != nil { - return x.NotificationId - } - return 0 -} - -func (x *GetNotificationsReply) GetType() int32 { - if x != nil { - return x.Type - } - return 0 -} - -func (x *GetNotificationsReply) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *GetNotificationsReply) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *GetNotificationsReply) GetSignature() string { - if x != nil { - return x.Signature - } - return "" -} - -type NotificationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` -} - -func (x *NotificationsRequest) Reset() { - *x = NotificationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NotificationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NotificationsRequest) ProtoMessage() {} - -func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NotificationsRequest.ProtoReflect.Descriptor instead. -func (*NotificationsRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{55} -} - -func (x *NotificationsRequest) GetNotificationId() int32 { - if x != nil { - return x.NotificationId - } - return 0 -} - -type GetNotificationsConfirmReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` -} - -func (x *GetNotificationsConfirmReply) Reset() { - *x = GetNotificationsConfirmReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetNotificationsConfirmReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetNotificationsConfirmReply) ProtoMessage() {} - -func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetNotificationsConfirmReply.ProtoReflect.Descriptor instead. -func (*GetNotificationsConfirmReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{56} -} - -func (x *GetNotificationsConfirmReply) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -type GetCanteenHeadCountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The requested canteen ID - CanteenId string `protobuf:"bytes,1,opt,name=canteenId,proto3" json:"canteenId,omitempty"` -} - -func (x *GetCanteenHeadCountRequest) Reset() { - *x = GetCanteenHeadCountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetCanteenHeadCountRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetCanteenHeadCountRequest) ProtoMessage() {} - -func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetCanteenHeadCountRequest.ProtoReflect.Descriptor instead. -func (*GetCanteenHeadCountRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{57} -} - -func (x *GetCanteenHeadCountRequest) GetCanteenId() string { - if x != nil { - return x.CanteenId - } - return "" -} - -type GetCanteenHeadCountReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The absolut count of humans in the canteen. Only valid in case percent != -1. - Count uint32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` - // The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. - MaxCount uint32 `protobuf:"varint,2,opt,name=maxCount,proto3" json:"maxCount,omitempty"` - // Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. - Percent float32 `protobuf:"fixed32,3,opt,name=percent,proto3" json:"percent,omitempty"` - // A time stamp indicating how up to date the response is. Only valid in case percent != -1. - Timestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (x *GetCanteenHeadCountReply) Reset() { - *x = GetCanteenHeadCountReply{} - if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetCanteenHeadCountReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetCanteenHeadCountReply) ProtoMessage() {} - -func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetCanteenHeadCountReply.ProtoReflect.Descriptor instead. -func (*GetCanteenHeadCountReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{58} -} - -func (x *GetCanteenHeadCountReply) GetCount() uint32 { - if x != nil { - return x.Count - } - return 0 -} - -func (x *GetCanteenHeadCountReply) GetMaxCount() uint32 { - if x != nil { - return x.MaxCount - } - return 0 -} - -func (x *GetCanteenHeadCountReply) GetPercent() float32 { - if x != nil { - return x.Percent - } - return 0 -} - -func (x *GetCanteenHeadCountReply) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -var File_CampusService_proto protoreflect.FileDescriptor - -var file_CampusService_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x31, - 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x22, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3c, 0x0a, 0x0f, - 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, - 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, 0x4e, 0x65, - 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, - 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, - 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, - 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x2e, - 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, - 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x04, - 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, - 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xc4, - 0x01, 0x0a, 0x14, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, - 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, - 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, - 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, - 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x11, 0x53, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x43, - 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0xc4, 0x01, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x54, 0x61, 0x67, - 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x6e, 0x22, - 0x39, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x13, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, - 0x6f, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, - 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, - 0x22, 0x41, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x22, 0x6f, 0x0a, 0x09, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x22, 0x6e, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, - 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x77, 0x65, - 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x22, 0x68, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, - 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, - 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63, - 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x75, - 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x22, 0x54, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x22, - 0x5f, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, - 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x1a, 0x61, 0x72, 0x65, 0x61, 0x46, - 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x72, 0x65, 0x61, 0x46, 0x61, - 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x47, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, - 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x5a, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, - 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6c, 0x69, 0x73, 0x74, - 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x16, 0x52, 0x6f, - 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, - 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x60, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, - 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, - 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x58, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x16, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, - 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x70, - 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, 0x02, 0x0a, - 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, - 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, - 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x30, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x72, 0x6f, 0x6f, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x79, 0x0a, 0x13, 0x53, 0x74, 0x75, - 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x24, - 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, - 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, - 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, - 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x22, 0x39, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x22, 0xbe, 0x03, 0x0a, 0x0e, 0x4b, 0x69, - 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x8e, 0x02, 0x0a, 0x13, 0x53, - 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x16, 0x53, - 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x44, 0x0a, - 0x18, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x4e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0x57, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xa9, 0x01, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x1c, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, - 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, 0xa0, 0x01, - 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, - 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, - 0x02, 0x32, 0xfe, 0x19, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, - 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, - 0x12, 0x09, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, 0x2f, 0x6e, - 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, - 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x6e, 0x0a, 0x12, 0x4e, 0x65, 0x77, - 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, - 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x5f, 0x0a, 0x0d, 0x4e, 0x65, 0x77, - 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x71, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, - 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x66, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x62, - 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x2f, 0x64, 0x69, - 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, - 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x7b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x62, 0x09, 0x63, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x18, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x2f, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, - 0x12, 0x56, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, - 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x61, - 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, - 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, - 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, - 0x72, 0x65, 0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, - 0x12, 0x90, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x4e, 0x72, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, - 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, - 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, - 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6e, 0x65, 0x61, - 0x72, 0x62, 0x79, 0x12, 0x64, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, - 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, - 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, - 0x65, 0x2f, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x65, 0x6c, 0x65, 0x76, - 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x62, 0x61, 0x72, 0x72, - 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x70, - 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, - 0x6e, 0x69, 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x12, 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x79, - 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, - 0x12, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, - 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x12, 0x0e, 0x2f, 0x6b, 0x69, 0x6e, 0x6f, 0x2f, 0x7b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x7d, - 0x12, 0x58, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, - 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, - 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, - 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x71, 0x0a, 0x11, 0x53, 0x65, - 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, - 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, - 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x7d, 0x12, 0x6b, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x12, 0x18, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x71, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x87, 0x01, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, - 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x7d, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x2f, 0x7b, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x99, 0x01, 0x0a, - 0x18, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, - 0x2f, 0x69, 0x6f, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, - 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x7d, 0x42, 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, - 0x6d, 0x70, 0x75, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, - 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, - 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_CampusService_proto_rawDescOnce sync.Once - file_CampusService_proto_rawDescData = file_CampusService_proto_rawDesc -) - -func file_CampusService_proto_rawDescGZIP() []byte { - file_CampusService_proto_rawDescOnce.Do(func() { - file_CampusService_proto_rawDescData = protoimpl.X.CompressGZIP(file_CampusService_proto_rawDescData) - }) - return file_CampusService_proto_rawDescData -} - -var file_CampusService_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_CampusService_proto_msgTypes = make([]protoimpl.MessageInfo, 59) -var file_CampusService_proto_goTypes = []interface{}{ - (DeviceType)(0), // 0: api.DeviceType - (*RegisterDeviceRequest)(nil), // 1: api.RegisterDeviceRequest - (*RegisterDeviceReply)(nil), // 2: api.RegisterDeviceReply - (*RemoveDeviceRequest)(nil), // 3: api.RemoveDeviceRequest - (*RemoveDeviceReply)(nil), // 4: api.RemoveDeviceReply - (*IOSDeviceRequestResponseRequest)(nil), // 5: api.IOSDeviceRequestResponseRequest - (*IOSDeviceRequestResponseReply)(nil), // 6: api.IOSDeviceRequestResponseReply - (*NewsSourceArray)(nil), // 7: api.NewsSourceArray - (*NewsSource)(nil), // 8: api.NewsSource - (*GetTopNewsReply)(nil), // 9: api.GetTopNewsReply - (*CafeteriaRatingRequest)(nil), // 10: api.CafeteriaRatingRequest - (*DishRatingRequest)(nil), // 11: api.DishRatingRequest - (*CafeteriaRatingReply)(nil), // 12: api.CafeteriaRatingReply - (*DishRatingReply)(nil), // 13: api.DishRatingReply - (*SingleRatingReply)(nil), // 14: api.SingleRatingReply - (*NewCafeteriaRatingRequest)(nil), // 15: api.NewCafeteriaRatingRequest - (*NewDishRatingRequest)(nil), // 16: api.NewDishRatingRequest - (*GetTagsReply)(nil), // 17: api.GetTagsReply - (*TagsOverview)(nil), // 18: api.TagsOverview - (*RatingTag)(nil), // 19: api.RatingTag - (*RatingTagNewRequest)(nil), // 20: api.RatingTagNewRequest - (*RatingTagResult)(nil), // 21: api.RatingTagResult - (*GetCafeteriaReply)(nil), // 22: api.GetCafeteriaReply - (*Cafeteria)(nil), // 23: api.Cafeteria - (*GetDishesRequest)(nil), // 24: api.GetDishesRequest - (*GetDishesReply)(nil), // 25: api.GetDishesReply - (*GetResponsiblePersonReply)(nil), // 26: api.GetResponsiblePersonReply - (*ResponsiblePersonElement)(nil), // 27: api.ResponsiblePersonElement - (*GetBuilding2GpsReply)(nil), // 28: api.GetBuilding2GpsReply - (*Building2GpsElement)(nil), // 29: api.Building2GpsElement - (*GetAreaFacilitiesByBuildingNrReply)(nil), // 30: api.GetAreaFacilitiesByBuildingNrReply - (*GetAreaFacilitiesByBuildingNrRequest)(nil), // 31: api.GetAreaFacilitiesByBuildingNrRequest - (*GetListOfToiletsReply)(nil), // 32: api.GetListOfToiletsReply - (*RoomInformationElement)(nil), // 33: api.RoomInformationElement - (*GetListOfElevatorsReply)(nil), // 34: api.GetListOfElevatorsReply - (*GetMoreInformationReply)(nil), // 35: api.GetMoreInformationReply - (*MoreInformationElement)(nil), // 36: api.MoreInformationElement - (*GetOpeningTimesRequest)(nil), // 37: api.GetOpeningTimesRequest - (*GetOpeningTimesReply)(nil), // 38: api.GetOpeningTimesReply - (*OpeningTimesMsgElement)(nil), // 39: api.OpeningTimesMsgElement - (*GetUpdateNoteRequest)(nil), // 40: api.GetUpdateNoteRequest - (*GetUpdateNoteReply)(nil), // 41: api.GetUpdateNoteReply - (*GetStudyRoomListReply)(nil), // 42: api.GetStudyRoomListReply - (*StudyRoomMsgElement)(nil), // 43: api.StudyRoomMsgElement - (*StudyRoom)(nil), // 44: api.StudyRoom - (*GetKinoRequest)(nil), // 45: api.GetKinoRequest - (*GetKinoReply)(nil), // 46: api.GetKinoReply - (*KinoMsgElement)(nil), // 47: api.KinoMsgElement - (*SendFeedbackRequest)(nil), // 48: api.SendFeedbackRequest - (*SendFeedbackImageReply)(nil), // 49: api.SendFeedbackImageReply - (*SendFeedbackImageRequest)(nil), // 50: api.SendFeedbackImageRequest - (*GetMembersRequest)(nil), // 51: api.GetMembersRequest - (*GetMembersReply)(nil), // 52: api.GetMembersReply - (*GetUploadStatusRequest)(nil), // 53: api.GetUploadStatusRequest - (*GetUploadStatusReply)(nil), // 54: api.GetUploadStatusReply - (*GetNotificationsReply)(nil), // 55: api.GetNotificationsReply - (*NotificationsRequest)(nil), // 56: api.NotificationsRequest - (*GetNotificationsConfirmReply)(nil), // 57: api.GetNotificationsConfirmReply - (*GetCanteenHeadCountRequest)(nil), // 58: api.GetCanteenHeadCountRequest - (*GetCanteenHeadCountReply)(nil), // 59: api.GetCanteenHeadCountReply - (*timestamppb.Timestamp)(nil), // 60: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 61: google.protobuf.Empty -} -var file_CampusService_proto_depIdxs = []int32{ - 0, // 0: api.RegisterDeviceRequest.deviceType:type_name -> api.DeviceType - 0, // 1: api.RemoveDeviceRequest.deviceType:type_name -> api.DeviceType - 8, // 2: api.NewsSourceArray.sources:type_name -> api.NewsSource - 60, // 3: api.GetTopNewsReply.created:type_name -> google.protobuf.Timestamp - 60, // 4: api.GetTopNewsReply.from:type_name -> google.protobuf.Timestamp - 60, // 5: api.GetTopNewsReply.to:type_name -> google.protobuf.Timestamp - 60, // 6: api.CafeteriaRatingRequest.from:type_name -> google.protobuf.Timestamp - 60, // 7: api.CafeteriaRatingRequest.to:type_name -> google.protobuf.Timestamp - 60, // 8: api.DishRatingRequest.from:type_name -> google.protobuf.Timestamp - 60, // 9: api.DishRatingRequest.to:type_name -> google.protobuf.Timestamp - 14, // 10: api.CafeteriaRatingReply.rating:type_name -> api.SingleRatingReply - 21, // 11: api.CafeteriaRatingReply.ratingTags:type_name -> api.RatingTagResult - 14, // 12: api.DishRatingReply.rating:type_name -> api.SingleRatingReply - 21, // 13: api.DishRatingReply.ratingTags:type_name -> api.RatingTagResult - 21, // 14: api.DishRatingReply.nameTags:type_name -> api.RatingTagResult - 20, // 15: api.SingleRatingReply.ratingTags:type_name -> api.RatingTagNewRequest - 60, // 16: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp - 19, // 17: api.NewCafeteriaRatingRequest.ratingTags:type_name -> api.RatingTag - 19, // 18: api.NewDishRatingRequest.ratingTags:type_name -> api.RatingTag - 18, // 19: api.GetTagsReply.ratingTags:type_name -> api.TagsOverview - 23, // 20: api.GetCafeteriaReply.cafeteria:type_name -> api.Cafeteria - 27, // 21: api.GetResponsiblePersonReply.responsiblePerson:type_name -> api.ResponsiblePersonElement - 29, // 22: api.GetBuilding2GpsReply.building2Gps:type_name -> api.Building2GpsElement - 33, // 23: api.GetAreaFacilitiesByBuildingNrReply.areaFacilitiesByBuildingNr:type_name -> api.RoomInformationElement - 33, // 24: api.GetListOfToiletsReply.listOfToilets:type_name -> api.RoomInformationElement - 33, // 25: api.GetListOfElevatorsReply.listOfElevators:type_name -> api.RoomInformationElement - 36, // 26: api.GetMoreInformationReply.information:type_name -> api.MoreInformationElement - 39, // 27: api.GetOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement - 43, // 28: api.GetStudyRoomListReply.rooms:type_name -> api.StudyRoomMsgElement - 44, // 29: api.StudyRoomMsgElement.rooms:type_name -> api.StudyRoom - 47, // 30: api.GetKinoReply.kinos:type_name -> api.KinoMsgElement - 60, // 31: api.KinoMsgElement.date:type_name -> google.protobuf.Timestamp - 60, // 32: api.KinoMsgElement.created:type_name -> google.protobuf.Timestamp - 60, // 33: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp - 61, // 34: api.Campus.GetTopNews:input_type -> google.protobuf.Empty - 61, // 35: api.Campus.GetNewsSources:input_type -> google.protobuf.Empty - 10, // 36: api.Campus.GetCafeteriaRatings:input_type -> api.CafeteriaRatingRequest - 11, // 37: api.Campus.GetDishRatings:input_type -> api.DishRatingRequest - 15, // 38: api.Campus.NewCafeteriaRating:input_type -> api.NewCafeteriaRatingRequest - 16, // 39: api.Campus.NewDishRating:input_type -> api.NewDishRatingRequest - 61, // 40: api.Campus.GetAvailableDishTags:input_type -> google.protobuf.Empty - 61, // 41: api.Campus.GetNameTags:input_type -> google.protobuf.Empty - 61, // 42: api.Campus.GetAvailableCafeteriaTags:input_type -> google.protobuf.Empty - 61, // 43: api.Campus.GetCafeterias:input_type -> google.protobuf.Empty - 24, // 44: api.Campus.GetDishes:input_type -> api.GetDishesRequest - 61, // 45: api.Campus.GetResponsiblePerson:input_type -> google.protobuf.Empty - 61, // 46: api.Campus.GetBuilding2Gps:input_type -> google.protobuf.Empty - 31, // 47: api.Campus.GetAreaFacilitiesByBuildingNr:input_type -> api.GetAreaFacilitiesByBuildingNrRequest - 61, // 48: api.Campus.GetListOfToilets:input_type -> google.protobuf.Empty - 61, // 49: api.Campus.GetListOfElevators:input_type -> google.protobuf.Empty - 61, // 50: api.Campus.GetMoreInformation:input_type -> google.protobuf.Empty - 37, // 51: api.Campus.GetOpeningTimes:input_type -> api.GetOpeningTimesRequest - 40, // 52: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest - 61, // 53: api.Campus.GetStudyRoomList:input_type -> google.protobuf.Empty - 45, // 54: api.Campus.GetKino:input_type -> api.GetKinoRequest - 48, // 55: api.Campus.SendFeedback:input_type -> api.SendFeedbackRequest - 50, // 56: api.Campus.SendFeedbackImage:input_type -> api.SendFeedbackImageRequest - 53, // 57: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest - 56, // 58: api.Campus.GetNotification:input_type -> api.NotificationsRequest - 56, // 59: api.Campus.GetNotificationConfirm:input_type -> api.NotificationsRequest - 51, // 60: api.Campus.GetMembers:input_type -> api.GetMembersRequest - 58, // 61: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest - 5, // 62: api.Campus.IOSDeviceRequestResponse:input_type -> api.IOSDeviceRequestResponseRequest - 1, // 63: api.Campus.RegisterDevice:input_type -> api.RegisterDeviceRequest - 3, // 64: api.Campus.RemoveDevice:input_type -> api.RemoveDeviceRequest - 9, // 65: api.Campus.GetTopNews:output_type -> api.GetTopNewsReply - 7, // 66: api.Campus.GetNewsSources:output_type -> api.NewsSourceArray - 12, // 67: api.Campus.GetCafeteriaRatings:output_type -> api.CafeteriaRatingReply - 13, // 68: api.Campus.GetDishRatings:output_type -> api.DishRatingReply - 61, // 69: api.Campus.NewCafeteriaRating:output_type -> google.protobuf.Empty - 61, // 70: api.Campus.NewDishRating:output_type -> google.protobuf.Empty - 17, // 71: api.Campus.GetAvailableDishTags:output_type -> api.GetTagsReply - 17, // 72: api.Campus.GetNameTags:output_type -> api.GetTagsReply - 17, // 73: api.Campus.GetAvailableCafeteriaTags:output_type -> api.GetTagsReply - 22, // 74: api.Campus.GetCafeterias:output_type -> api.GetCafeteriaReply - 25, // 75: api.Campus.GetDishes:output_type -> api.GetDishesReply - 26, // 76: api.Campus.GetResponsiblePerson:output_type -> api.GetResponsiblePersonReply - 28, // 77: api.Campus.GetBuilding2Gps:output_type -> api.GetBuilding2GpsReply - 30, // 78: api.Campus.GetAreaFacilitiesByBuildingNr:output_type -> api.GetAreaFacilitiesByBuildingNrReply - 32, // 79: api.Campus.GetListOfToilets:output_type -> api.GetListOfToiletsReply - 34, // 80: api.Campus.GetListOfElevators:output_type -> api.GetListOfElevatorsReply - 35, // 81: api.Campus.GetMoreInformation:output_type -> api.GetMoreInformationReply - 38, // 82: api.Campus.GetOpeningTimes:output_type -> api.GetOpeningTimesReply - 41, // 83: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply - 42, // 84: api.Campus.GetStudyRoomList:output_type -> api.GetStudyRoomListReply - 46, // 85: api.Campus.GetKino:output_type -> api.GetKinoReply - 49, // 86: api.Campus.SendFeedback:output_type -> api.SendFeedbackImageReply - 49, // 87: api.Campus.SendFeedbackImage:output_type -> api.SendFeedbackImageReply - 54, // 88: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply - 55, // 89: api.Campus.GetNotification:output_type -> api.GetNotificationsReply - 57, // 90: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationsConfirmReply - 52, // 91: api.Campus.GetMembers:output_type -> api.GetMembersReply - 59, // 92: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply - 6, // 93: api.Campus.IOSDeviceRequestResponse:output_type -> api.IOSDeviceRequestResponseReply - 2, // 94: api.Campus.RegisterDevice:output_type -> api.RegisterDeviceReply - 4, // 95: api.Campus.RemoveDevice:output_type -> api.RemoveDeviceReply - 65, // [65:96] is the sub-list for method output_type - 34, // [34:65] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name -} - -func init() { file_CampusService_proto_init() } -func file_CampusService_proto_init() { - if File_CampusService_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_CampusService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterDeviceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterDeviceReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveDeviceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveDeviceReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOSDeviceRequestResponseRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOSDeviceRequestResponseReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewsSourceArray); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewsSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTopNewsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CafeteriaRatingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DishRatingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CafeteriaRatingReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DishRatingReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SingleRatingReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewCafeteriaRatingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewDishRatingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTagsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TagsOverview); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTag); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTagNewRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTagResult); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCafeteriaReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cafeteria); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDishesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDishesReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResponsiblePersonReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResponsiblePersonElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuilding2GpsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Building2GpsElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAreaFacilitiesByBuildingNrReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAreaFacilitiesByBuildingNrRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetListOfToiletsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoomInformationElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetListOfElevatorsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMoreInformationReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MoreInformationElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOpeningTimesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOpeningTimesReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpeningTimesMsgElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUpdateNoteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUpdateNoteReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStudyRoomListReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StudyRoomMsgElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StudyRoom); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKinoRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKinoReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KinoMsgElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackImageReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackImageRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMembersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMembersReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUploadStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUploadStatusReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNotificationsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotificationsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNotificationsConfirmReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCanteenHeadCountRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_CampusService_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCanteenHeadCountReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_CampusService_proto_msgTypes[0].OneofWrappers = []interface{}{} - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_CampusService_proto_rawDesc, - NumEnums: 1, - NumMessages: 59, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_CampusService_proto_goTypes, - DependencyIndexes: file_CampusService_proto_depIdxs, - EnumInfos: file_CampusService_proto_enumTypes, - MessageInfos: file_CampusService_proto_msgTypes, - }.Build() - File_CampusService_proto = out.File - file_CampusService_proto_rawDesc = nil - file_CampusService_proto_goTypes = nil - file_CampusService_proto_depIdxs = nil -} diff --git a/server/api/buf.gen.yaml b/server/api/buf.gen.yaml index 437c5a87..6f658a48 100644 --- a/server/api/buf.gen.yaml +++ b/server/api/buf.gen.yaml @@ -14,6 +14,6 @@ plugins: - paths=source_relative - allow_repeated_fields_in_body=true - name: openapiv2 - out: gen/openapiv2 + out: . opt: - allow_repeated_fields_in_body=true diff --git a/server/api/buf.lock b/server/api/buf.lock index 6c4355d4..c91b5810 100644 --- a/server/api/buf.lock +++ b/server/api/buf.lock @@ -1,8 +1,2 @@ # Generated by buf. DO NOT EDIT. version: v1 -deps: - - remote: buf.build - owner: googleapis - repository: googleapis - commit: 28151c0d0a1641bf938a7672c500e01d - digest: shake256:49215edf8ef57f7863004539deff8834cfb2195113f0b890dd1f67815d9353e28e668019165b9d872395871eeafcbab3ccfdb2b5f11734d3cca95be9e8d139de diff --git a/server/api/buf.yaml b/server/api/buf.yaml index 732d25a3..9ed7e989 100644 --- a/server/api/buf.yaml +++ b/server/api/buf.yaml @@ -1,6 +1,5 @@ version: v1 -deps: - - buf.build/googleapis/googleapis +deps: [] lint: use: - DEFAULT diff --git a/server/api/generate.sh b/server/api/generate.sh index ac530f71..7c0505b1 100755 --- a/server/api/generate.sh +++ b/server/api/generate.sh @@ -2,9 +2,14 @@ # needs buf: https://docs.buf.build/installation#github-releases +echo updating the generated files buf mod update buf generate -sed -i '1 a "basePath": "/v1",' ./gen/openapiv2/CampusService.swagger.json -cp ./gen/openapiv2/CampusService.swagger.json ../../server/swagger/swagger.json +echo making sure the openapi document points to the valid api +sed -i '1 a "basePath": "/v1",' ./tumdev/campus_backend.swagger.json + +echo making sure that all artifacts we don\'t need are cleaned up +rm -f google/api/*.go +rm -f google/api/*.swagger.json diff --git a/server/api/google/api/annotations.proto b/server/api/google/api/annotations.proto new file mode 100644 index 00000000..efdab3db --- /dev/null +++ b/server/api/google/api/annotations.proto @@ -0,0 +1,31 @@ +// Copyright 2015 Google LLC +// +// 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. + +syntax = "proto3"; + +package google.api; + +import "google/api/http.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See `HttpRule`. + HttpRule http = 72295728; +} diff --git a/server/api/google/api/http.proto b/server/api/google/api/http.proto new file mode 100644 index 00000000..31d867a2 --- /dev/null +++ b/server/api/google/api/http.proto @@ -0,0 +1,379 @@ +// Copyright 2023 Google LLC +// +// 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. + +syntax = "proto3"; + +package google.api; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +message Http { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated HttpRule rules = 1; + + // When set to true, URL path parameters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + bool fully_decode_reserved_expansion = 2; +} + +// # gRPC Transcoding +// +// gRPC Transcoding is a feature for mapping between a gRPC method and one or +// more HTTP REST endpoints. It allows developers to build a single API service +// that supports both gRPC APIs and REST APIs. Many systems, including [Google +// APIs](https://github.com/googleapis/googleapis), +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway), +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature +// and use it for large scale production services. +// +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies +// how different portions of the gRPC request message are mapped to the URL +// path, URL query parameters, and HTTP request body. It also controls how the +// gRPC response message is mapped to the HTTP response body. `HttpRule` is +// typically specified as an `google.api.http` annotation on the gRPC method. +// +// Each mapping specifies a URL path template and an HTTP method. The path +// template may refer to one or more fields in the gRPC request message, as long +// as each field is a non-repeated field with a primitive (non-message) type. +// The path template controls how fields of the request message are mapped to +// the URL path. +// +// Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/{name=messages/*}" +// }; +// } +// } +// message GetMessageRequest { +// string name = 1; // Mapped to URL path. +// } +// message Message { +// string text = 1; // The resource content. +// } +// +// This enables an HTTP REST to gRPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(name: "messages/123456")` +// +// Any fields in the request message which are not bound by the path template +// automatically become HTTP query parameters if there is no HTTP request body. +// For example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get:"/v1/messages/{message_id}" +// }; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // Mapped to URL path. +// int64 revision = 2; // Mapped to URL query parameter `revision`. +// SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. +// } +// +// This enables a HTTP JSON to RPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | +// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: +// "foo"))` +// +// Note that fields which are mapped to URL query parameters must have a +// primitive type or a repeated primitive type or a non-repeated message type. +// In the case of a repeated type, the parameter can be repeated in the URL +// as `...?param=A¶m=B`. In the case of a message type, each field of the +// message is mapped to a separate parameter, such as +// `...?foo.a=A&foo.b=B&foo.c=C`. +// +// For HTTP methods that allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice when +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// This enables the following two alternative HTTP JSON to RPC mappings: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: +// "123456")` +// +// ## Rules for HTTP mapping +// +// 1. Leaf request fields (recursive expansion nested messages in the request +// message) are classified into three categories: +// - Fields referred by the path template. They are passed via the URL path. +// - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They +// are passed via the HTTP +// request body. +// - All other fields are passed via the URL query parameters, and the +// parameter name is the field path in the request message. A repeated +// field can be represented as multiple query parameters under the same +// name. +// 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL +// query parameter, all fields +// are passed via URL path and HTTP request body. +// 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP +// request body, all +// fields are passed via URL path and URL query parameters. +// +// ### Path template syntax +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single URL path segment. The syntax `**` matches +// zero or more URL path segments, which must be the last part of the URL path +// except the `Verb`. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` +// contains any reserved character, such characters should be percent-encoded +// before the matching. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path on the client +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The +// server side does the reverse decoding. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{var}`. +// +// If a variable contains multiple path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path on the +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. +// The server side does the reverse decoding, except "%2F" and "%2f" are left +// unchanged. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{+var}`. +// +// ## Using gRPC API Service Configuration +// +// gRPC API Service Configuration (service config) is a configuration language +// for configuring a gRPC service to become a user-facing product. The +// service config is simply the YAML representation of the `google.api.Service` +// proto message. +// +// As an alternative to annotating your proto file, you can configure gRPC +// transcoding in your service config YAML files. You do this by specifying a +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same +// effect as the proto annotation. This can be particularly useful if you +// have a proto that is reused in multiple services. Note that any transcoding +// specified in the service config will override any matching transcoding +// configuration in the proto. +// +// Example: +// +// http: +// rules: +// # Selects a gRPC method and applies HttpRule to it. +// - selector: example.v1.Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// ## Special notes +// +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the +// proto to JSON conversion must follow the [proto3 +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json). +// +// While the single segment variable follows the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String +// Expansion, the multi segment variable **does not** follow RFC 6570 Section +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding +// for multi segment variables. +// +// The path variables **must not** refer to any repeated or mapped field, +// because client libraries are not capable of handling such variable expansion. +// +// The path variables **must not** capture the leading "/" character. The reason +// is that the most common use case "{var}" does not capture the leading "/" +// character. For consistency, all path variables must share the same behavior. +// +// Repeated message fields must not be mapped to URL query parameters, because +// no client library can support such complicated mapping. +// +// If an API needs to use a JSON array for request or response body, it can map +// the request or response body to a repeated field. However, some gRPC +// Transcoding implementations may not support this feature. +message HttpRule { + // Selects a method to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + oneof pattern { + // Maps to HTTP GET. Used for listing and getting information about + // resources. + string get = 2; + + // Maps to HTTP PUT. Used for replacing a resource. + string put = 3; + + // Maps to HTTP POST. Used for creating a resource or performing an action. + string post = 4; + + // Maps to HTTP DELETE. Used for deleting a resource. + string delete = 5; + + // Maps to HTTP PATCH. Used for updating a resource. + string patch = 6; + + // The custom pattern is used for specifying an HTTP method that is not + // included in the `pattern` field, such as HEAD, or "*" to leave the + // HTTP method unspecified for this rule. The wild-card rule is useful + // for services that provide content to Web (HTML) clients. + CustomHttpPattern custom = 8; + } + + // The name of the request field whose value is mapped to the HTTP request + // body, or `*` for mapping all request fields not captured by the path + // pattern to the HTTP body, or omitted for not having any HTTP request body. + // + // NOTE: the referred field must be present at the top-level of the request + // message type. + string body = 7; + + // Optional. The name of the response field whose value is mapped to the HTTP + // response body. When omitted, the entire response message will be used + // as the HTTP response body. + // + // NOTE: The referred field must be present at the top-level of the response + // message type. + string response_body = 12; + + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + repeated HttpRule additional_bindings = 11; +} + +// A custom pattern is used for defining custom HTTP verb. +message CustomHttpPattern { + // The name of this custom HTTP verb. + string kind = 1; + + // The path matched by this custom verb. + string path = 2; +} diff --git a/server/api/tools.go b/server/api/tools.go deleted file mode 100644 index bbd86db1..00000000 --- a/server/api/tools.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tools -// +build tools - -package api - -import ( - _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway" - _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" - _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" - _ "google.golang.org/protobuf/cmd/protoc-gen-go" -) diff --git a/server/api/tumdev/campus_backend.pb.go b/server/api/tumdev/campus_backend.pb.go new file mode 100644 index 00000000..de451d26 --- /dev/null +++ b/server/api/tumdev/campus_backend.pb.go @@ -0,0 +1,6636 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: tumdev/campus_backend.proto + +package api + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DeviceType int32 + +const ( + DeviceType_IOS DeviceType = 0 + DeviceType_ANDROID DeviceType = 1 + DeviceType_WINDOWS DeviceType = 2 +) + +// Enum value maps for DeviceType. +var ( + DeviceType_name = map[int32]string{ + 0: "IOS", + 1: "ANDROID", + 2: "WINDOWS", + } + DeviceType_value = map[string]int32{ + "IOS": 0, + "ANDROID": 1, + "WINDOWS": 2, + } +) + +func (x DeviceType) Enum() *DeviceType { + p := new(DeviceType) + *p = x + return p +} + +func (x DeviceType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceType) Descriptor() protoreflect.EnumDescriptor { + return file_tumdev_campus_backend_proto_enumTypes[0].Descriptor() +} + +func (DeviceType) Type() protoreflect.EnumType { + return &file_tumdev_campus_backend_proto_enumTypes[0] +} + +func (x DeviceType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DeviceType.Descriptor instead. +func (DeviceType) EnumDescriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{0} +} + +type RegisterDeviceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` + PublicKey *string `protobuf:"bytes,2,opt,name=publicKey,proto3,oneof" json:"publicKey,omitempty"` + DeviceType DeviceType `protobuf:"varint,3,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` +} + +func (x *RegisterDeviceRequest) Reset() { + *x = RegisterDeviceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterDeviceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterDeviceRequest) ProtoMessage() {} + +func (x *RegisterDeviceRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterDeviceRequest.ProtoReflect.Descriptor instead. +func (*RegisterDeviceRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterDeviceRequest) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *RegisterDeviceRequest) GetPublicKey() string { + if x != nil && x.PublicKey != nil { + return *x.PublicKey + } + return "" +} + +func (x *RegisterDeviceRequest) GetDeviceType() DeviceType { + if x != nil { + return x.DeviceType + } + return DeviceType_IOS +} + +type RegisterDeviceReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` +} + +func (x *RegisterDeviceReply) Reset() { + *x = RegisterDeviceReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterDeviceReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterDeviceReply) ProtoMessage() {} + +func (x *RegisterDeviceReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterDeviceReply.ProtoReflect.Descriptor instead. +func (*RegisterDeviceReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{1} +} + +func (x *RegisterDeviceReply) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +type RemoveDeviceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` + DeviceType DeviceType `protobuf:"varint,2,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` +} + +func (x *RemoveDeviceRequest) Reset() { + *x = RemoveDeviceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveDeviceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveDeviceRequest) ProtoMessage() {} + +func (x *RemoveDeviceRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveDeviceRequest.ProtoReflect.Descriptor instead. +func (*RemoveDeviceRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{2} +} + +func (x *RemoveDeviceRequest) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *RemoveDeviceRequest) GetDeviceType() DeviceType { + if x != nil { + return x.DeviceType + } + return DeviceType_IOS +} + +type RemoveDeviceReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` +} + +func (x *RemoveDeviceReply) Reset() { + *x = RemoveDeviceReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveDeviceReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveDeviceReply) ProtoMessage() {} + +func (x *RemoveDeviceReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveDeviceReply.ProtoReflect.Descriptor instead. +func (*RemoveDeviceReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{3} +} + +func (x *RemoveDeviceReply) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +type IOSDeviceRequestResponseRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *IOSDeviceRequestResponseRequest) Reset() { + *x = IOSDeviceRequestResponseRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IOSDeviceRequestResponseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IOSDeviceRequestResponseRequest) ProtoMessage() {} + +func (x *IOSDeviceRequestResponseRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IOSDeviceRequestResponseRequest.ProtoReflect.Descriptor instead. +func (*IOSDeviceRequestResponseRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{4} +} + +func (x *IOSDeviceRequestResponseRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *IOSDeviceRequestResponseRequest) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + +type IOSDeviceRequestResponseReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *IOSDeviceRequestResponseReply) Reset() { + *x = IOSDeviceRequestResponseReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IOSDeviceRequestResponseReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IOSDeviceRequestResponseReply) ProtoMessage() {} + +func (x *IOSDeviceRequestResponseReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IOSDeviceRequestResponseReply.ProtoReflect.Descriptor instead. +func (*IOSDeviceRequestResponseReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{5} +} + +func (x *IOSDeviceRequestResponseReply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type GetRoomScheduleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Room int32 `protobuf:"varint,1,opt,name=room,proto3" json:"room,omitempty"` + Start *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start,proto3" json:"start,omitempty"` + End *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end,proto3" json:"end,omitempty"` +} + +func (x *GetRoomScheduleRequest) Reset() { + *x = GetRoomScheduleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomScheduleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomScheduleRequest) ProtoMessage() {} + +func (x *GetRoomScheduleRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomScheduleRequest.ProtoReflect.Descriptor instead. +func (*GetRoomScheduleRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{6} +} + +func (x *GetRoomScheduleRequest) GetRoom() int32 { + if x != nil { + return x.Room + } + return 0 +} + +func (x *GetRoomScheduleRequest) GetStart() *timestamppb.Timestamp { + if x != nil { + return x.Start + } + return nil +} + +func (x *GetRoomScheduleRequest) GetEnd() *timestamppb.Timestamp { + if x != nil { + return x.End + } + return nil +} + +type GetRoomScheduleReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*GetRoomScheduleReply_RoomScheduleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +} + +func (x *GetRoomScheduleReply) Reset() { + *x = GetRoomScheduleReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomScheduleReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomScheduleReply) ProtoMessage() {} + +func (x *GetRoomScheduleReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomScheduleReply.ProtoReflect.Descriptor instead. +func (*GetRoomScheduleReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7} +} + +func (x *GetRoomScheduleReply) GetEvents() []*GetRoomScheduleReply_RoomScheduleEvent { + if x != nil { + return x.Events + } + return nil +} + +type GetRoomCoordinatesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ArchId string `protobuf:"bytes,1,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` +} + +func (x *GetRoomCoordinatesRequest) Reset() { + *x = GetRoomCoordinatesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomCoordinatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomCoordinatesRequest) ProtoMessage() {} + +func (x *GetRoomCoordinatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomCoordinatesRequest.ProtoReflect.Descriptor instead. +func (*GetRoomCoordinatesRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{8} +} + +func (x *GetRoomCoordinatesRequest) GetArchId() string { + if x != nil { + return x.ArchId + } + return "" +} + +type GetRoomCoordinatesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UtmZone string `protobuf:"bytes,1,opt,name=utm_zone,json=utmZone,proto3" json:"utm_zone,omitempty"` + UtmEasting float32 `protobuf:"fixed32,2,opt,name=utm_easting,json=utmEasting,proto3" json:"utm_easting,omitempty"` + UtmNorthing float32 `protobuf:"fixed32,3,opt,name=utm_northing,json=utmNorthing,proto3" json:"utm_northing,omitempty"` +} + +func (x *GetRoomCoordinatesReply) Reset() { + *x = GetRoomCoordinatesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomCoordinatesReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomCoordinatesReply) ProtoMessage() {} + +func (x *GetRoomCoordinatesReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomCoordinatesReply.ProtoReflect.Descriptor instead. +func (*GetRoomCoordinatesReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{9} +} + +func (x *GetRoomCoordinatesReply) GetUtmZone() string { + if x != nil { + return x.UtmZone + } + return "" +} + +func (x *GetRoomCoordinatesReply) GetUtmEasting() float32 { + if x != nil { + return x.UtmEasting + } + return 0 +} + +func (x *GetRoomCoordinatesReply) GetUtmNorthing() float32 { + if x != nil { + return x.UtmNorthing + } + return 0 +} + +type GetRoomMapsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ArchId string `protobuf:"bytes,1,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` +} + +func (x *GetRoomMapsRequest) Reset() { + *x = GetRoomMapsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomMapsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomMapsRequest) ProtoMessage() {} + +func (x *GetRoomMapsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomMapsRequest.ProtoReflect.Descriptor instead. +func (*GetRoomMapsRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{10} +} + +func (x *GetRoomMapsRequest) GetArchId() string { + if x != nil { + return x.ArchId + } + return "" +} + +type GetRoomMapsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Maps []*GetRoomMapsReply_Map `protobuf:"bytes,1,rep,name=maps,proto3" json:"maps,omitempty"` +} + +func (x *GetRoomMapsReply) Reset() { + *x = GetRoomMapsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomMapsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomMapsReply) ProtoMessage() {} + +func (x *GetRoomMapsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomMapsReply.ProtoReflect.Descriptor instead. +func (*GetRoomMapsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11} +} + +func (x *GetRoomMapsReply) GetMaps() []*GetRoomMapsReply_Map { + if x != nil { + return x.Maps + } + return nil +} + +type GetLocationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` +} + +func (x *GetLocationsRequest) Reset() { + *x = GetLocationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLocationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLocationsRequest) ProtoMessage() {} + +func (x *GetLocationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLocationsRequest.ProtoReflect.Descriptor instead. +func (*GetLocationsRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{12} +} + +func (x *GetLocationsRequest) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +type GetLocationsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Locations []*GetLocationsReply_Location `protobuf:"bytes,1,rep,name=locations,proto3" json:"locations,omitempty"` +} + +func (x *GetLocationsReply) Reset() { + *x = GetLocationsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLocationsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLocationsReply) ProtoMessage() {} + +func (x *GetLocationsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLocationsReply.ProtoReflect.Descriptor instead. +func (*GetLocationsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13} +} + +func (x *GetLocationsReply) GetLocations() []*GetLocationsReply_Location { + if x != nil { + return x.Locations + } + return nil +} + +type SearchRoomsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` +} + +func (x *SearchRoomsRequest) Reset() { + *x = SearchRoomsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchRoomsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchRoomsRequest) ProtoMessage() {} + +func (x *SearchRoomsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchRoomsRequest.ProtoReflect.Descriptor instead. +func (*SearchRoomsRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{14} +} + +func (x *SearchRoomsRequest) GetQuery() string { + if x != nil { + return x.Query + } + return "" +} + +type SearchRoomsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rooms []*Room `protobuf:"bytes,1,rep,name=rooms,proto3" json:"rooms,omitempty"` +} + +func (x *SearchRoomsReply) Reset() { + *x = SearchRoomsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchRoomsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchRoomsReply) ProtoMessage() {} + +func (x *SearchRoomsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchRoomsReply.ProtoReflect.Descriptor instead. +func (*SearchRoomsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{15} +} + +func (x *SearchRoomsReply) GetRooms() []*Room { + if x != nil { + return x.Rooms + } + return nil +} + +type Room struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int32 `protobuf:"varint,1,opt,name=roomId,proto3" json:"roomId,omitempty"` + RoomCode string `protobuf:"bytes,2,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` + BuildingNr string `protobuf:"bytes,3,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` + ArchId string `protobuf:"bytes,4,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` + Info string `protobuf:"bytes,5,opt,name=info,proto3" json:"info,omitempty"` + Address string `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"` + Purpose string `protobuf:"bytes,7,opt,name=purpose,proto3" json:"purpose,omitempty"` + Campus string `protobuf:"bytes,8,opt,name=campus,proto3" json:"campus,omitempty"` + Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Room) Reset() { + *x = Room{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Room) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Room) ProtoMessage() {} + +func (x *Room) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Room.ProtoReflect.Descriptor instead. +func (*Room) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{16} +} + +func (x *Room) GetRoomId() int32 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *Room) GetRoomCode() string { + if x != nil { + return x.RoomCode + } + return "" +} + +func (x *Room) GetBuildingNr() string { + if x != nil { + return x.BuildingNr + } + return "" +} + +func (x *Room) GetArchId() string { + if x != nil { + return x.ArchId + } + return "" +} + +func (x *Room) GetInfo() string { + if x != nil { + return x.Info + } + return "" +} + +func (x *Room) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *Room) GetPurpose() string { + if x != nil { + return x.Purpose + } + return "" +} + +func (x *Room) GetCampus() string { + if x != nil { + return x.Campus + } + return "" +} + +func (x *Room) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type NewsSourceReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Sources []*NewsSource `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` +} + +func (x *NewsSourceReply) Reset() { + *x = NewsSourceReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewsSourceReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewsSourceReply) ProtoMessage() {} + +func (x *NewsSourceReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewsSourceReply.ProtoReflect.Descriptor instead. +func (*NewsSourceReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{17} +} + +func (x *NewsSourceReply) GetSources() []*NewsSource { + if x != nil { + return x.Sources + } + return nil +} + +type NewsSource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Icon string `protobuf:"bytes,3,opt,name=icon,proto3" json:"icon,omitempty"` +} + +func (x *NewsSource) Reset() { + *x = NewsSource{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewsSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewsSource) ProtoMessage() {} + +func (x *NewsSource) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. +func (*NewsSource) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{18} +} + +func (x *NewsSource) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *NewsSource) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *NewsSource) GetIcon() string { + if x != nil { + return x.Icon + } + return "" +} + +type GetTopNewsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ImageUrl string `protobuf:"bytes,1,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"` + Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` + Created *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` + From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` + To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3" json:"to,omitempty"` +} + +func (x *GetTopNewsReply) Reset() { + *x = GetTopNewsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTopNewsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTopNewsReply) ProtoMessage() {} + +func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTopNewsReply.ProtoReflect.Descriptor instead. +func (*GetTopNewsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{19} +} + +func (x *GetTopNewsReply) GetImageUrl() string { + if x != nil { + return x.ImageUrl + } + return "" +} + +func (x *GetTopNewsReply) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +func (x *GetTopNewsReply) GetCreated() *timestamppb.Timestamp { + if x != nil { + return x.Created + } + return nil +} + +func (x *GetTopNewsReply) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *GetTopNewsReply) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +type CafeteriaRatingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") + CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` + // Optional Parameter to define an interval for the ratings (Lower bound) + From *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` + // Optional Parameter to define an interval for the ratings (Upper bound) + To *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` + // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (x *CafeteriaRatingRequest) Reset() { + *x = CafeteriaRatingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CafeteriaRatingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CafeteriaRatingRequest) ProtoMessage() {} + +func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CafeteriaRatingRequest.ProtoReflect.Descriptor instead. +func (*CafeteriaRatingRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{20} +} + +func (x *CafeteriaRatingRequest) GetCafeteriaId() string { + if x != nil { + return x.CafeteriaId + } + return "" +} + +func (x *CafeteriaRatingRequest) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *CafeteriaRatingRequest) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +func (x *CafeteriaRatingRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type DishRatingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") + CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + Dish string `protobuf:"bytes,2,opt,name=dish,proto3" json:"dish,omitempty"` + // Optional Parameter to define an interval for the ratings (Lower bound) + From *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + // Optional Parameter to define an interval for the ratings (Upper bound) + To *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` + // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (x *DishRatingRequest) Reset() { + *x = DishRatingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DishRatingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DishRatingRequest) ProtoMessage() {} + +func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DishRatingRequest.ProtoReflect.Descriptor instead. +func (*DishRatingRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{21} +} + +func (x *DishRatingRequest) GetCafeteriaId() string { + if x != nil { + return x.CafeteriaId + } + return "" +} + +func (x *DishRatingRequest) GetDish() string { + if x != nil { + return x.Dish + } + return "" +} + +func (x *DishRatingRequest) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *DishRatingRequest) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +func (x *DishRatingRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type CafeteriaRatingReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` + Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` + Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` + Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` + RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` +} + +func (x *CafeteriaRatingReply) Reset() { + *x = CafeteriaRatingReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CafeteriaRatingReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CafeteriaRatingReply) ProtoMessage() {} + +func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CafeteriaRatingReply.ProtoReflect.Descriptor instead. +func (*CafeteriaRatingReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{22} +} + +func (x *CafeteriaRatingReply) GetRating() []*SingleRatingReply { + if x != nil { + return x.Rating + } + return nil +} + +func (x *CafeteriaRatingReply) GetAvg() float64 { + if x != nil { + return x.Avg + } + return 0 +} + +func (x *CafeteriaRatingReply) GetStd() float64 { + if x != nil { + return x.Std + } + return 0 +} + +func (x *CafeteriaRatingReply) GetMin() int32 { + if x != nil { + return x.Min + } + return 0 +} + +func (x *CafeteriaRatingReply) GetMax() int32 { + if x != nil { + return x.Max + } + return 0 +} + +func (x *CafeteriaRatingReply) GetRatingTags() []*RatingTagResult { + if x != nil { + return x.RatingTags + } + return nil +} + +type DishRatingReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` + Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` + Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` + Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` + RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + NameTags []*RatingTagResult `protobuf:"bytes,7,rep,name=nameTags,proto3" json:"nameTags,omitempty"` +} + +func (x *DishRatingReply) Reset() { + *x = DishRatingReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DishRatingReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DishRatingReply) ProtoMessage() {} + +func (x *DishRatingReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DishRatingReply.ProtoReflect.Descriptor instead. +func (*DishRatingReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{23} +} + +func (x *DishRatingReply) GetRating() []*SingleRatingReply { + if x != nil { + return x.Rating + } + return nil +} + +func (x *DishRatingReply) GetAvg() float64 { + if x != nil { + return x.Avg + } + return 0 +} + +func (x *DishRatingReply) GetStd() float64 { + if x != nil { + return x.Std + } + return 0 +} + +func (x *DishRatingReply) GetMin() int32 { + if x != nil { + return x.Min + } + return 0 +} + +func (x *DishRatingReply) GetMax() int32 { + if x != nil { + return x.Max + } + return 0 +} + +func (x *DishRatingReply) GetRatingTags() []*RatingTagResult { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *DishRatingReply) GetNameTags() []*RatingTagResult { + if x != nil { + return x.NameTags + } + return nil +} + +type SingleRatingReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + // Optional JPEG image in Base64 + Image []byte `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,3,opt,name=comment,proto3" json:"comment,omitempty"` + RatingTags []*RatingTagNewRequest `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + Visited *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=visited,proto3" json:"visited,omitempty"` +} + +func (x *SingleRatingReply) Reset() { + *x = SingleRatingReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SingleRatingReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SingleRatingReply) ProtoMessage() {} + +func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. +func (*SingleRatingReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{24} +} + +func (x *SingleRatingReply) GetPoints() int32 { + if x != nil { + return x.Points + } + return 0 +} + +func (x *SingleRatingReply) GetImage() []byte { + if x != nil { + return x.Image + } + return nil +} + +func (x *SingleRatingReply) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +func (x *SingleRatingReply) GetRatingTags() []*RatingTagNewRequest { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *SingleRatingReply) GetVisited() *timestamppb.Timestamp { + if x != nil { + return x.Visited + } + return nil +} + +type NewCafeteriaRatingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` + Image []byte `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` + // Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags + RatingTags []*RatingTag `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,6,opt,name=comment,proto3" json:"comment,omitempty"` +} + +func (x *NewCafeteriaRatingRequest) Reset() { + *x = NewCafeteriaRatingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewCafeteriaRatingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewCafeteriaRatingRequest) ProtoMessage() {} + +func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewCafeteriaRatingRequest.ProtoReflect.Descriptor instead. +func (*NewCafeteriaRatingRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{25} +} + +func (x *NewCafeteriaRatingRequest) GetPoints() int32 { + if x != nil { + return x.Points + } + return 0 +} + +func (x *NewCafeteriaRatingRequest) GetCafeteriaId() string { + if x != nil { + return x.CafeteriaId + } + return "" +} + +func (x *NewCafeteriaRatingRequest) GetImage() []byte { + if x != nil { + return x.Image + } + return nil +} + +func (x *NewCafeteriaRatingRequest) GetRatingTags() []*RatingTag { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *NewCafeteriaRatingRequest) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +type NewDishRatingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa + CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + Dish string `protobuf:"bytes,3,opt,name=dish,proto3" json:"dish,omitempty"` + // Optional JPEG image in Base64 + Image []byte `protobuf:"bytes,4,opt,name=image,proto3" json:"image,omitempty"` + // Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags + RatingTags []*RatingTag `protobuf:"bytes,5,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` +} + +func (x *NewDishRatingRequest) Reset() { + *x = NewDishRatingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewDishRatingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewDishRatingRequest) ProtoMessage() {} + +func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewDishRatingRequest.ProtoReflect.Descriptor instead. +func (*NewDishRatingRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{26} +} + +func (x *NewDishRatingRequest) GetPoints() int32 { + if x != nil { + return x.Points + } + return 0 +} + +func (x *NewDishRatingRequest) GetCafeteriaId() string { + if x != nil { + return x.CafeteriaId + } + return "" +} + +func (x *NewDishRatingRequest) GetDish() string { + if x != nil { + return x.Dish + } + return "" +} + +func (x *NewDishRatingRequest) GetImage() []byte { + if x != nil { + return x.Image + } + return nil +} + +func (x *NewDishRatingRequest) GetRatingTags() []*RatingTag { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *NewDishRatingRequest) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +type GetTagsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` +} + +func (x *GetTagsReply) Reset() { + *x = GetTagsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTagsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTagsReply) ProtoMessage() {} + +func (x *GetTagsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTagsReply.ProtoReflect.Descriptor instead. +func (*GetTagsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} +} + +func (x *GetTagsReply) GetRatingTags() []*TagsOverview { + if x != nil { + return x.RatingTags + } + return nil +} + +type TagsOverview struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + De string `protobuf:"bytes,2,opt,name=de,proto3" json:"de,omitempty"` + En string `protobuf:"bytes,3,opt,name=en,proto3" json:"en,omitempty"` +} + +func (x *TagsOverview) Reset() { + *x = TagsOverview{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TagsOverview) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TagsOverview) ProtoMessage() {} + +func (x *TagsOverview) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TagsOverview.ProtoReflect.Descriptor instead. +func (*TagsOverview) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} +} + +func (x *TagsOverview) GetTagId() int32 { + if x != nil { + return x.TagId + } + return 0 +} + +func (x *TagsOverview) GetDe() string { + if x != nil { + return x.De + } + return "" +} + +func (x *TagsOverview) GetEn() string { + if x != nil { + return x.En + } + return "" +} + +type RatingTag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + Points float64 `protobuf:"fixed64,2,opt,name=points,proto3" json:"points,omitempty"` +} + +func (x *RatingTag) Reset() { + *x = RatingTag{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RatingTag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RatingTag) ProtoMessage() {} + +func (x *RatingTag) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RatingTag.ProtoReflect.Descriptor instead. +func (*RatingTag) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} +} + +func (x *RatingTag) GetTagId() int32 { + if x != nil { + return x.TagId + } + return 0 +} + +func (x *RatingTag) GetPoints() float64 { + if x != nil { + return x.Points + } + return 0 +} + +type RatingTagNewRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + Points int32 `protobuf:"varint,2,opt,name=points,proto3" json:"points,omitempty"` +} + +func (x *RatingTagNewRequest) Reset() { + *x = RatingTagNewRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RatingTagNewRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RatingTagNewRequest) ProtoMessage() {} + +func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RatingTagNewRequest.ProtoReflect.Descriptor instead. +func (*RatingTagNewRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} +} + +func (x *RatingTagNewRequest) GetTagId() int32 { + if x != nil { + return x.TagId + } + return 0 +} + +func (x *RatingTagNewRequest) GetPoints() int32 { + if x != nil { + return x.Points + } + return 0 +} + +type RatingTagResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` + Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` + Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` +} + +func (x *RatingTagResult) Reset() { + *x = RatingTagResult{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RatingTagResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RatingTagResult) ProtoMessage() {} + +func (x *RatingTagResult) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RatingTagResult.ProtoReflect.Descriptor instead. +func (*RatingTagResult) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} +} + +func (x *RatingTagResult) GetTagId() int32 { + if x != nil { + return x.TagId + } + return 0 +} + +func (x *RatingTagResult) GetAvg() float64 { + if x != nil { + return x.Avg + } + return 0 +} + +func (x *RatingTagResult) GetStd() float64 { + if x != nil { + return x.Std + } + return 0 +} + +func (x *RatingTagResult) GetMin() int32 { + if x != nil { + return x.Min + } + return 0 +} + +func (x *RatingTagResult) GetMax() int32 { + if x != nil { + return x.Max + } + return 0 +} + +type GetCafeteriaReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cafeteria []*Cafeteria `protobuf:"bytes,1,rep,name=cafeteria,proto3" json:"cafeteria,omitempty"` +} + +func (x *GetCafeteriaReply) Reset() { + *x = GetCafeteriaReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCafeteriaReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCafeteriaReply) ProtoMessage() {} + +func (x *GetCafeteriaReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCafeteriaReply.ProtoReflect.Descriptor instead. +func (*GetCafeteriaReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} +} + +func (x *GetCafeteriaReply) GetCafeteria() []*Cafeteria { + if x != nil { + return x.Cafeteria + } + return nil +} + +type Cafeteria struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Longitude float64 `protobuf:"fixed64,3,opt,name=longitude,proto3" json:"longitude,omitempty"` + Latitude float64 `protobuf:"fixed64,4,opt,name=latitude,proto3" json:"latitude,omitempty"` +} + +func (x *Cafeteria) Reset() { + *x = Cafeteria{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Cafeteria) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Cafeteria) ProtoMessage() {} + +func (x *Cafeteria) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Cafeteria.ProtoReflect.Descriptor instead. +func (*Cafeteria) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} +} + +func (x *Cafeteria) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Cafeteria) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *Cafeteria) GetLongitude() float64 { + if x != nil { + return x.Longitude + } + return 0 +} + +func (x *Cafeteria) GetLatitude() float64 { + if x != nil { + return x.Latitude + } + return 0 +} + +type GetDishesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` + // >=2022 until the current year + Year int32 `protobuf:"varint,2,opt,name=year,proto3" json:"year,omitempty"` + // range 1 - 53 + Week int32 `protobuf:"varint,3,opt,name=week,proto3" json:"week,omitempty"` + // range 0 (Monday) - 4 (Friday) + Day int32 `protobuf:"varint,4,opt,name=day,proto3" json:"day,omitempty"` +} + +func (x *GetDishesRequest) Reset() { + *x = GetDishesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDishesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDishesRequest) ProtoMessage() {} + +func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDishesRequest.ProtoReflect.Descriptor instead. +func (*GetDishesRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} +} + +func (x *GetDishesRequest) GetCafeteriaId() string { + if x != nil { + return x.CafeteriaId + } + return "" +} + +func (x *GetDishesRequest) GetYear() int32 { + if x != nil { + return x.Year + } + return 0 +} + +func (x *GetDishesRequest) GetWeek() int32 { + if x != nil { + return x.Week + } + return 0 +} + +func (x *GetDishesRequest) GetDay() int32 { + if x != nil { + return x.Day + } + return 0 +} + +type GetDishesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dish []string `protobuf:"bytes,1,rep,name=dish,proto3" json:"dish,omitempty"` +} + +func (x *GetDishesReply) Reset() { + *x = GetDishesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDishesReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDishesReply) ProtoMessage() {} + +func (x *GetDishesReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDishesReply.ProtoReflect.Descriptor instead. +func (*GetDishesReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} +} + +func (x *GetDishesReply) GetDish() []string { + if x != nil { + return x.Dish + } + return nil +} + +type GetResponsiblePersonReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResponsiblePerson []*ResponsiblePersonElement `protobuf:"bytes,1,rep,name=responsiblePerson,proto3" json:"responsiblePerson,omitempty"` +} + +func (x *GetResponsiblePersonReply) Reset() { + *x = GetResponsiblePersonReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetResponsiblePersonReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetResponsiblePersonReply) ProtoMessage() {} + +func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetResponsiblePersonReply.ProtoReflect.Descriptor instead. +func (*GetResponsiblePersonReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} +} + +func (x *GetResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePersonElement { + if x != nil { + return x.ResponsiblePerson + } + return nil +} + +type ResponsiblePersonElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Telephone string `protobuf:"bytes,2,opt,name=telephone,proto3" json:"telephone,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Faculty string `protobuf:"bytes,4,opt,name=faculty,proto3" json:"faculty,omitempty"` + TumID string `protobuf:"bytes,5,opt,name=tumID,proto3" json:"tumID,omitempty"` +} + +func (x *ResponsiblePersonElement) Reset() { + *x = ResponsiblePersonElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponsiblePersonElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponsiblePersonElement) ProtoMessage() {} + +func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponsiblePersonElement.ProtoReflect.Descriptor instead. +func (*ResponsiblePersonElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} +} + +func (x *ResponsiblePersonElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResponsiblePersonElement) GetTelephone() string { + if x != nil { + return x.Telephone + } + return "" +} + +func (x *ResponsiblePersonElement) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *ResponsiblePersonElement) GetFaculty() string { + if x != nil { + return x.Faculty + } + return "" +} + +func (x *ResponsiblePersonElement) GetTumID() string { + if x != nil { + return x.TumID + } + return "" +} + +type GetBuilding2GpsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Building2Gps []*Building2GpsElement `protobuf:"bytes,1,rep,name=building2Gps,proto3" json:"building2Gps,omitempty"` +} + +func (x *GetBuilding2GpsReply) Reset() { + *x = GetBuilding2GpsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBuilding2GpsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBuilding2GpsReply) ProtoMessage() {} + +func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBuilding2GpsReply.ProtoReflect.Descriptor instead. +func (*GetBuilding2GpsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} +} + +func (x *GetBuilding2GpsReply) GetBuilding2Gps() []*Building2GpsElement { + if x != nil { + return x.Building2Gps + } + return nil +} + +type Building2GpsElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Latitude string `protobuf:"bytes,2,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude string `protobuf:"bytes,3,opt,name=longitude,proto3" json:"longitude,omitempty"` +} + +func (x *Building2GpsElement) Reset() { + *x = Building2GpsElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Building2GpsElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Building2GpsElement) ProtoMessage() {} + +func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Building2GpsElement.ProtoReflect.Descriptor instead. +func (*Building2GpsElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} +} + +func (x *Building2GpsElement) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Building2GpsElement) GetLatitude() string { + if x != nil { + return x.Latitude + } + return "" +} + +func (x *Building2GpsElement) GetLongitude() string { + if x != nil { + return x.Longitude + } + return "" +} + +type GetAreaFacilitiesByBuildingNrReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AreaFacilitiesByBuildingNr []*RoomInformationElement `protobuf:"bytes,1,rep,name=areaFacilitiesByBuildingNr,proto3" json:"areaFacilitiesByBuildingNr,omitempty"` +} + +func (x *GetAreaFacilitiesByBuildingNrReply) Reset() { + *x = GetAreaFacilitiesByBuildingNrReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAreaFacilitiesByBuildingNrReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAreaFacilitiesByBuildingNrReply) ProtoMessage() {} + +func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAreaFacilitiesByBuildingNrReply.ProtoReflect.Descriptor instead. +func (*GetAreaFacilitiesByBuildingNrReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} +} + +func (x *GetAreaFacilitiesByBuildingNrReply) GetAreaFacilitiesByBuildingNr() []*RoomInformationElement { + if x != nil { + return x.AreaFacilitiesByBuildingNr + } + return nil +} + +type GetAreaFacilitiesByBuildingNrRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BuildingNr string `protobuf:"bytes,1,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` +} + +func (x *GetAreaFacilitiesByBuildingNrRequest) Reset() { + *x = GetAreaFacilitiesByBuildingNrRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAreaFacilitiesByBuildingNrRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAreaFacilitiesByBuildingNrRequest) ProtoMessage() {} + +func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAreaFacilitiesByBuildingNrRequest.ProtoReflect.Descriptor instead. +func (*GetAreaFacilitiesByBuildingNrRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} +} + +func (x *GetAreaFacilitiesByBuildingNrRequest) GetBuildingNr() string { + if x != nil { + return x.BuildingNr + } + return "" +} + +type GetListOfToiletsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ListOfToilets []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfToilets,proto3" json:"listOfToilets,omitempty"` +} + +func (x *GetListOfToiletsReply) Reset() { + *x = GetListOfToiletsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetListOfToiletsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetListOfToiletsReply) ProtoMessage() {} + +func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetListOfToiletsReply.ProtoReflect.Descriptor instead. +func (*GetListOfToiletsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} +} + +func (x *GetListOfToiletsReply) GetListOfToilets() []*RoomInformationElement { + if x != nil { + return x.ListOfToilets + } + return nil +} + +type RoomInformationElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int32 `protobuf:"varint,1,opt,name=roomId,proto3" json:"roomId,omitempty"` + RoomCode string `protobuf:"bytes,2,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` + BuildingNr string `protobuf:"bytes,3,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` + ArchId string `protobuf:"bytes,4,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` + Info string `protobuf:"bytes,5,opt,name=info,proto3" json:"info,omitempty"` + Address string `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"` + Purpose string `protobuf:"bytes,7,opt,name=purpose,proto3" json:"purpose,omitempty"` + Campus string `protobuf:"bytes,8,opt,name=campus,proto3" json:"campus,omitempty"` + Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *RoomInformationElement) Reset() { + *x = RoomInformationElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoomInformationElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoomInformationElement) ProtoMessage() {} + +func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoomInformationElement.ProtoReflect.Descriptor instead. +func (*RoomInformationElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} +} + +func (x *RoomInformationElement) GetRoomId() int32 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *RoomInformationElement) GetRoomCode() string { + if x != nil { + return x.RoomCode + } + return "" +} + +func (x *RoomInformationElement) GetBuildingNr() string { + if x != nil { + return x.BuildingNr + } + return "" +} + +func (x *RoomInformationElement) GetArchId() string { + if x != nil { + return x.ArchId + } + return "" +} + +func (x *RoomInformationElement) GetInfo() string { + if x != nil { + return x.Info + } + return "" +} + +func (x *RoomInformationElement) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *RoomInformationElement) GetPurpose() string { + if x != nil { + return x.Purpose + } + return "" +} + +func (x *RoomInformationElement) GetCampus() string { + if x != nil { + return x.Campus + } + return "" +} + +func (x *RoomInformationElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetListOfElevatorsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ListOfElevators []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfElevators,proto3" json:"listOfElevators,omitempty"` +} + +func (x *GetListOfElevatorsReply) Reset() { + *x = GetListOfElevatorsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetListOfElevatorsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetListOfElevatorsReply) ProtoMessage() {} + +func (x *GetListOfElevatorsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetListOfElevatorsReply.ProtoReflect.Descriptor instead. +func (*GetListOfElevatorsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} +} + +func (x *GetListOfElevatorsReply) GetListOfElevators() []*RoomInformationElement { + if x != nil { + return x.ListOfElevators + } + return nil +} + +type GetMoreInformationReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Information []*MoreInformationElement `protobuf:"bytes,1,rep,name=information,proto3" json:"information,omitempty"` +} + +func (x *GetMoreInformationReply) Reset() { + *x = GetMoreInformationReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMoreInformationReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMoreInformationReply) ProtoMessage() {} + +func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMoreInformationReply.ProtoReflect.Descriptor instead. +func (*GetMoreInformationReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} +} + +func (x *GetMoreInformationReply) GetInformation() []*MoreInformationElement { + if x != nil { + return x.Information + } + return nil +} + +type MoreInformationElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *MoreInformationElement) Reset() { + *x = MoreInformationElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MoreInformationElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MoreInformationElement) ProtoMessage() {} + +func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MoreInformationElement.ProtoReflect.Descriptor instead. +func (*MoreInformationElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} +} + +func (x *MoreInformationElement) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *MoreInformationElement) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +func (x *MoreInformationElement) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +type GetOpeningTimesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"` +} + +func (x *GetOpeningTimesRequest) Reset() { + *x = GetOpeningTimesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetOpeningTimesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOpeningTimesRequest) ProtoMessage() {} + +func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOpeningTimesRequest.ProtoReflect.Descriptor instead. +func (*GetOpeningTimesRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} +} + +func (x *GetOpeningTimesRequest) GetLanguage() string { + if x != nil { + return x.Language + } + return "" +} + +type GetOpeningTimesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Facilities []*OpeningTimesMsgElement `protobuf:"bytes,1,rep,name=facilities,proto3" json:"facilities,omitempty"` +} + +func (x *GetOpeningTimesReply) Reset() { + *x = GetOpeningTimesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetOpeningTimesReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOpeningTimesReply) ProtoMessage() {} + +func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOpeningTimesReply.ProtoReflect.Descriptor instead. +func (*GetOpeningTimesReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} +} + +func (x *GetOpeningTimesReply) GetFacilities() []*OpeningTimesMsgElement { + if x != nil { + return x.Facilities + } + return nil +} + +type OpeningTimesMsgElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` + Room string `protobuf:"bytes,5,opt,name=room,proto3" json:"room,omitempty"` + TransportStation string `protobuf:"bytes,6,opt,name=transport_station,json=transportStation,proto3" json:"transport_station,omitempty"` + OpeningHours string `protobuf:"bytes,7,opt,name=opening_hours,json=openingHours,proto3" json:"opening_hours,omitempty"` + Infos string `protobuf:"bytes,8,opt,name=infos,proto3" json:"infos,omitempty"` + Url string `protobuf:"bytes,9,opt,name=url,proto3" json:"url,omitempty"` + Language string `protobuf:"bytes,10,opt,name=language,proto3" json:"language,omitempty"` + ReferenceId int32 `protobuf:"varint,11,opt,name=reference_id,json=referenceId,proto3" json:"reference_id,omitempty"` +} + +func (x *OpeningTimesMsgElement) Reset() { + *x = OpeningTimesMsgElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpeningTimesMsgElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpeningTimesMsgElement) ProtoMessage() {} + +func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpeningTimesMsgElement.ProtoReflect.Descriptor instead. +func (*OpeningTimesMsgElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} +} + +func (x *OpeningTimesMsgElement) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *OpeningTimesMsgElement) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +func (x *OpeningTimesMsgElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OpeningTimesMsgElement) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *OpeningTimesMsgElement) GetRoom() string { + if x != nil { + return x.Room + } + return "" +} + +func (x *OpeningTimesMsgElement) GetTransportStation() string { + if x != nil { + return x.TransportStation + } + return "" +} + +func (x *OpeningTimesMsgElement) GetOpeningHours() string { + if x != nil { + return x.OpeningHours + } + return "" +} + +func (x *OpeningTimesMsgElement) GetInfos() string { + if x != nil { + return x.Infos + } + return "" +} + +func (x *OpeningTimesMsgElement) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *OpeningTimesMsgElement) GetLanguage() string { + if x != nil { + return x.Language + } + return "" +} + +func (x *OpeningTimesMsgElement) GetReferenceId() int32 { + if x != nil { + return x.ReferenceId + } + return 0 +} + +type GetUpdateNoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *GetUpdateNoteRequest) Reset() { + *x = GetUpdateNoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUpdateNoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUpdateNoteRequest) ProtoMessage() {} + +func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUpdateNoteRequest.ProtoReflect.Descriptor instead. +func (*GetUpdateNoteRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} +} + +func (x *GetUpdateNoteRequest) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +type GetUpdateNoteReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *GetUpdateNoteReply) Reset() { + *x = GetUpdateNoteReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUpdateNoteReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUpdateNoteReply) ProtoMessage() {} + +func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUpdateNoteReply.ProtoReflect.Descriptor instead. +func (*GetUpdateNoteReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} +} + +func (x *GetUpdateNoteReply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type GetStudyRoomListReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rooms []*StudyRoomMsgElement `protobuf:"bytes,1,rep,name=rooms,proto3" json:"rooms,omitempty"` +} + +func (x *GetStudyRoomListReply) Reset() { + *x = GetStudyRoomListReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStudyRoomListReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStudyRoomListReply) ProtoMessage() {} + +func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStudyRoomListReply.ProtoReflect.Descriptor instead. +func (*GetStudyRoomListReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} +} + +func (x *GetStudyRoomListReply) GetRooms() []*StudyRoomMsgElement { + if x != nil { + return x.Rooms + } + return nil +} + +type StudyRoomMsgElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Details string `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"` + Rooms []*StudyRoom `protobuf:"bytes,4,rep,name=rooms,proto3" json:"rooms,omitempty"` +} + +func (x *StudyRoomMsgElement) Reset() { + *x = StudyRoomMsgElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StudyRoomMsgElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StudyRoomMsgElement) ProtoMessage() {} + +func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StudyRoomMsgElement.ProtoReflect.Descriptor instead. +func (*StudyRoomMsgElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} +} + +func (x *StudyRoomMsgElement) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *StudyRoomMsgElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *StudyRoomMsgElement) GetDetails() string { + if x != nil { + return x.Details + } + return "" +} + +func (x *StudyRoomMsgElement) GetRooms() []*StudyRoom { + if x != nil { + return x.Rooms + } + return nil +} + +type StudyRoom struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int32 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + RoomId int32 `protobuf:"varint,2,opt,name=roomId,proto3" json:"roomId,omitempty"` + RoomCode string `protobuf:"bytes,3,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` + RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + BuildingName string `protobuf:"bytes,5,opt,name=building_name,json=buildingName,proto3" json:"building_name,omitempty"` +} + +func (x *StudyRoom) Reset() { + *x = StudyRoom{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StudyRoom) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StudyRoom) ProtoMessage() {} + +func (x *StudyRoom) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StudyRoom.ProtoReflect.Descriptor instead. +func (*StudyRoom) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} +} + +func (x *StudyRoom) GetGroupId() int32 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *StudyRoom) GetRoomId() int32 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *StudyRoom) GetRoomCode() string { + if x != nil { + return x.RoomCode + } + return "" +} + +func (x *StudyRoom) GetRoomName() string { + if x != nil { + return x.RoomName + } + return "" +} + +func (x *StudyRoom) GetBuildingName() string { + if x != nil { + return x.BuildingName + } + return "" +} + +type GetKinoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LastId int32 `protobuf:"varint,1,opt,name=lastId,proto3" json:"lastId,omitempty"` +} + +func (x *GetKinoRequest) Reset() { + *x = GetKinoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetKinoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetKinoRequest) ProtoMessage() {} + +func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetKinoRequest.ProtoReflect.Descriptor instead. +func (*GetKinoRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} +} + +func (x *GetKinoRequest) GetLastId() int32 { + if x != nil { + return x.LastId + } + return 0 +} + +type GetKinoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kinos []*KinoMsgElement `protobuf:"bytes,1,rep,name=kinos,proto3" json:"kinos,omitempty"` +} + +func (x *GetKinoReply) Reset() { + *x = GetKinoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetKinoReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetKinoReply) ProtoMessage() {} + +func (x *GetKinoReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetKinoReply.ProtoReflect.Descriptor instead. +func (*GetKinoReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} +} + +func (x *GetKinoReply) GetKinos() []*KinoMsgElement { + if x != nil { + return x.Kinos + } + return nil +} + +type KinoMsgElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Kino int32 `protobuf:"varint,3,opt,name=kino,proto3" json:"kino,omitempty"` + Date *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=date,proto3" json:"date,omitempty"` + Created *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created,proto3" json:"created,omitempty"` + Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` + Year string `protobuf:"bytes,7,opt,name=year,proto3" json:"year,omitempty"` + Runtime string `protobuf:"bytes,8,opt,name=runtime,proto3" json:"runtime,omitempty"` + Genre string `protobuf:"bytes,9,opt,name=genre,proto3" json:"genre,omitempty"` + Director string `protobuf:"bytes,10,opt,name=director,proto3" json:"director,omitempty"` + Actors string `protobuf:"bytes,11,opt,name=actors,proto3" json:"actors,omitempty"` + Rating string `protobuf:"bytes,12,opt,name=rating,proto3" json:"rating,omitempty"` + Description string `protobuf:"bytes,13,opt,name=description,proto3" json:"description,omitempty"` + Cover int32 `protobuf:"varint,14,opt,name=cover,proto3" json:"cover,omitempty"` + Trailer string `protobuf:"bytes,15,opt,name=trailer,proto3" json:"trailer,omitempty"` + Link string `protobuf:"bytes,16,opt,name=link,proto3" json:"link,omitempty"` +} + +func (x *KinoMsgElement) Reset() { + *x = KinoMsgElement{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KinoMsgElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KinoMsgElement) ProtoMessage() {} + +func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KinoMsgElement.ProtoReflect.Descriptor instead. +func (*KinoMsgElement) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} +} + +func (x *KinoMsgElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KinoMsgElement) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *KinoMsgElement) GetKino() int32 { + if x != nil { + return x.Kino + } + return 0 +} + +func (x *KinoMsgElement) GetDate() *timestamppb.Timestamp { + if x != nil { + return x.Date + } + return nil +} + +func (x *KinoMsgElement) GetCreated() *timestamppb.Timestamp { + if x != nil { + return x.Created + } + return nil +} + +func (x *KinoMsgElement) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *KinoMsgElement) GetYear() string { + if x != nil { + return x.Year + } + return "" +} + +func (x *KinoMsgElement) GetRuntime() string { + if x != nil { + return x.Runtime + } + return "" +} + +func (x *KinoMsgElement) GetGenre() string { + if x != nil { + return x.Genre + } + return "" +} + +func (x *KinoMsgElement) GetDirector() string { + if x != nil { + return x.Director + } + return "" +} + +func (x *KinoMsgElement) GetActors() string { + if x != nil { + return x.Actors + } + return "" +} + +func (x *KinoMsgElement) GetRating() string { + if x != nil { + return x.Rating + } + return "" +} + +func (x *KinoMsgElement) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *KinoMsgElement) GetCover() int32 { + if x != nil { + return x.Cover + } + return 0 +} + +func (x *KinoMsgElement) GetTrailer() string { + if x != nil { + return x.Trailer + } + return "" +} + +func (x *KinoMsgElement) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +type SendFeedbackRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + EmailId string `protobuf:"bytes,3,opt,name=emailId,proto3" json:"emailId,omitempty"` + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` + ImageCount int32 `protobuf:"varint,5,opt,name=image_count,json=imageCount,proto3" json:"image_count,omitempty"` + Latitude float64 `protobuf:"fixed64,6,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude float64 `protobuf:"fixed64,7,opt,name=longitude,proto3" json:"longitude,omitempty"` + OsVersion string `protobuf:"bytes,8,opt,name=osVersion,proto3" json:"osVersion,omitempty"` + AppVersion string `protobuf:"bytes,9,opt,name=appVersion,proto3" json:"appVersion,omitempty"` +} + +func (x *SendFeedbackRequest) Reset() { + *x = SendFeedbackRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendFeedbackRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendFeedbackRequest) ProtoMessage() {} + +func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendFeedbackRequest.ProtoReflect.Descriptor instead. +func (*SendFeedbackRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} +} + +func (x *SendFeedbackRequest) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *SendFeedbackRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *SendFeedbackRequest) GetEmailId() string { + if x != nil { + return x.EmailId + } + return "" +} + +func (x *SendFeedbackRequest) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *SendFeedbackRequest) GetImageCount() int32 { + if x != nil { + return x.ImageCount + } + return 0 +} + +func (x *SendFeedbackRequest) GetLatitude() float64 { + if x != nil { + return x.Latitude + } + return 0 +} + +func (x *SendFeedbackRequest) GetLongitude() float64 { + if x != nil { + return x.Longitude + } + return 0 +} + +func (x *SendFeedbackRequest) GetOsVersion() string { + if x != nil { + return x.OsVersion + } + return "" +} + +func (x *SendFeedbackRequest) GetAppVersion() string { + if x != nil { + return x.AppVersion + } + return "" +} + +type SendFeedbackImageReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SendFeedbackImageReply) Reset() { + *x = SendFeedbackImageReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendFeedbackImageReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendFeedbackImageReply) ProtoMessage() {} + +func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendFeedbackImageReply.ProtoReflect.Descriptor instead. +func (*SendFeedbackImageReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} +} + +func (x *SendFeedbackImageReply) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +type SendFeedbackImageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + ImageNr int32 `protobuf:"varint,2,opt,name=imageNr,proto3" json:"imageNr,omitempty"` //todo where does the file come from? +} + +func (x *SendFeedbackImageRequest) Reset() { + *x = SendFeedbackImageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendFeedbackImageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendFeedbackImageRequest) ProtoMessage() {} + +func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendFeedbackImageRequest.ProtoReflect.Descriptor instead. +func (*SendFeedbackImageRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} +} + +func (x *SendFeedbackImageRequest) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *SendFeedbackImageRequest) GetImageNr() int32 { + if x != nil { + return x.ImageNr + } + return 0 +} + +type GetMembersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` +} + +func (x *GetMembersRequest) Reset() { + *x = GetMembersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMembersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMembersRequest) ProtoMessage() {} + +func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMembersRequest.ProtoReflect.Descriptor instead. +func (*GetMembersRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} +} + +func (x *GetMembersRequest) GetLrzId() string { + if x != nil { + return x.LrzId + } + return "" +} + +type GetMembersReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + MemberId int32 `protobuf:"varint,3,opt,name=memberId,proto3" json:"memberId,omitempty"` +} + +func (x *GetMembersReply) Reset() { + *x = GetMembersReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMembersReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMembersReply) ProtoMessage() {} + +func (x *GetMembersReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMembersReply.ProtoReflect.Descriptor instead. +func (*GetMembersReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} +} + +func (x *GetMembersReply) GetLrzId() string { + if x != nil { + return x.LrzId + } + return "" +} + +func (x *GetMembersReply) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GetMembersReply) GetMemberId() int32 { + if x != nil { + return x.MemberId + } + return 0 +} + +type GetUploadStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` +} + +func (x *GetUploadStatusRequest) Reset() { + *x = GetUploadStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUploadStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUploadStatusRequest) ProtoMessage() {} + +func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUploadStatusRequest.ProtoReflect.Descriptor instead. +func (*GetUploadStatusRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} +} + +func (x *GetUploadStatusRequest) GetLrzId() string { + if x != nil { + return x.LrzId + } + return "" +} + +type GetUploadStatusReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FcmToken string `protobuf:"bytes,1,opt,name=fcm_token,json=fcmToken,proto3" json:"fcm_token,omitempty"` + PublicKey string `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + StudentId bool `protobuf:"varint,3,opt,name=student_id,json=studentId,proto3" json:"student_id,omitempty"` + EmployeeId bool `protobuf:"varint,4,opt,name=employee_id,json=employeeId,proto3" json:"employee_id,omitempty"` + ExternalId bool `protobuf:"varint,5,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"` +} + +func (x *GetUploadStatusReply) Reset() { + *x = GetUploadStatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUploadStatusReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUploadStatusReply) ProtoMessage() {} + +func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUploadStatusReply.ProtoReflect.Descriptor instead. +func (*GetUploadStatusReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} +} + +func (x *GetUploadStatusReply) GetFcmToken() string { + if x != nil { + return x.FcmToken + } + return "" +} + +func (x *GetUploadStatusReply) GetPublicKey() string { + if x != nil { + return x.PublicKey + } + return "" +} + +func (x *GetUploadStatusReply) GetStudentId() bool { + if x != nil { + return x.StudentId + } + return false +} + +func (x *GetUploadStatusReply) GetEmployeeId() bool { + if x != nil { + return x.EmployeeId + } + return false +} + +func (x *GetUploadStatusReply) GetExternalId() bool { + if x != nil { + return x.ExternalId + } + return false +} + +type GetNotificationsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` + Type int32 `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Signature string `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (x *GetNotificationsReply) Reset() { + *x = GetNotificationsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNotificationsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNotificationsReply) ProtoMessage() {} + +func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetNotificationsReply.ProtoReflect.Descriptor instead. +func (*GetNotificationsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{65} +} + +func (x *GetNotificationsReply) GetNotificationId() int32 { + if x != nil { + return x.NotificationId + } + return 0 +} + +func (x *GetNotificationsReply) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *GetNotificationsReply) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *GetNotificationsReply) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *GetNotificationsReply) GetSignature() string { + if x != nil { + return x.Signature + } + return "" +} + +type NotificationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` +} + +func (x *NotificationsRequest) Reset() { + *x = NotificationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NotificationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NotificationsRequest) ProtoMessage() {} + +func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NotificationsRequest.ProtoReflect.Descriptor instead. +func (*NotificationsRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{66} +} + +func (x *NotificationsRequest) GetNotificationId() int32 { + if x != nil { + return x.NotificationId + } + return 0 +} + +type GetNotificationsConfirmReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *GetNotificationsConfirmReply) Reset() { + *x = GetNotificationsConfirmReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNotificationsConfirmReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNotificationsConfirmReply) ProtoMessage() {} + +func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetNotificationsConfirmReply.ProtoReflect.Descriptor instead. +func (*GetNotificationsConfirmReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{67} +} + +func (x *GetNotificationsConfirmReply) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +type GetCanteenHeadCountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The requested canteen ID + CanteenId string `protobuf:"bytes,1,opt,name=canteenId,proto3" json:"canteenId,omitempty"` +} + +func (x *GetCanteenHeadCountRequest) Reset() { + *x = GetCanteenHeadCountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCanteenHeadCountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCanteenHeadCountRequest) ProtoMessage() {} + +func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCanteenHeadCountRequest.ProtoReflect.Descriptor instead. +func (*GetCanteenHeadCountRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{68} +} + +func (x *GetCanteenHeadCountRequest) GetCanteenId() string { + if x != nil { + return x.CanteenId + } + return "" +} + +type GetCanteenHeadCountReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The absolut count of humans in the canteen. Only valid in case percent != -1. + Count uint32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` + // The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. + MaxCount uint32 `protobuf:"varint,2,opt,name=maxCount,proto3" json:"maxCount,omitempty"` + // Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. + Percent float32 `protobuf:"fixed32,3,opt,name=percent,proto3" json:"percent,omitempty"` + // A time stamp indicating how up to date the response is. Only valid in case percent != -1. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *GetCanteenHeadCountReply) Reset() { + *x = GetCanteenHeadCountReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCanteenHeadCountReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCanteenHeadCountReply) ProtoMessage() {} + +func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCanteenHeadCountReply.ProtoReflect.Descriptor instead. +func (*GetCanteenHeadCountReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{69} +} + +func (x *GetCanteenHeadCountReply) GetCount() uint32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *GetCanteenHeadCountReply) GetMaxCount() uint32 { + if x != nil { + return x.MaxCount + } + return 0 +} + +func (x *GetCanteenHeadCountReply) GetPercent() float32 { + if x != nil { + return x.Percent + } + return 0 +} + +func (x *GetCanteenHeadCountReply) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +type GetRoomScheduleReply_RoomScheduleEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` + End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + EventId int32 `protobuf:"varint,4,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + CourseCode string `protobuf:"bytes,5,opt,name=course_code,json=courseCode,proto3" json:"course_code,omitempty"` +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) Reset() { + *x = GetRoomScheduleReply_RoomScheduleEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomScheduleReply_RoomScheduleEvent) ProtoMessage() {} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomScheduleReply_RoomScheduleEvent.ProtoReflect.Descriptor instead. +func (*GetRoomScheduleReply_RoomScheduleEvent) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7, 0} +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) GetStart() *timestamppb.Timestamp { + if x != nil { + return x.Start + } + return nil +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) GetEnd() *timestamppb.Timestamp { + if x != nil { + return x.End + } + return nil +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) GetEventId() int32 { + if x != nil { + return x.EventId + } + return 0 +} + +func (x *GetRoomScheduleReply_RoomScheduleEvent) GetCourseCode() string { + if x != nil { + return x.CourseCode + } + return "" +} + +type GetRoomMapsReply_Map struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MapId int64 `protobuf:"varint,1,opt,name=map_id,json=mapId,proto3" json:"map_id,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Scale int64 `protobuf:"varint,3,opt,name=scale,proto3" json:"scale,omitempty"` + Width int64 `protobuf:"varint,4,opt,name=width,proto3" json:"width,omitempty"` + Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *GetRoomMapsReply_Map) Reset() { + *x = GetRoomMapsReply_Map{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRoomMapsReply_Map) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoomMapsReply_Map) ProtoMessage() {} + +func (x *GetRoomMapsReply_Map) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoomMapsReply_Map.ProtoReflect.Descriptor instead. +func (*GetRoomMapsReply_Map) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *GetRoomMapsReply_Map) GetMapId() int64 { + if x != nil { + return x.MapId + } + return 0 +} + +func (x *GetRoomMapsReply_Map) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *GetRoomMapsReply_Map) GetScale() int64 { + if x != nil { + return x.Scale + } + return 0 +} + +func (x *GetRoomMapsReply_Map) GetWidth() int64 { + if x != nil { + return x.Width + } + return 0 +} + +func (x *GetRoomMapsReply_Map) GetHeight() int64 { + if x != nil { + return x.Height + } + return 0 +} + +type GetLocationsReply_Location struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Lon string `protobuf:"bytes,3,opt,name=lon,proto3" json:"lon,omitempty"` + Lat string `protobuf:"bytes,4,opt,name=lat,proto3" json:"lat,omitempty"` + Radius string `protobuf:"bytes,5,opt,name=radius,proto3" json:"radius,omitempty"` +} + +func (x *GetLocationsReply_Location) Reset() { + *x = GetLocationsReply_Location{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLocationsReply_Location) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLocationsReply_Location) ProtoMessage() {} + +func (x *GetLocationsReply_Location) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLocationsReply_Location.ProtoReflect.Descriptor instead. +func (*GetLocationsReply_Location) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13, 0} +} + +func (x *GetLocationsReply_Location) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *GetLocationsReply_Location) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GetLocationsReply_Location) GetLon() string { + if x != nil { + return x.Lon + } + return "" +} + +func (x *GetLocationsReply_Location) GetLat() string { + if x != nil { + return x.Lat + } + return "" +} + +func (x *GetLocationsReply_Location) GetRadius() string { + if x != nil { + return x.Radius + } + return "" +} + +var File_tumdev_campus_backend_proto protoreflect.FileDescriptor + +var file_tumdev_campus_backend_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x74, 0x75, 0x6d, 0x64, 0x65, 0x76, 0x2f, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, + 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, + 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x31, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, + 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x59, + 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, + 0x6f, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, + 0x65, 0x6e, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0xc5, 0x01, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x72, + 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x75, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, + 0x78, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, + 0x6d, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, + 0x6d, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x74, 0x6d, 0x5f, 0x65, 0x61, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x75, 0x74, 0x6d, 0x45, + 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x74, 0x6d, 0x5f, 0x6e, 0x6f, + 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x75, 0x74, + 0x6d, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2d, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, + 0x04, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x1a, 0x82, 0x01, 0x0a, + 0x03, 0x4d, 0x61, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x31, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x76, 0x0a, 0x08, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x33, 0x0a, + 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1f, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, + 0x6d, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, + 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, + 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, + 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, + 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, + 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, + 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, + 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, + 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, + 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x68, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x6d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6e, 0x61, 0x6d, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x11, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x19, 0x4e, 0x65, + 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, + 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, + 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x54, + 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, + 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, + 0x6e, 0x22, 0x39, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, + 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x13, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x22, 0x6f, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, + 0x61, 0x78, 0x22, 0x41, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x09, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x6f, 0x0a, 0x09, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, + 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, + 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6e, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, + 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x22, 0x68, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, + 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x22, 0x54, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, + 0x47, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, + 0x73, 0x22, 0x5f, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, + 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, + 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x1a, 0x61, 0x72, 0x65, + 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x72, 0x65, 0x61, + 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x47, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, + 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, + 0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, + 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6c, 0x69, + 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x16, + 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x60, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, + 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, + 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x58, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x16, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, + 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, + 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, + 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, + 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x72, + 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x79, 0x0a, 0x13, 0x53, + 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x24, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x52, + 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x75, 0x64, 0x79, + 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, + 0x22, 0x39, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x22, 0xbe, 0x03, 0x0a, 0x0e, + 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x8e, 0x02, 0x0a, + 0x13, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, + 0x16, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x44, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, + 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, + 0x22, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, + 0xa9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x1c, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, + 0xa0, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, + 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, + 0x52, 0x4f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, + 0x53, 0x10, 0x02, 0x32, 0xb0, 0x1e, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x4d, + 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, + 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, + 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x68, 0x0a, + 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x62, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x17, + 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, + 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x6a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x22, 0x62, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x2f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x7d, 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, + 0x70, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x62, 0x04, 0x6d, + 0x61, 0x70, 0x73, 0x22, 0x10, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, + 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x62, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x1d, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, + 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, + 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, + 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x6e, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x5f, 0x0a, + 0x0d, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, + 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x71, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, + 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x26, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, + 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x7b, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x62, + 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x18, 0x2f, 0x63, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, + 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, + 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, + 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x62, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x32, 0x47, 0x70, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, + 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, + 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x12, 0x13, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, + 0x2f, 0x6e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x12, 0x64, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x6a, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x12, 0x16, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, + 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, + 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x5b, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, + 0x74, 0x75, 0x64, 0x79, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x4b, 0x69, 0x6e, 0x6f, 0x12, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, + 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x6b, 0x69, 0x6e, 0x6f, 0x2f, 0x7b, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, + 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x71, + 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, + 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, + 0x7d, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x71, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, + 0x12, 0x1f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x29, 0x12, 0x27, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, + 0x10, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, + 0x7d, 0x12, 0x7d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, + 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x12, 0x1e, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x7d, + 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, + 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, + 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x42, 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, + 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, + 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, + 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, + 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_tumdev_campus_backend_proto_rawDescOnce sync.Once + file_tumdev_campus_backend_proto_rawDescData = file_tumdev_campus_backend_proto_rawDesc +) + +func file_tumdev_campus_backend_proto_rawDescGZIP() []byte { + file_tumdev_campus_backend_proto_rawDescOnce.Do(func() { + file_tumdev_campus_backend_proto_rawDescData = protoimpl.X.CompressGZIP(file_tumdev_campus_backend_proto_rawDescData) + }) + return file_tumdev_campus_backend_proto_rawDescData +} + +var file_tumdev_campus_backend_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 73) +var file_tumdev_campus_backend_proto_goTypes = []interface{}{ + (DeviceType)(0), // 0: api.DeviceType + (*RegisterDeviceRequest)(nil), // 1: api.RegisterDeviceRequest + (*RegisterDeviceReply)(nil), // 2: api.RegisterDeviceReply + (*RemoveDeviceRequest)(nil), // 3: api.RemoveDeviceRequest + (*RemoveDeviceReply)(nil), // 4: api.RemoveDeviceReply + (*IOSDeviceRequestResponseRequest)(nil), // 5: api.IOSDeviceRequestResponseRequest + (*IOSDeviceRequestResponseReply)(nil), // 6: api.IOSDeviceRequestResponseReply + (*GetRoomScheduleRequest)(nil), // 7: api.GetRoomScheduleRequest + (*GetRoomScheduleReply)(nil), // 8: api.GetRoomScheduleReply + (*GetRoomCoordinatesRequest)(nil), // 9: api.GetRoomCoordinatesRequest + (*GetRoomCoordinatesReply)(nil), // 10: api.GetRoomCoordinatesReply + (*GetRoomMapsRequest)(nil), // 11: api.GetRoomMapsRequest + (*GetRoomMapsReply)(nil), // 12: api.GetRoomMapsReply + (*GetLocationsRequest)(nil), // 13: api.GetLocationsRequest + (*GetLocationsReply)(nil), // 14: api.GetLocationsReply + (*SearchRoomsRequest)(nil), // 15: api.SearchRoomsRequest + (*SearchRoomsReply)(nil), // 16: api.SearchRoomsReply + (*Room)(nil), // 17: api.Room + (*NewsSourceReply)(nil), // 18: api.NewsSourceReply + (*NewsSource)(nil), // 19: api.NewsSource + (*GetTopNewsReply)(nil), // 20: api.GetTopNewsReply + (*CafeteriaRatingRequest)(nil), // 21: api.CafeteriaRatingRequest + (*DishRatingRequest)(nil), // 22: api.DishRatingRequest + (*CafeteriaRatingReply)(nil), // 23: api.CafeteriaRatingReply + (*DishRatingReply)(nil), // 24: api.DishRatingReply + (*SingleRatingReply)(nil), // 25: api.SingleRatingReply + (*NewCafeteriaRatingRequest)(nil), // 26: api.NewCafeteriaRatingRequest + (*NewDishRatingRequest)(nil), // 27: api.NewDishRatingRequest + (*GetTagsReply)(nil), // 28: api.GetTagsReply + (*TagsOverview)(nil), // 29: api.TagsOverview + (*RatingTag)(nil), // 30: api.RatingTag + (*RatingTagNewRequest)(nil), // 31: api.RatingTagNewRequest + (*RatingTagResult)(nil), // 32: api.RatingTagResult + (*GetCafeteriaReply)(nil), // 33: api.GetCafeteriaReply + (*Cafeteria)(nil), // 34: api.Cafeteria + (*GetDishesRequest)(nil), // 35: api.GetDishesRequest + (*GetDishesReply)(nil), // 36: api.GetDishesReply + (*GetResponsiblePersonReply)(nil), // 37: api.GetResponsiblePersonReply + (*ResponsiblePersonElement)(nil), // 38: api.ResponsiblePersonElement + (*GetBuilding2GpsReply)(nil), // 39: api.GetBuilding2GpsReply + (*Building2GpsElement)(nil), // 40: api.Building2GpsElement + (*GetAreaFacilitiesByBuildingNrReply)(nil), // 41: api.GetAreaFacilitiesByBuildingNrReply + (*GetAreaFacilitiesByBuildingNrRequest)(nil), // 42: api.GetAreaFacilitiesByBuildingNrRequest + (*GetListOfToiletsReply)(nil), // 43: api.GetListOfToiletsReply + (*RoomInformationElement)(nil), // 44: api.RoomInformationElement + (*GetListOfElevatorsReply)(nil), // 45: api.GetListOfElevatorsReply + (*GetMoreInformationReply)(nil), // 46: api.GetMoreInformationReply + (*MoreInformationElement)(nil), // 47: api.MoreInformationElement + (*GetOpeningTimesRequest)(nil), // 48: api.GetOpeningTimesRequest + (*GetOpeningTimesReply)(nil), // 49: api.GetOpeningTimesReply + (*OpeningTimesMsgElement)(nil), // 50: api.OpeningTimesMsgElement + (*GetUpdateNoteRequest)(nil), // 51: api.GetUpdateNoteRequest + (*GetUpdateNoteReply)(nil), // 52: api.GetUpdateNoteReply + (*GetStudyRoomListReply)(nil), // 53: api.GetStudyRoomListReply + (*StudyRoomMsgElement)(nil), // 54: api.StudyRoomMsgElement + (*StudyRoom)(nil), // 55: api.StudyRoom + (*GetKinoRequest)(nil), // 56: api.GetKinoRequest + (*GetKinoReply)(nil), // 57: api.GetKinoReply + (*KinoMsgElement)(nil), // 58: api.KinoMsgElement + (*SendFeedbackRequest)(nil), // 59: api.SendFeedbackRequest + (*SendFeedbackImageReply)(nil), // 60: api.SendFeedbackImageReply + (*SendFeedbackImageRequest)(nil), // 61: api.SendFeedbackImageRequest + (*GetMembersRequest)(nil), // 62: api.GetMembersRequest + (*GetMembersReply)(nil), // 63: api.GetMembersReply + (*GetUploadStatusRequest)(nil), // 64: api.GetUploadStatusRequest + (*GetUploadStatusReply)(nil), // 65: api.GetUploadStatusReply + (*GetNotificationsReply)(nil), // 66: api.GetNotificationsReply + (*NotificationsRequest)(nil), // 67: api.NotificationsRequest + (*GetNotificationsConfirmReply)(nil), // 68: api.GetNotificationsConfirmReply + (*GetCanteenHeadCountRequest)(nil), // 69: api.GetCanteenHeadCountRequest + (*GetCanteenHeadCountReply)(nil), // 70: api.GetCanteenHeadCountReply + (*GetRoomScheduleReply_RoomScheduleEvent)(nil), // 71: api.GetRoomScheduleReply.RoomScheduleEvent + (*GetRoomMapsReply_Map)(nil), // 72: api.GetRoomMapsReply.Map + (*GetLocationsReply_Location)(nil), // 73: api.GetLocationsReply.Location + (*timestamppb.Timestamp)(nil), // 74: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 75: google.protobuf.Empty +} +var file_tumdev_campus_backend_proto_depIdxs = []int32{ + 0, // 0: api.RegisterDeviceRequest.deviceType:type_name -> api.DeviceType + 0, // 1: api.RemoveDeviceRequest.deviceType:type_name -> api.DeviceType + 74, // 2: api.GetRoomScheduleRequest.start:type_name -> google.protobuf.Timestamp + 74, // 3: api.GetRoomScheduleRequest.end:type_name -> google.protobuf.Timestamp + 71, // 4: api.GetRoomScheduleReply.events:type_name -> api.GetRoomScheduleReply.RoomScheduleEvent + 72, // 5: api.GetRoomMapsReply.maps:type_name -> api.GetRoomMapsReply.Map + 73, // 6: api.GetLocationsReply.locations:type_name -> api.GetLocationsReply.Location + 17, // 7: api.SearchRoomsReply.rooms:type_name -> api.Room + 19, // 8: api.NewsSourceReply.sources:type_name -> api.NewsSource + 74, // 9: api.GetTopNewsReply.created:type_name -> google.protobuf.Timestamp + 74, // 10: api.GetTopNewsReply.from:type_name -> google.protobuf.Timestamp + 74, // 11: api.GetTopNewsReply.to:type_name -> google.protobuf.Timestamp + 74, // 12: api.CafeteriaRatingRequest.from:type_name -> google.protobuf.Timestamp + 74, // 13: api.CafeteriaRatingRequest.to:type_name -> google.protobuf.Timestamp + 74, // 14: api.DishRatingRequest.from:type_name -> google.protobuf.Timestamp + 74, // 15: api.DishRatingRequest.to:type_name -> google.protobuf.Timestamp + 25, // 16: api.CafeteriaRatingReply.rating:type_name -> api.SingleRatingReply + 32, // 17: api.CafeteriaRatingReply.ratingTags:type_name -> api.RatingTagResult + 25, // 18: api.DishRatingReply.rating:type_name -> api.SingleRatingReply + 32, // 19: api.DishRatingReply.ratingTags:type_name -> api.RatingTagResult + 32, // 20: api.DishRatingReply.nameTags:type_name -> api.RatingTagResult + 31, // 21: api.SingleRatingReply.ratingTags:type_name -> api.RatingTagNewRequest + 74, // 22: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp + 30, // 23: api.NewCafeteriaRatingRequest.ratingTags:type_name -> api.RatingTag + 30, // 24: api.NewDishRatingRequest.ratingTags:type_name -> api.RatingTag + 29, // 25: api.GetTagsReply.ratingTags:type_name -> api.TagsOverview + 34, // 26: api.GetCafeteriaReply.cafeteria:type_name -> api.Cafeteria + 38, // 27: api.GetResponsiblePersonReply.responsiblePerson:type_name -> api.ResponsiblePersonElement + 40, // 28: api.GetBuilding2GpsReply.building2Gps:type_name -> api.Building2GpsElement + 44, // 29: api.GetAreaFacilitiesByBuildingNrReply.areaFacilitiesByBuildingNr:type_name -> api.RoomInformationElement + 44, // 30: api.GetListOfToiletsReply.listOfToilets:type_name -> api.RoomInformationElement + 44, // 31: api.GetListOfElevatorsReply.listOfElevators:type_name -> api.RoomInformationElement + 47, // 32: api.GetMoreInformationReply.information:type_name -> api.MoreInformationElement + 50, // 33: api.GetOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement + 54, // 34: api.GetStudyRoomListReply.rooms:type_name -> api.StudyRoomMsgElement + 55, // 35: api.StudyRoomMsgElement.rooms:type_name -> api.StudyRoom + 58, // 36: api.GetKinoReply.kinos:type_name -> api.KinoMsgElement + 74, // 37: api.KinoMsgElement.date:type_name -> google.protobuf.Timestamp + 74, // 38: api.KinoMsgElement.created:type_name -> google.protobuf.Timestamp + 74, // 39: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp + 74, // 40: api.GetRoomScheduleReply.RoomScheduleEvent.start:type_name -> google.protobuf.Timestamp + 74, // 41: api.GetRoomScheduleReply.RoomScheduleEvent.end:type_name -> google.protobuf.Timestamp + 75, // 42: api.Campus.GetTopNews:input_type -> google.protobuf.Empty + 75, // 43: api.Campus.GetNewsSources:input_type -> google.protobuf.Empty + 15, // 44: api.Campus.SearchRooms:input_type -> api.SearchRoomsRequest + 13, // 45: api.Campus.GetLocations:input_type -> api.GetLocationsRequest + 11, // 46: api.Campus.GetRoomMaps:input_type -> api.GetRoomMapsRequest + 9, // 47: api.Campus.GetRoomCoordinates:input_type -> api.GetRoomCoordinatesRequest + 7, // 48: api.Campus.GetRoomSchedule:input_type -> api.GetRoomScheduleRequest + 21, // 49: api.Campus.GetCafeteriaRatings:input_type -> api.CafeteriaRatingRequest + 22, // 50: api.Campus.GetDishRatings:input_type -> api.DishRatingRequest + 26, // 51: api.Campus.NewCafeteriaRating:input_type -> api.NewCafeteriaRatingRequest + 27, // 52: api.Campus.NewDishRating:input_type -> api.NewDishRatingRequest + 75, // 53: api.Campus.GetAvailableDishTags:input_type -> google.protobuf.Empty + 75, // 54: api.Campus.GetNameTags:input_type -> google.protobuf.Empty + 75, // 55: api.Campus.GetAvailableCafeteriaTags:input_type -> google.protobuf.Empty + 75, // 56: api.Campus.GetCafeterias:input_type -> google.protobuf.Empty + 35, // 57: api.Campus.GetDishes:input_type -> api.GetDishesRequest + 75, // 58: api.Campus.GetResponsiblePerson:input_type -> google.protobuf.Empty + 75, // 59: api.Campus.GetBuilding2Gps:input_type -> google.protobuf.Empty + 42, // 60: api.Campus.GetAreaFacilitiesByBuildingNr:input_type -> api.GetAreaFacilitiesByBuildingNrRequest + 75, // 61: api.Campus.GetListOfToilets:input_type -> google.protobuf.Empty + 75, // 62: api.Campus.GetListOfElevators:input_type -> google.protobuf.Empty + 75, // 63: api.Campus.GetMoreInformation:input_type -> google.protobuf.Empty + 48, // 64: api.Campus.GetOpeningTimes:input_type -> api.GetOpeningTimesRequest + 51, // 65: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest + 75, // 66: api.Campus.GetStudyRoomList:input_type -> google.protobuf.Empty + 56, // 67: api.Campus.GetKino:input_type -> api.GetKinoRequest + 59, // 68: api.Campus.SendFeedback:input_type -> api.SendFeedbackRequest + 61, // 69: api.Campus.SendFeedbackImage:input_type -> api.SendFeedbackImageRequest + 64, // 70: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest + 67, // 71: api.Campus.GetNotification:input_type -> api.NotificationsRequest + 67, // 72: api.Campus.GetNotificationConfirm:input_type -> api.NotificationsRequest + 62, // 73: api.Campus.GetMembers:input_type -> api.GetMembersRequest + 69, // 74: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest + 5, // 75: api.Campus.IOSDeviceRequestResponse:input_type -> api.IOSDeviceRequestResponseRequest + 1, // 76: api.Campus.RegisterDevice:input_type -> api.RegisterDeviceRequest + 3, // 77: api.Campus.RemoveDevice:input_type -> api.RemoveDeviceRequest + 20, // 78: api.Campus.GetTopNews:output_type -> api.GetTopNewsReply + 18, // 79: api.Campus.GetNewsSources:output_type -> api.NewsSourceReply + 16, // 80: api.Campus.SearchRooms:output_type -> api.SearchRoomsReply + 14, // 81: api.Campus.GetLocations:output_type -> api.GetLocationsReply + 12, // 82: api.Campus.GetRoomMaps:output_type -> api.GetRoomMapsReply + 10, // 83: api.Campus.GetRoomCoordinates:output_type -> api.GetRoomCoordinatesReply + 8, // 84: api.Campus.GetRoomSchedule:output_type -> api.GetRoomScheduleReply + 23, // 85: api.Campus.GetCafeteriaRatings:output_type -> api.CafeteriaRatingReply + 24, // 86: api.Campus.GetDishRatings:output_type -> api.DishRatingReply + 75, // 87: api.Campus.NewCafeteriaRating:output_type -> google.protobuf.Empty + 75, // 88: api.Campus.NewDishRating:output_type -> google.protobuf.Empty + 28, // 89: api.Campus.GetAvailableDishTags:output_type -> api.GetTagsReply + 28, // 90: api.Campus.GetNameTags:output_type -> api.GetTagsReply + 28, // 91: api.Campus.GetAvailableCafeteriaTags:output_type -> api.GetTagsReply + 33, // 92: api.Campus.GetCafeterias:output_type -> api.GetCafeteriaReply + 36, // 93: api.Campus.GetDishes:output_type -> api.GetDishesReply + 37, // 94: api.Campus.GetResponsiblePerson:output_type -> api.GetResponsiblePersonReply + 39, // 95: api.Campus.GetBuilding2Gps:output_type -> api.GetBuilding2GpsReply + 41, // 96: api.Campus.GetAreaFacilitiesByBuildingNr:output_type -> api.GetAreaFacilitiesByBuildingNrReply + 43, // 97: api.Campus.GetListOfToilets:output_type -> api.GetListOfToiletsReply + 45, // 98: api.Campus.GetListOfElevators:output_type -> api.GetListOfElevatorsReply + 46, // 99: api.Campus.GetMoreInformation:output_type -> api.GetMoreInformationReply + 49, // 100: api.Campus.GetOpeningTimes:output_type -> api.GetOpeningTimesReply + 52, // 101: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply + 53, // 102: api.Campus.GetStudyRoomList:output_type -> api.GetStudyRoomListReply + 57, // 103: api.Campus.GetKino:output_type -> api.GetKinoReply + 60, // 104: api.Campus.SendFeedback:output_type -> api.SendFeedbackImageReply + 60, // 105: api.Campus.SendFeedbackImage:output_type -> api.SendFeedbackImageReply + 65, // 106: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply + 66, // 107: api.Campus.GetNotification:output_type -> api.GetNotificationsReply + 68, // 108: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationsConfirmReply + 63, // 109: api.Campus.GetMembers:output_type -> api.GetMembersReply + 70, // 110: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply + 6, // 111: api.Campus.IOSDeviceRequestResponse:output_type -> api.IOSDeviceRequestResponseReply + 2, // 112: api.Campus.RegisterDevice:output_type -> api.RegisterDeviceReply + 4, // 113: api.Campus.RemoveDevice:output_type -> api.RemoveDeviceReply + 78, // [78:114] is the sub-list for method output_type + 42, // [42:78] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name +} + +func init() { file_tumdev_campus_backend_proto_init() } +func file_tumdev_campus_backend_proto_init() { + if File_tumdev_campus_backend_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_tumdev_campus_backend_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterDeviceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterDeviceReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveDeviceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveDeviceReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IOSDeviceRequestResponseRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IOSDeviceRequestResponseReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomScheduleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomScheduleReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomCoordinatesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomCoordinatesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomMapsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomMapsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLocationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLocationsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchRoomsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchRoomsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Room); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewsSourceReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewsSource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTopNewsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CafeteriaRatingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DishRatingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CafeteriaRatingReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DishRatingReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SingleRatingReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewCafeteriaRatingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewDishRatingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTagsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TagsOverview); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RatingTag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RatingTagNewRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RatingTagResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCafeteriaReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Cafeteria); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDishesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDishesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResponsiblePersonReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponsiblePersonElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBuilding2GpsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Building2GpsElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAreaFacilitiesByBuildingNrReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAreaFacilitiesByBuildingNrRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetListOfToiletsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoomInformationElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetListOfElevatorsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMoreInformationReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MoreInformationElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOpeningTimesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOpeningTimesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpeningTimesMsgElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUpdateNoteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUpdateNoteReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStudyRoomListReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StudyRoomMsgElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StudyRoom); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKinoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKinoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KinoMsgElement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendFeedbackRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendFeedbackImageReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendFeedbackImageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMembersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMembersReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUploadStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUploadStatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNotificationsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NotificationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNotificationsConfirmReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCanteenHeadCountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCanteenHeadCountReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomScheduleReply_RoomScheduleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRoomMapsReply_Map); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tumdev_campus_backend_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLocationsReply_Location); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_tumdev_campus_backend_proto_msgTypes[0].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_tumdev_campus_backend_proto_rawDesc, + NumEnums: 1, + NumMessages: 73, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_tumdev_campus_backend_proto_goTypes, + DependencyIndexes: file_tumdev_campus_backend_proto_depIdxs, + EnumInfos: file_tumdev_campus_backend_proto_enumTypes, + MessageInfos: file_tumdev_campus_backend_proto_msgTypes, + }.Build() + File_tumdev_campus_backend_proto = out.File + file_tumdev_campus_backend_proto_rawDesc = nil + file_tumdev_campus_backend_proto_goTypes = nil + file_tumdev_campus_backend_proto_depIdxs = nil +} diff --git a/server/api/CampusService.pb.gw.go b/server/api/tumdev/campus_backend.pb.gw.go similarity index 99% rename from server/api/CampusService.pb.gw.go rename to server/api/tumdev/campus_backend.pb.gw.go index ad9794d9..eeb38ca8 100644 --- a/server/api/CampusService.pb.gw.go +++ b/server/api/tumdev/campus_backend.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: CampusService.proto +// source: tumdev/campus_backend.proto /* Package api is a reverse proxy. @@ -2630,7 +2630,7 @@ type response_Campus_GetNewsSources_0 struct { } func (m response_Campus_GetNewsSources_0) XXX_ResponseBody() interface{} { - response := m.Message.(*NewsSourceArray) + response := m.Message.(*NewsSourceReply) return response.Sources } diff --git a/server/api/CampusService.proto b/server/api/tumdev/campus_backend.proto similarity index 99% rename from server/api/CampusService.proto rename to server/api/tumdev/campus_backend.proto index 1f0efebc..4cd8775e 100644 --- a/server/api/CampusService.proto +++ b/server/api/tumdev/campus_backend.proto @@ -19,7 +19,7 @@ service Campus { }; } - rpc GetNewsSources (google.protobuf.Empty) returns (NewsSourceArray) { + rpc GetNewsSources (google.protobuf.Empty) returns (NewsSourceReply) { option (google.api.http) = { get: "/news/sources", response_body: "sources" @@ -260,7 +260,7 @@ message IOSDeviceRequestResponseReply { string message = 1; } -message NewsSourceArray { +message NewsSourceReply { repeated NewsSource sources = 1; } diff --git a/server/api/gen/openapiv2/CampusService.swagger.json b/server/api/tumdev/campus_backend.swagger.json similarity index 99% rename from server/api/gen/openapiv2/CampusService.swagger.json rename to server/api/tumdev/campus_backend.swagger.json index 0dea31ba..2f17c490 100644 --- a/server/api/gen/openapiv2/CampusService.swagger.json +++ b/server/api/tumdev/campus_backend.swagger.json @@ -2,7 +2,7 @@ "basePath": "/v1", "swagger": "2.0", "info": { - "title": "CampusService.proto", + "title": "tumdev/campus_backend.proto", "version": "version not set" }, "tags": [ @@ -1598,7 +1598,7 @@ } } }, - "apiNewsSourceArray": { + "apiNewsSourceReply": { "type": "object", "properties": { "sources": { diff --git a/server/api/CampusService_grpc.pb.go b/server/api/tumdev/campus_backend_grpc.pb.go similarity index 86% rename from server/api/CampusService_grpc.pb.go rename to server/api/tumdev/campus_backend_grpc.pb.go index fa5f077a..af68c745 100644 --- a/server/api/CampusService_grpc.pb.go +++ b/server/api/tumdev/campus_backend_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.3.0 // - protoc (unknown) -// source: CampusService.proto +// source: tumdev/campus_backend.proto package api @@ -22,6 +22,11 @@ const _ = grpc.SupportPackageIsVersion7 const ( Campus_GetTopNews_FullMethodName = "/api.Campus/GetTopNews" Campus_GetNewsSources_FullMethodName = "/api.Campus/GetNewsSources" + Campus_SearchRooms_FullMethodName = "/api.Campus/SearchRooms" + Campus_GetLocations_FullMethodName = "/api.Campus/GetLocations" + Campus_GetRoomMaps_FullMethodName = "/api.Campus/GetRoomMaps" + Campus_GetRoomCoordinates_FullMethodName = "/api.Campus/GetRoomCoordinates" + Campus_GetRoomSchedule_FullMethodName = "/api.Campus/GetRoomSchedule" Campus_GetCafeteriaRatings_FullMethodName = "/api.Campus/GetCafeteriaRatings" Campus_GetDishRatings_FullMethodName = "/api.Campus/GetDishRatings" Campus_NewCafeteriaRating_FullMethodName = "/api.Campus/NewCafeteriaRating" @@ -58,7 +63,13 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type CampusClient interface { GetTopNews(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTopNewsReply, error) - GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceArray, error) + GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) + SearchRooms(ctx context.Context, in *SearchRoomsRequest, opts ...grpc.CallOption) (*SearchRoomsReply, error) + // a location is a campus location/building, e.g. "Garching Forschungszentrum" + GetLocations(ctx context.Context, in *GetLocationsRequest, opts ...grpc.CallOption) (*GetLocationsReply, error) + GetRoomMaps(ctx context.Context, in *GetRoomMapsRequest, opts ...grpc.CallOption) (*GetRoomMapsReply, error) + GetRoomCoordinates(ctx context.Context, in *GetRoomCoordinatesRequest, opts ...grpc.CallOption) (*GetRoomCoordinatesReply, error) + GetRoomSchedule(ctx context.Context, in *GetRoomScheduleRequest, opts ...grpc.CallOption) (*GetRoomScheduleReply, error) // This endpoint retrieves Cafeteria Ratings from the Backend. GetCafeteriaRatings(ctx context.Context, in *CafeteriaRatingRequest, opts ...grpc.CallOption) (*CafeteriaRatingReply, error) GetDishRatings(ctx context.Context, in *DishRatingRequest, opts ...grpc.CallOption) (*DishRatingReply, error) @@ -111,8 +122,8 @@ func (c *campusClient) GetTopNews(ctx context.Context, in *emptypb.Empty, opts . return out, nil } -func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceArray, error) { - out := new(NewsSourceArray) +func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) { + out := new(NewsSourceReply) err := c.cc.Invoke(ctx, Campus_GetNewsSources_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -120,6 +131,51 @@ func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, op return out, nil } +func (c *campusClient) SearchRooms(ctx context.Context, in *SearchRoomsRequest, opts ...grpc.CallOption) (*SearchRoomsReply, error) { + out := new(SearchRoomsReply) + err := c.cc.Invoke(ctx, Campus_SearchRooms_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *campusClient) GetLocations(ctx context.Context, in *GetLocationsRequest, opts ...grpc.CallOption) (*GetLocationsReply, error) { + out := new(GetLocationsReply) + err := c.cc.Invoke(ctx, Campus_GetLocations_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *campusClient) GetRoomMaps(ctx context.Context, in *GetRoomMapsRequest, opts ...grpc.CallOption) (*GetRoomMapsReply, error) { + out := new(GetRoomMapsReply) + err := c.cc.Invoke(ctx, Campus_GetRoomMaps_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *campusClient) GetRoomCoordinates(ctx context.Context, in *GetRoomCoordinatesRequest, opts ...grpc.CallOption) (*GetRoomCoordinatesReply, error) { + out := new(GetRoomCoordinatesReply) + err := c.cc.Invoke(ctx, Campus_GetRoomCoordinates_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *campusClient) GetRoomSchedule(ctx context.Context, in *GetRoomScheduleRequest, opts ...grpc.CallOption) (*GetRoomScheduleReply, error) { + out := new(GetRoomScheduleReply) + err := c.cc.Invoke(ctx, Campus_GetRoomSchedule_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *campusClient) GetCafeteriaRatings(ctx context.Context, in *CafeteriaRatingRequest, opts ...grpc.CallOption) (*CafeteriaRatingReply, error) { out := new(CafeteriaRatingReply) err := c.cc.Invoke(ctx, Campus_GetCafeteriaRatings_FullMethodName, in, out, opts...) @@ -386,7 +442,13 @@ func (c *campusClient) RemoveDevice(ctx context.Context, in *RemoveDeviceRequest // for forward compatibility type CampusServer interface { GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) - GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceArray, error) + GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) + SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) + // a location is a campus location/building, e.g. "Garching Forschungszentrum" + GetLocations(context.Context, *GetLocationsRequest) (*GetLocationsReply, error) + GetRoomMaps(context.Context, *GetRoomMapsRequest) (*GetRoomMapsReply, error) + GetRoomCoordinates(context.Context, *GetRoomCoordinatesRequest) (*GetRoomCoordinatesReply, error) + GetRoomSchedule(context.Context, *GetRoomScheduleRequest) (*GetRoomScheduleReply, error) // This endpoint retrieves Cafeteria Ratings from the Backend. GetCafeteriaRatings(context.Context, *CafeteriaRatingRequest) (*CafeteriaRatingReply, error) GetDishRatings(context.Context, *DishRatingRequest) (*DishRatingReply, error) @@ -430,9 +492,24 @@ type UnimplementedCampusServer struct { func (UnimplementedCampusServer) GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTopNews not implemented") } -func (UnimplementedCampusServer) GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceArray, error) { +func (UnimplementedCampusServer) GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNewsSources not implemented") } +func (UnimplementedCampusServer) SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SearchRooms not implemented") +} +func (UnimplementedCampusServer) GetLocations(context.Context, *GetLocationsRequest) (*GetLocationsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLocations not implemented") +} +func (UnimplementedCampusServer) GetRoomMaps(context.Context, *GetRoomMapsRequest) (*GetRoomMapsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoomMaps not implemented") +} +func (UnimplementedCampusServer) GetRoomCoordinates(context.Context, *GetRoomCoordinatesRequest) (*GetRoomCoordinatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoomCoordinates not implemented") +} +func (UnimplementedCampusServer) GetRoomSchedule(context.Context, *GetRoomScheduleRequest) (*GetRoomScheduleReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoomSchedule not implemented") +} func (UnimplementedCampusServer) GetCafeteriaRatings(context.Context, *CafeteriaRatingRequest) (*CafeteriaRatingReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCafeteriaRatings not implemented") } @@ -569,6 +646,96 @@ func _Campus_GetNewsSources_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Campus_SearchRooms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SearchRoomsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServer).SearchRooms(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Campus_SearchRooms_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServer).SearchRooms(ctx, req.(*SearchRoomsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Campus_GetLocations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetLocationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServer).GetLocations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Campus_GetLocations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServer).GetLocations(ctx, req.(*GetLocationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Campus_GetRoomMaps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoomMapsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServer).GetRoomMaps(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Campus_GetRoomMaps_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServer).GetRoomMaps(ctx, req.(*GetRoomMapsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Campus_GetRoomCoordinates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoomCoordinatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServer).GetRoomCoordinates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Campus_GetRoomCoordinates_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServer).GetRoomCoordinates(ctx, req.(*GetRoomCoordinatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Campus_GetRoomSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoomScheduleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServer).GetRoomSchedule(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Campus_GetRoomSchedule_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServer).GetRoomSchedule(ctx, req.(*GetRoomScheduleRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Campus_GetCafeteriaRatings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CafeteriaRatingRequest) if err := dec(in); err != nil { @@ -1106,6 +1273,26 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetNewsSources", Handler: _Campus_GetNewsSources_Handler, }, + { + MethodName: "SearchRooms", + Handler: _Campus_SearchRooms_Handler, + }, + { + MethodName: "GetLocations", + Handler: _Campus_GetLocations_Handler, + }, + { + MethodName: "GetRoomMaps", + Handler: _Campus_GetRoomMaps_Handler, + }, + { + MethodName: "GetRoomCoordinates", + Handler: _Campus_GetRoomCoordinates_Handler, + }, + { + MethodName: "GetRoomSchedule", + Handler: _Campus_GetRoomSchedule_Handler, + }, { MethodName: "GetCafeteriaRatings", Handler: _Campus_GetCafeteriaRatings_Handler, @@ -1224,5 +1411,5 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "CampusService.proto", + Metadata: "tumdev/campus_backend.proto", } diff --git a/server/backend/cafeteriaRatingDBInitializer.go b/server/backend/cafeteriaRatingDBInitializer.go index 1f80d270..500a93d4 100644 --- a/server/backend/cafeteriaRatingDBInitializer.go +++ b/server/backend/cafeteriaRatingDBInitializer.go @@ -208,8 +208,7 @@ func generateNameTagListFromFile(path string) multiLanguageNameTags { log.WithError(errjson).Error("Error while reading the file.") } defer func(jsonFile *os.File) { - err := jsonFile.Close() - if err != nil { + if err := jsonFile.Close(); err != nil { log.WithError(err).Error("Error in parsing json.") } }(file) @@ -224,8 +223,7 @@ func generateRatingTagListFromFile(path string) multiLanguageTags { log.WithError(errjson).Error("Error while reading or parsing the file.") } defer func(jsonFile *os.File) { - err := jsonFile.Close() - if err != nil { + if err := jsonFile.Close(); err != nil { log.WithError(err).Error("Error in parsing json.") } }(file) diff --git a/server/backend/cafeteriaService.go b/server/backend/cafeteriaService.go index c0573a27..8e2565c0 100644 --- a/server/backend/cafeteriaService.go +++ b/server/backend/cafeteriaService.go @@ -7,7 +7,7 @@ import ( "crypto/md5" "errors" "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "image" "image/jpeg" "math" @@ -50,7 +50,7 @@ func (s *CampusServer) GetCafeteriaRatings(_ context.Context, input *pb.Cafeteri if res.Error != nil { log.WithError(res.Error).Error("Error while querying the cafeteria with Id ", cafeteriaId) - return nil, status.Errorf(codes.Internal, "This cafeteria has not yet been rated.") + return nil, status.Error(codes.Internal, "This cafeteria has not yet been rated.") } if res.RowsAffected > 0 { @@ -157,7 +157,7 @@ func (s *CampusServer) GetDishRatings(_ context.Context, input *pb.DishRatingReq if err.Error != nil { fields := log.Fields{"dishID": dishID, "cafeteriaID": cafeteriaID} log.WithError(err.Error).WithFields(fields).Error("Error while querying the average ratings") - return nil, status.Errorf(codes.Internal, "This dish has not yet been rated.") + return nil, status.Error(codes.Internal, "This dish has not yet been rated.") } if err.RowsAffected > 0 { @@ -249,15 +249,12 @@ func getImageToBytes(path string) []byte { return make([]byte, 0) } file, err := os.Open(path) - if err != nil { log.WithError(err).Error("while opening image file with path: ", path) return nil } - defer func(file *os.File) { - err := file.Close() - if err != nil { + if err := file.Close(); err != nil { log.WithError(err).Error("Unable to close the file for storing the image.") } }(file) @@ -267,8 +264,7 @@ func getImageToBytes(path string) []byte { imageAsBytes := make([]byte, size) buffer := bufio.NewReader(file) - _, err = buffer.Read(imageAsBytes) - if err != nil { + if _, err = buffer.Read(imageAsBytes); err != nil { log.WithError(err).Error("while trying to read image as bytes") return nil } @@ -376,10 +372,9 @@ func (s *CampusServer) NewCafeteriaRating(_ context.Context, input *pb.NewCafete Image: resPath, } - err := s.db.Model(&model.CafeteriaRating{}).Create(&rating).Error - if err != nil { + if err := s.db.Model(&model.CafeteriaRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("Error occurred while creating the new cafeteria rating.") - return nil, status.Errorf(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.") + return nil, status.Error(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.") } return storeRatingTags(s, rating.CafeteriaRating, input.RatingTags, CAFETERIA) @@ -400,12 +395,11 @@ func imageWrapper(image []byte, path string, id int32) string { } // storeImage -// stores an image and returns teh path to this image. +// stores an image and returns the path to this image. // if needed, a new directory will be created and the path is extended until it is unique func storeImage(path string, i []byte) (string, error) { if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { - err := os.MkdirAll(path, os.ModePerm) - if err != nil { + if err := os.MkdirAll(path, os.ModePerm); err != nil { log.WithError(err).WithField("path", path).Error("Directory could not be created successfully") return "", nil } @@ -430,8 +424,7 @@ func storeImage(path string, i []byte) (string, error) { return imgPath, errFile } defer func(out *os.File) { - err := out.Close() - if err != nil { + if err := out.Close(); err != nil { log.WithError(err).Error("while closing the file.") } }(out) @@ -459,7 +452,7 @@ func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingR First(&dish).Error if errDish != nil || dish == nil { log.WithError(errDish).Error("Error while creating a new dish rating.") - return nil, status.Errorf(codes.InvalidArgument, "Dish is not offered in this week in this canteen. Rating has not been saved.") + return nil, status.Error(codes.InvalidArgument, "Dish is not offered in this week in this canteen. Rating has not been saved.") } resPath := imageWrapper(input.Image, "dishes", dish.Dish) @@ -473,10 +466,9 @@ func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingR Image: resPath, } - err := s.db.Model(&model.DishRating{}).Create(&rating).Error - if err != nil { + if err := s.db.Model(&model.DishRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("while creating a new dish rating.") - return nil, status.Errorf(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.") + return nil, status.Error(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.") } assignDishNameTag(s, rating, dish.Dish) @@ -511,24 +503,24 @@ func assignDishNameTag(s *CampusServer, rating model.DishRating, dishID int32) { // Additionally, queries the cafeteria ID, since it checks whether the cafeteria actually exists. func inputSanitizationForNewRatingElements(rating int32, comment string, cafeteriaName string, s *CampusServer) (int32, error) { if rating > 5 || rating < 0 { - return -1, status.Errorf(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.") } if len(comment) > 256 { - return -1, status.Errorf(codes.InvalidArgument, "Ratings can only contain up to 256 characters, this is too long. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Ratings can only contain up to 256 characters, this is too long. Rating has not been saved.") } if strings.Contains(comment, "@") { - return -1, status.Errorf(codes.InvalidArgument, "Comments must not contain @ symbols in order to prevent misuse. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Comments must not contain @ symbols in order to prevent misuse. Rating has not been saved.") } var result *model.Cafeteria res := s.db.Model(&model.Cafeteria{}). Where("name LIKE ?", cafeteriaName). First(&result) - if res.Error == gorm.ErrRecordNotFound || res.RowsAffected == 0 { + if errors.Is(res.Error, gorm.ErrRecordNotFound) || res.RowsAffected == 0 { log.WithError(res.Error).Error("Error while querying the cafeteria id by name: ", cafeteriaName) - return -1, status.Errorf(codes.InvalidArgument, "Cafeteria does not exist. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Cafeteria does not exist. Rating has not been saved.") } return result.Cafeteria, nil @@ -587,11 +579,11 @@ func storeRatingTags(s *CampusServer, parentRatingID int32, tags []*pb.RatingTag } if len(errorOccurred) > 0 && len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+errorOccurred+" does not exist. Remaining rating was saved without this rating tag. The tag(s) "+warningOccurred+" occurred more than once in this rating.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag. The tag(s) %s occurred more than once in this rating.", errorOccurred, warningOccurred)) } else if len(errorOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+errorOccurred+" does not exist. Remaining rating was saved without this rating tag.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag.", errorOccurred)) } else if len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+warningOccurred+" occurred more than once in this rating.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s occurred more than once in this rating.", warningOccurred)) } else { return &emptypb.Empty{}, nil } @@ -641,7 +633,7 @@ func (s *CampusServer) GetAvailableDishTags(_ context.Context, _ *emptypb.Empty) err := s.db.Model(&model.DishRatingTagOption{}).Select("DE as de, EN as en, dishRatingTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Available dish tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -657,7 +649,7 @@ func (s *CampusServer) GetNameTags(_ context.Context, _ *emptypb.Empty) (*pb.Get err := s.db.Model(&model.DishNameTagOption{}).Select("DE as de, EN as en, dishNameTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading available Name Tags from database.") - requestStatus = status.Errorf(codes.Internal, "Available dish tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -673,7 +665,7 @@ func (s *CampusServer) GetAvailableCafeteriaTags(_ context.Context, _ *emptypb.E err := s.db.Model(&model.CafeteriaRatingTagOption{}).Select("DE as de, EN as en, cafeteriaRatingsTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Available cafeteria tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available cafeteria tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -689,7 +681,7 @@ func (s *CampusServer) GetCafeterias(_ context.Context, _ *emptypb.Empty) (*pb.G err := s.db.Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Cafeterias could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.") } return &pb.GetCafeteriaReply{ @@ -699,13 +691,13 @@ func (s *CampusServer) GetCafeterias(_ context.Context, _ *emptypb.Empty) (*pb.G func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest) (*pb.GetDishesReply, error) { if request.Year < 2022 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Years must be larger or equal to 2022 ") // currently, no previous values have been added + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Years must be larger or equal to 2022 ") // currently, no previous values have been added } if request.Week < 1 || request.Week > 53 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Weeks must be in the range 1 - 53") + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Weeks must be in the range 1 - 53") } if request.Day < 0 || request.Day > 4 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Days must be in the range 1 (Monday) - 4 (Friday)") + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Days must be in the range 1 (Monday) - 4 (Friday)") } var requestStatus error = nil @@ -721,7 +713,7 @@ func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Cafeterias could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.") } return &pb.GetDishesReply{ diff --git a/server/backend/campus_api/campusApi.go b/server/backend/campus_api/campusApi.go index 1a3d192d..23d6754e 100644 --- a/server/backend/campus_api/campusApi.go +++ b/server/backend/campus_api/campusApi.go @@ -38,23 +38,18 @@ func FetchGrades(token string) (*model.IOSGrades, error) { req.URL.RawQuery = q.Encode() resp, err := http.DefaultClient.Do(req) - if err != nil { log.WithError(err).Error("failed to fetch grades") return nil, ErrWhileFetchingGrades } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) var grades model.IOSGrades - err = xml.NewDecoder(resp.Body).Decode(&grades) - - if err != nil { + if err = xml.NewDecoder(resp.Body).Decode(&grades); err != nil { log.WithError(err).Error("could not unmarshall grades") return nil, ErrorWhileUnmarshalling } diff --git a/server/backend/canteenHeadCount.go b/server/backend/canteenHeadCount.go index 58af641f..589b2b7e 100644 --- a/server/backend/canteenHeadCount.go +++ b/server/backend/canteenHeadCount.go @@ -4,7 +4,7 @@ import ( "context" "errors" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/server/backend/cron/canteenHeadCount.go b/server/backend/cron/canteenHeadCount.go index 5f42ddfe..1eecc9c2 100644 --- a/server/backend/cron/canteenHeadCount.go +++ b/server/backend/cron/canteenHeadCount.go @@ -189,8 +189,7 @@ func updateDb(canteen *CanteenApInformation, count uint32, db *gorm.DB) error { } if res.RowsAffected == 0 { - err := db.Create(&entry).Error - if err != nil { + if err := db.Create(&entry).Error; err != nil { fields := log.Fields{ "CanteenId": entry.CanteenId, "Count": entry.Count, @@ -198,8 +197,8 @@ func updateDb(canteen *CanteenApInformation, count uint32, db *gorm.DB) error { "Percent": entry.Percent, "Timestamp": entry.Timestamp} log.WithError(res.Error).WithFields(fields).Error("could not create headcount entry") + return err } - return err } return nil } @@ -216,17 +215,15 @@ func (canteen CanteenApInformation) requestApData() []AccessPoint { // Ensure we close the body once we leave this function if resp.Body != nil { defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) } // Parse as JSON - aps := []AccessPoint{} - err = json.NewDecoder(resp.Body).Decode(&aps) - if err != nil { + var aps []AccessPoint + if err = json.NewDecoder(resp.Body).Decode(&aps); err != nil { log.WithError(err).Error("Canteen HeadCount parsing output as JSON failed for: ", canteen.CanteenId) return []AccessPoint{} } diff --git a/server/backend/cron/cronjobs.go b/server/backend/cron/cronjobs.go index fc6858b9..b09fc17a 100644 --- a/server/backend/cron/cronjobs.go +++ b/server/backend/cron/cronjobs.go @@ -2,6 +2,7 @@ package cron import ( "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" + "github.com/TUM-Dev/Campus-Backend/server/env" "time" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -12,10 +13,9 @@ import ( ) type CronService struct { - db *gorm.DB - gf *gofeed.Parser - useMensa bool - APNs *ios_apns.Service + db *gorm.DB + gf *gofeed.Parser + APNs *ios_apns.Service } const StorageDir = "/Storage/" // target location of files @@ -36,21 +36,22 @@ const ( AlarmType = "alarm" */ ) -func New(db *gorm.DB, mensaCronActivated bool) *CronService { +func New(db *gorm.DB) *CronService { return &CronService{ - db: db, - gf: gofeed.NewParser(), - APNs: ios_apns.NewCronService(db), - useMensa: mensaCronActivated, + db: db, + gf: gofeed.NewParser(), + APNs: ios_apns.NewCronService(db), } } func (c *CronService) Run() error { - log.WithField("MensaCronsRunning", c.useMensa).Trace("running cron service") + log.WithField("MensaCronActive", env.IsMensaCronActive()).Debug("running cron service") g := new(errgroup.Group) - g.Go(func() error { return c.dishNameDownloadCron() }) - g.Go(func() error { return c.averageRatingComputation() }) + if env.IsMensaCronActive() { + g.Go(func() error { return c.dishNameDownloadCron() }) + g.Go(func() error { return c.averageRatingComputation() }) + } for { log.Trace("Cron: checking for pending") @@ -72,7 +73,7 @@ func (c *CronService) Run() error { for _, cronjob := range res { // Persist run to DB right away var offset int32 = 0 - if c.useMensa { + if env.IsMensaCronActive() { if cronjob.Type.String == AverageRatingComputation { if time.Now().Hour() == 16 { offset = 18 * 3600 // fast-forward 18 Hours to the next day + does not need to be computed overnight @@ -95,11 +96,11 @@ func (c *CronService) Run() error { case FileDownloadType: g.Go(func() error { return c.fileDownloadCron() }) case DishNameDownload: - if c.useMensa { + if env.IsMensaCronActive() { g.Go(c.dishNameDownloadCron) } case AverageRatingComputation: //call every five minutes between 11AM and 4 PM on weekdays - if c.useMensa { + if env.IsMensaCronActive() { g.Go(c.averageRatingComputation) } /* diff --git a/server/backend/device.go b/server/backend/device.go index 05938d8b..436758d2 100644 --- a/server/backend/device.go +++ b/server/backend/device.go @@ -2,7 +2,7 @@ package backend import ( "context" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "sync" "time" @@ -22,6 +22,15 @@ type deviceBuffer struct { interval time.Duration // flush interval } +func newDeviceBuffer() *deviceBuffer { + return &deviceBuffer{ + lock: sync.Mutex{}, + devices: make(map[string]*model.Devices), + interval: time.Minute, + } + +} + func (s *CampusServer) RunDeviceFlusher() error { for { time.Sleep(s.deviceBuf.interval) diff --git a/server/backend/iosNotifications.go b/server/backend/iosNotifications.go index c43131ef..42b54f78 100644 --- a/server/backend/iosNotifications.go +++ b/server/backend/iosNotifications.go @@ -2,7 +2,7 @@ package backend import ( "context" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" diff --git a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go index 1091b8f7..338b0d31 100644 --- a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go +++ b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go @@ -100,20 +100,18 @@ func (r *Repository) SendNotification(notification *model.IOSNotificationPayload resp, err := client.Do(req) if err != nil { - log.Error(err) + log.WithError(err).Error("Could not send notification") return nil, ErrCouldNotSendNotification } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) var response model.IOSRemoteNotificationResponse if err = json.NewDecoder(resp.Body).Decode(&response); err != nil && err != io.EOF { - log.Error(err) + log.WithError(err).Error("Could not decode APNs response") return nil, ErrCouldNotDecodeAPNsResponse } @@ -137,15 +135,13 @@ func NewRepository(db *gorm.DB, token *ios_apns_jwt.Token) *Repository { func NewCronRepository(db *gorm.DB) (*Repository, error) { if err := ValidateRequirementsForIOSNotificationsService(); err != nil { - log.Warn(err) - + log.WithError(err).Warn("Failed to validate requirements for ios notifications service") return nil, err } token, err := ios_apns_jwt.NewToken() - if err != nil { - log.Fatal(err) + log.WithError(err).Fatal("Could not create APNs token") } return NewRepository(db, token), nil diff --git a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go index 0b6fe133..bf00d984 100644 --- a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go +++ b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go @@ -39,7 +39,6 @@ type Token struct { func NewToken() (*Token, error) { encryptionKey, err := APNsEncryptionKeyFromFile() - if err != nil { return nil, err } @@ -50,9 +49,7 @@ func NewToken() (*Token, error) { TeamId: ApnsTeamId, } - _, err = token.Generate() - - if err != nil { + if err = token.Generate(); err != nil { return nil, err } @@ -106,7 +103,7 @@ func (t *Token) GenerateNewTokenIfExpired() (bearer string) { defer t.Unlock() if t.IsExpired() { - _, err := t.Generate() + err := t.Generate() if err != nil { return "" } @@ -119,9 +116,9 @@ func (t *Token) IsExpired() bool { return currentTimestamp() >= (t.IssuedAt + TokenTimeout) } -func (t *Token) Generate() (bool, error) { +func (t *Token) Generate() error { if t.EncryptionKey == nil { - return false, ErrorAuthKeyNil + return ErrorAuthKeyNil } issuedAt := currentTimestamp() @@ -141,13 +138,13 @@ func (t *Token) Generate() (bool, error) { token, err := jwtToken.SignedString(t.EncryptionKey) if err != nil { - return false, err + return err } t.IssuedAt = issuedAt t.Bearer = token - return true, nil + return nil } func currentTimestamp() int64 { diff --git a/server/backend/ios_notifications/ios_crypto/encryptedString.go b/server/backend/ios_notifications/ios_crypto/encryptedString.go index 24a04a53..5ee0aa4b 100644 --- a/server/backend/ios_notifications/ios_crypto/encryptedString.go +++ b/server/backend/ios_notifications/ios_crypto/encryptedString.go @@ -97,19 +97,16 @@ func SymmetricEncrypt(plaintext string, key string) (*EncryptedString, error) { func SymmetricDecrypt(encryptedString EncryptedString, key string) (string, error) { bytesKey := []byte(key) bytesEncryptedString, err := base64.StdEncoding.DecodeString(string(encryptedString)) - if err != nil { return "", err } c, err := aes.NewCipher(bytesKey) - if err != nil { return "", err } gcm, err := cipher.NewGCM(c) - if err != nil { return "", err } @@ -118,7 +115,6 @@ func SymmetricDecrypt(encryptedString EncryptedString, key string) (string, erro nonce, ciphertext := bytesEncryptedString[:nonceSize], bytesEncryptedString[nonceSize:] plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) - if err != nil { return "", err } diff --git a/server/backend/ios_notifications/ios_device/iosDeviceService.go b/server/backend/ios_notifications/ios_device/iosDeviceService.go index 3256ff0d..8f5209d7 100644 --- a/server/backend/ios_notifications/ios_device/iosDeviceService.go +++ b/server/backend/ios_notifications/ios_device/iosDeviceService.go @@ -2,7 +2,7 @@ package ios_device import ( - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/model" "google.golang.org/grpc/codes" diff --git a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go index 32a3faa9..cbd57102 100644 --- a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go +++ b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go @@ -5,7 +5,7 @@ package ios_request_response import ( "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/campus_api" "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" @@ -76,19 +76,19 @@ func (service *Service) handleDeviceCampusTokenRequest(requestLog *model.IOSDevi apiGrades, err := campus_api.FetchGrades(campusToken) if err != nil { - log.Error("Could not fetch grades: ", err) + log.WithError(err).Error("Could not fetch grades") return nil, ErrInternalHandleGrades } oldEncryptedGrades, err := service.Repository.GetIOSEncryptedGrades(requestLog.DeviceID) if err != nil { - log.Error("Could not get old grades: ", err) + log.WithError(err).Error("Could not get old grades") return nil, ErrInternalHandleGrades } oldGrades, err := decryptGrades(oldEncryptedGrades, campusToken) if err != nil { - log.Error("Could not decrypt old grades: ", err) + log.WithError(err).Error("Could not decrypt old grades") return nil, ErrInternalHandleGrades } @@ -104,7 +104,7 @@ func (service *Service) handleDeviceCampusTokenRequest(requestLog *model.IOSDevi err = service.Repository.DeleteEncryptedGrades(requestLog.DeviceID) if err != nil { - log.Error("Could not delete old grades: ", err) + log.WithError(err).Error("Could not delete old grades") return nil, ErrInternalHandleGrades } @@ -129,7 +129,7 @@ func (service *Service) deleteRequestLog(requestLog *model.IOSDeviceRequestLog) err := service.Repository.DeleteAllRequestLogsForThisDeviceWithType(requestLog) if err != nil { - log.Error("Could not delete request logs: ", err) + log.WithError(err).Error("Could not delete request logs") } } @@ -139,7 +139,7 @@ func decryptGrades(grades []model.IOSEncryptedGrade, campusToken string) ([]mode err := encryptedGrade.Decrypt(campusToken) if err != nil { - log.Error("Could not decrypt grade: ", err) + log.WithError(err).Error("Could not decrypt grade") return nil, status.Error(codes.Internal, "Could not decrypt grade") } @@ -177,15 +177,13 @@ func (service *Service) encryptGradesAndStoreInDatabase(grades []model.IOSGrade, } err := encryptedGrade.Encrypt(campusToken) - if err != nil { - log.Error("Could not encrypt grade: ", err) + log.WithError(err).Error("Could not encrypt grade") } err = service.Repository.SaveEncryptedGrade(&encryptedGrade) - if err != nil { - log.Error("Could not save grade: ", err) + log.WithError(err).Error("Could not save grade") } } } @@ -210,12 +208,11 @@ func sendGradesToDevice(device *model.IOSDevice, grades []model.IOSGrade, apns * Alert(alertTitle, "", alertBody). Encrypt(device.PublicKey) - log.WithField("DeviceID", device.DeviceID).Infof("Sending push notification") + log.WithField("DeviceID", device.DeviceID).Info("Sending push notification") _, err := apns.SendAlertNotification(notificationPayload) - if err != nil { - log.Error("Could not send notification: ", err) + log.WithField("DeviceID", device.DeviceID).WithError(err).Error("Could not send notification") } } diff --git a/server/backend/news.go b/server/backend/news.go new file mode 100644 index 00000000..fac84b5c --- /dev/null +++ b/server/backend/news.go @@ -0,0 +1,35 @@ +package backend + +import ( + "context" + "fmt" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" +) + +func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (newsSources *pb.NewsSourceReply, err error) { + if err = s.checkDevice(ctx); err != nil { + return + } + + var sources []model.NewsSource + if err := s.db.Joins("Files").Find(&sources).Error; err != nil { + log.WithError(err).Error("could not find newsSources") + return nil, status.Error(codes.Internal, "could not GetNewsSources") + } + + var resp []*pb.NewsSource + for _, source := range sources { + log.WithField("title", source.Title).Trace("sending news source") + resp = append(resp, &pb.NewsSource{ + Source: fmt.Sprintf("%d", source.Source), + Title: source.Title, + Icon: source.Files.URL.String, + }) + } + return &pb.NewsSourceReply{Sources: resp}, nil +} diff --git a/server/backend/newsAlerts.go b/server/backend/newsAlerts.go new file mode 100644 index 00000000..b9addc25 --- /dev/null +++ b/server/backend/newsAlerts.go @@ -0,0 +1,37 @@ +package backend + +import ( + "context" + "errors" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" +) + +func (s *CampusServer) GetTopNews(ctx context.Context, _ *emptypb.Empty) (*pb.GetTopNewsReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err + } + + var res *model.NewsAlert + err := s.db.Joins("Files").Where("NOW() between `from` and `to`").First(&res).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, status.Error(codes.NotFound, "no current active top news") + } else if err != nil { + log.WithError(err).Error("could not GetTopNews") + return nil, status.Error(codes.Internal, "could not GetTopNews") + } + + return &pb.GetTopNewsReply{ + ImageUrl: res.Files.URL.String, + Link: res.Link.String, + Created: timestamppb.New(res.Created), + From: timestamppb.New(res.From), + To: timestamppb.New(res.To), + }, nil +} diff --git a/server/backend/newsAlerts_test.go b/server/backend/newsAlerts_test.go new file mode 100644 index 00000000..dd11cd30 --- /dev/null +++ b/server/backend/newsAlerts_test.go @@ -0,0 +1,114 @@ +package backend + +import ( + "context" + "database/sql" + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/guregu/null" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "regexp" + "testing" + "time" +) + +type NewsAlertSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *NewsAlertSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +const ExpectedGetTopNewsQuery = "SELECT `news_alert`.`news_alert`,`news_alert`.`file`,`news_alert`.`name`,`news_alert`.`link`,`news_alert`.`created`,`news_alert`.`from`,`news_alert`.`to`,`Files`.`file` AS `Files__file`,`Files`.`name` AS `Files__name`,`Files`.`path` AS `Files__path`,`Files`.`downloads` AS `Files__downloads`,`Files`.`url` AS `Files__url`,`Files`.`downloaded` AS `Files__downloaded` FROM `news_alert` LEFT JOIN `files` `Files` ON `news_alert`.`file` = `Files`.`file` WHERE NOW() between `from` and `to` ORDER BY `news_alert`.`news_alert` LIMIT 1" + +func (s *NewsAlertSuite) Test_GetTopNewsOne() { + expectedAlert := model.NewsAlert{ + NewsAlert: 1, + FilesID: 3001, + Files: model.Files{ + File: 3001, + Name: "Tournament_app_02-02.png", + Path: "newsalerts/", + Downloads: 0, + URL: sql.NullString{Valid: false}, + Downloaded: sql.NullBool{Bool: true, Valid: true}, + }, + Name: null.String{NullString: sql.NullString{String: "Exzellenzuniversität", Valid: true}}, + Link: null.String{NullString: sql.NullString{String: "https://tum.de", Valid: true}}, + Created: time.Time.Add(time.Now(), time.Hour*-4), + From: time.Time.Add(time.Now(), time.Hour*-2), + To: time.Time.Add(time.Now(), time.Hour*2), + } + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)). + WillReturnRows(sqlmock.NewRows([]string{"news_alert", "file", "name", "link", "created", "from", "to", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"}). + AddRow(expectedAlert.NewsAlert, expectedAlert.FilesID, expectedAlert.Name, expectedAlert.Link, expectedAlert.Created, expectedAlert.From, expectedAlert.To, expectedAlert.Files.File, expectedAlert.Files.Name, expectedAlert.Files.Path, expectedAlert.Files.Downloads, expectedAlert.Files.URL, expectedAlert.Files.Downloaded)) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + require.Equal(s.T(), &pb.GetTopNewsReply{ + ImageUrl: expectedAlert.Files.URL.String, + Link: expectedAlert.Link.String, + Created: timestamppb.New(expectedAlert.Created), + From: timestamppb.New(expectedAlert.From), + To: timestamppb.New(expectedAlert.To), + }, response) +} +func (s *NewsAlertSuite) Test_GetTopNewsNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)).WillReturnError(gorm.ErrRecordNotFound) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.Equal(s.T(), status.Error(codes.NotFound, "no current active top news"), err) + require.Nil(s.T(), response) +} +func (s *NewsAlertSuite) Test_GetTopNewsError() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)).WillReturnError(gorm.ErrInvalidDB) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.Equal(s.T(), status.Error(codes.Internal, "could not GetTopNews"), err) + require.Nil(s.T(), response) +} + +func (s *NewsAlertSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestNewsAlertSuite(t *testing.T) { + suite.Run(t, new(NewsAlertSuite)) +} diff --git a/server/backend/news_test.go b/server/backend/news_test.go new file mode 100644 index 00000000..c0f175c1 --- /dev/null +++ b/server/backend/news_test.go @@ -0,0 +1,124 @@ +package backend + +import ( + "context" + "database/sql" + "fmt" + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/guregu/null" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/metadata" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "regexp" + "testing" +) + +type NewsSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *NewsSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +func file(id int32) *model.Files { + return &model.Files{ + File: id, + Name: fmt.Sprintf("src_%d.png", id), + Path: "news/sources", + Downloads: 1, + URL: sql.NullString{Valid: false}, + Downloaded: sql.NullBool{Bool: true, Valid: true}, + } +} + +func source1() *model.NewsSource { + return &model.NewsSource{ + Source: 1, + Title: "Amazing News 1", + URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing1", Valid: true}}, + FilesID: file(2).File, + Files: *file(2), + Hook: null.String{NullString: sql.NullString{String: "", Valid: true}}, + } +} + +func source2() *model.NewsSource { + return &model.NewsSource{ + Source: 2, + Title: "Amazing News 2", + URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing2", Valid: true}}, + FilesID: file(2).File, + Files: *file(2), + Hook: null.String{NullString: sql.NullString{String: "hook", Valid: true}}, + } +} + +const ExpectedGetSourceQuery = "SELECT `newsSource`.`source`,`newsSource`.`title`,`newsSource`.`url`,`newsSource`.`icon`,`newsSource`.`hook`,`Files`.`file` AS `Files__file`,`Files`.`name` AS `Files__name`,`Files`.`path` AS `Files__path`,`Files`.`downloads` AS `Files__downloads`,`Files`.`url` AS `Files__url`,`Files`.`downloaded` AS `Files__downloaded` FROM `newsSource` LEFT JOIN `files` `Files` ON `newsSource`.`icon` = `Files`.`file`" + +func (s *NewsSuite) Test_GetNewsSourcesMultiple() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetSourceQuery)). + WillReturnRows(sqlmock.NewRows([]string{"source", "title", "url", "icon", "hook", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"}). + AddRow(source1().Source, source1().Title, source1().URL, source1().FilesID, source1().Hook, source1().Files.File, source1().Files.Name, source1().Files.Path, source1().Files.Downloads, source1().Files.URL, source1().Files.Downloaded). + AddRow(source2().Source, source2().Title, source2().URL, source2().FilesID, source2().Hook, source2().Files.File, source2().Files.Name, source2().Files.Path, source2().Files.Downloads, source2().Files.URL, source2().Files.Downloaded)) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + expectedResp := &pb.NewsSourceReply{ + Sources: []*pb.NewsSource{ + {Source: fmt.Sprintf("%d", source1().Source), Title: source1().Title, Icon: source1().Files.URL.String}, + {Source: fmt.Sprintf("%d", source2().Source), Title: source2().Title, Icon: source2().Files.URL.String}, + }, + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *NewsSuite) Test_GetNewsSourcesNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetSourceQuery)). + WillReturnRows(sqlmock.NewRows([]string{"source", "title", "url", "icon", "hook", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"})) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + expectedResp := &pb.NewsSourceReply{ + Sources: []*pb.NewsSource(nil), + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *NewsSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestNewsSuite(t *testing.T) { + suite.Run(t, new(NewsSuite)) +} diff --git a/server/backend/rpcserver.go b/server/backend/rpcserver.go index 505fc7b7..e1824083 100644 --- a/server/backend/rpcserver.go +++ b/server/backend/rpcserver.go @@ -3,8 +3,7 @@ package backend import ( "context" "errors" - "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -12,19 +11,15 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" - "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/gorm" "net" - "sync" - "time" ) func (s *CampusServer) GRPCServe(l net.Listener) error { grpcServer := grpc.NewServer() pb.RegisterCampusServer(grpcServer, s) if err := grpcServer.Serve(l); err != nil { - log.Fatalf("failed to serve: %v", err) + log.WithError(err).Fatal("failed to serve") } return grpcServer.Serve(l) } @@ -44,19 +39,15 @@ func New(db *gorm.DB) *CampusServer { initTagRatingOptions(db) return &CampusServer{ - db: db, - deviceBuf: &deviceBuffer{ - lock: sync.Mutex{}, - devices: make(map[string]*model.Devices), - interval: time.Minute, - }, + db: db, + deviceBuf: newDeviceBuffer(), iOSNotificationsService: NewIOSNotificationsService(), } } func NewIOSNotificationsService() *IOSNotificationsService { if err := ios_apns.ValidateRequirementsForIOSNotificationsService(); err != nil { - log.Warn(err) + log.WithError(err).Warn("failed to validate requirements for ios notifications service") return &IOSNotificationsService{ APNSToken: nil, @@ -65,9 +56,8 @@ func NewIOSNotificationsService() *IOSNotificationsService { } token, err := ios_apns_jwt.NewToken() - if err != nil { - log.Fatal(err) + log.WithError(err).Fatal("failed to create new token") } return &IOSNotificationsService{ @@ -76,51 +66,6 @@ func NewIOSNotificationsService() *IOSNotificationsService { } } -func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (newsSources *pb.NewsSourceArray, err error) { - if err = s.checkDevice(ctx); err != nil { - return - } - - var sources []model.NewsSource - if err := s.db.Find(&sources).Error; err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - var resp []*pb.NewsSource - for _, source := range sources { - var icon model.Files - if err := s.db.Where("file = ?", source.Icon).First(&icon).Error; err != nil { - icon = model.Files{File: 0} - } - log.WithField("Title", source.Title).Info("sending news source") - resp = append(resp, &pb.NewsSource{ - Source: fmt.Sprintf("%d", source.Source), - Title: source.Title, - Icon: icon.URL.String, - }) - } - return &pb.NewsSourceArray{Sources: resp}, nil -} - -func (s *CampusServer) GetTopNews(ctx context.Context, _ *emptypb.Empty) (*pb.GetTopNewsReply, error) { - if err := s.checkDevice(ctx); err != nil { - return nil, err - } - - var res *model.NewsAlert - err := s.db.Joins("Company").Where("NOW() between `from` and `to`").Limit(1).First(&res).Error - if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - log.WithError(err).Errorf("Failed to fetch top news") - } else if res != nil { - return &pb.GetTopNewsReply{ - //ImageUrl: res.Name, - Link: res.Link.String, - To: timestamppb.New(res.To), - }, nil - } - return &pb.GetTopNewsReply{}, nil -} - func (s *CampusServer) GetIOSNotificationsService() *IOSNotificationsService { return s.iOSNotificationsService } diff --git a/server/backend/validators.go b/server/backend/validators.go index b8c456d3..6ebf670c 100644 --- a/server/backend/validators.go +++ b/server/backend/validators.go @@ -2,7 +2,7 @@ package backend import ( "errors" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" ) func ValidateRegisterDevice(request *pb.RegisterDeviceRequest) error { diff --git a/server/env/environment.go b/server/env/environment.go index cea605a8..0526d478 100644 --- a/server/env/environment.go +++ b/server/env/environment.go @@ -13,3 +13,7 @@ func IsDev() bool { func IsProd() bool { return GetEnvironment() == "prod" } + +func IsMensaCronActive() bool { + return os.Getenv("MensaCronDisabled") != "true" +} diff --git a/server/go.mod b/server/go.mod index 64319e11..431d82c0 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,6 +3,7 @@ module github.com/TUM-Dev/Campus-Backend/server go 1.21 require ( + github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/disintegration/imaging v1.6.2 github.com/gabriel-vasile/mimetype v1.4.2 github.com/getsentry/sentry-go v0.23.0 @@ -22,7 +23,6 @@ require ( golang.org/x/sync v0.3.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.57.0 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.31.0 gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.4 @@ -35,7 +35,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect diff --git a/server/go.sum b/server/go.sum index 49281d6f..cfc63195 100644 --- a/server/go.sum +++ b/server/go.sum @@ -42,6 +42,8 @@ github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= @@ -922,8 +924,6 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/server/main.go b/server/main.go index 916d029f..e7845af6 100644 --- a/server/main.go +++ b/server/main.go @@ -15,7 +15,7 @@ import ( "strings" "time" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend" "github.com/TUM-Dev/Campus-Backend/server/backend/cron" "github.com/TUM-Dev/Campus-Backend/server/backend/migration" @@ -45,18 +45,6 @@ func main() { setupTelemetry() defer sentry.Flush(2 * time.Second) // make sure that sentry handles shutdowns gracefully - // Connect to DB - var conn gorm.Dialector - shouldAutoMigrate := false - dbHost := os.Getenv("DB_DSN") - if dbHost != "" { - log.Info("Connecting to dsn") - conn = mysql.Open(dbHost) - } else { - log.Error("Failed to start! The 'DB_DSN' environment variable is not defined. Take a look at the README.md for more details.") - os.Exit(-1) - } - // initializing connection to InfluxDB err := backend.ConnectToInfluxDB() if errors.Is(err, backend.ErrInfluxTokenNotConfigured) { @@ -67,54 +55,38 @@ func main() { log.WithError(err).Error("InfluxDB connection failed - health check failed") } - db, err := gorm.Open(conn, &gorm.Config{}) - if err != nil { - panic("failed to connect database") - } - - // Migrate the schema - tumMigrator := migration.New(db, shouldAutoMigrate) - err = tumMigrator.Migrate() - if err != nil { - log.WithError(err).Fatal("Failed to migrate database") - return - } + db := setupDB() - var mensaCronActivated = true - if len(os.Args) > 2 && os.Args[1] == "-MensaCron" && os.Args[2] == "0" { - mensaCronActivated = false - log.Info("Cronjobs for the cafeteria rating are deactivated. Remove commandline argument <-MensaCron 0> or set it to 1.", len(os.Args)) - } - // Create any other background services (these shouldn't do any long running work here) - cronService := cron.New(db, mensaCronActivated) + // Create any other background services (these shouldn't do any long-running work here) + cronService := cron.New(db) campusService := backend.New(db) // Listen to our configured ports listener, err := net.Listen("tcp", httpPort) if err != nil { - log.Fatalf("failed to listen: %v", err) + log.WithError(err).Fatal("failed to listen") } - m := cmux.New(listener) - grpcListener := m.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc")) - httpListener := m.Match(cmux.HTTP1Fast()) + mux := cmux.New(listener) + grpcListener := mux.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc")) + httpListener := mux.Match(cmux.HTTP1Fast()) // HTTP Stuff - mux := http.NewServeMux() - httpServer := &http.Server{Handler: mux} - mux.HandleFunc("/imprint", func(w http.ResponseWriter, r *http.Request) { + httpMux := http.NewServeMux() + httpServer := &http.Server{Handler: httpMux} + httpMux.HandleFunc("/imprint", func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("Hello, world!")) }) - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + httpMux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("healthy")) }) static, _ := fs.Sub(swagfs, "swagger") - mux.Handle("/", http.FileServer(http.FS(static))) + httpMux.Handle("/", http.FileServer(http.FS(static))) // Main GRPC Server - grpcS := grpc.NewServer() - pb.RegisterCampusServer(grpcS, campusService) + grpcServer := grpc.NewServer() + pb.RegisterCampusServer(grpcServer, campusService) // GRPC Gateway for HTTP REST -> GRPC grpcGatewayMux := runtime.NewServeMux(runtime.WithIncomingHeaderMatcher( @@ -128,31 +100,52 @@ func main() { }), runtime.WithErrorHandler(errorHandler), ) - ctx := context.Background() opts := []grpc.DialOption{ grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithUserAgent("internal"), grpc.WithUnaryInterceptor(addMethodNameInterceptor), } - if err := pb.RegisterCampusHandlerFromEndpoint(ctx, grpcGatewayMux, httpPort, opts); err != nil { - panic(err) + if err := pb.RegisterCampusHandlerFromEndpoint(context.Background(), grpcGatewayMux, httpPort, opts); err != nil { + log.WithError(err).Panic("could not RegisterCampusHandlerFromEndpoint") } - restPrefix := "/v1" - mux.Handle("/v1/", http.StripPrefix(restPrefix, grpcGatewayMux)) + httpMux.Handle("/v1/", http.StripPrefix("/v1", grpcGatewayMux)) // Start each server in its own go routine and logs any errors g := errgroup.Group{} - g.Go(func() error { return grpcS.Serve(grpcListener) }) + g.Go(func() error { return grpcServer.Serve(grpcListener) }) g.Go(func() error { return httpServer.Serve(httpListener) }) - g.Go(func() error { return m.Serve() }) + g.Go(func() error { return mux.Serve() }) g.Go(func() error { return cronService.Run() }) // Setup cron jobs g.Go(func() error { return campusService.RunDeviceFlusher() }) // Setup campus service log.Info("running server") - err = g.Wait() + if err := g.Wait(); err != nil { + log.WithError(err).Error("encountered issue while running the server") + } +} + +// setupDB connects to the database and migrates it if necessary +func setupDB() *gorm.DB { + // Connect to DB + var conn gorm.Dialector + if dbHost := os.Getenv("DB_DSN"); dbHost == "" { + log.Fatal("Failed to start! The 'DB_DSN' environment variable is not defined. Take a look at the README.md for more details.") + } else { + log.Info("Connecting to dsn") + conn = mysql.Open(dbHost) + } + + db, err := gorm.Open(conn, &gorm.Config{}) if err != nil { - log.Error(err) + log.WithError(err).Panic("failed to connect database") + } + + // Migrate the schema + // currently not activated as + if err := migration.New(db, false).Migrate(); err != nil { + log.WithError(err).Fatal("Failed to migrate database") } + return db } // setupTelemetry initializes our telemetry stack @@ -177,7 +170,7 @@ func setupTelemetry() { }); err != nil { log.WithError(err).Error("Sentry initialization failed") } - log.AddHook(sentryhook.New([]log.Level{log.PanicLevel, log.FatalLevel, log.ErrorLevel})) + log.AddHook(sentryhook.New([]log.Level{log.PanicLevel, log.FatalLevel, log.ErrorLevel, log.WarnLevel})) } else { log.Info("continuing without sentry") } @@ -226,9 +219,7 @@ func errorHandler(_ context.Context, _ *runtime.ServeMux, _ runtime.Marshaler, w w.Header().Set("Content-Type", "application/json") w.WriteHeader(errorResp.StatusCode) - err = json.NewEncoder(w).Encode(errorResp) - - if err != nil { + if err = json.NewEncoder(w).Encode(errorResp); err != nil { log.WithError(err).Error("Marshal error response failed") return } diff --git a/server/model/ios_grade.go b/server/model/ios_grade.go index 4d6d282a..5bd8c31b 100644 --- a/server/model/ios_grade.go +++ b/server/model/ios_grade.go @@ -33,13 +33,11 @@ type customDate struct { func (c *customDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { var v string - err := d.DecodeElement(&v, &start) - if err != nil { + if err := d.DecodeElement(&v, &start); err != nil { return err } t, err := time.Parse("2006-01-02", v) - if err != nil { return err } @@ -66,13 +64,11 @@ type IOSEncryptedGrade struct { func (e *IOSEncryptedGrade) Encrypt(key string) error { encryptedTitle, err := ios_crypto.SymmetricEncrypt(e.LectureTitle, key) - if err != nil { return err } encryptedGrade, err := ios_crypto.SymmetricEncrypt(e.Grade, key) - if err != nil { return err } @@ -86,13 +82,11 @@ func (e *IOSEncryptedGrade) Encrypt(key string) error { func (e *IOSEncryptedGrade) Decrypt(key string) error { decryptedTitle, err := ios_crypto.SymmetricDecrypt(ios_crypto.EncryptedString(e.LectureTitle), key) - if err != nil { return err } decryptedGrade, err := ios_crypto.SymmetricDecrypt(ios_crypto.EncryptedString(e.Grade), key) - if err != nil { return err } diff --git a/server/model/news_alert.go b/server/model/news_alert.go index ad5f126a..0bf502a6 100644 --- a/server/model/news_alert.go +++ b/server/model/news_alert.go @@ -17,20 +17,14 @@ var ( // NewsAlert struct is a row record of the news_alert table in the tca database type NewsAlert struct { - //[ 0] news_alert int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - NewsAlert int32 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` - //[ 1] file int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - File null.Int `gorm:"column:file;type:int;" json:"file"` - //[ 2] name varchar(100) null: true primary: false isArray: false auto: false col: varchar len: 100 default: [] - Name null.String `gorm:"column:name;type:varchar(100);" json:"name"` - //[ 3] link text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Link null.String `gorm:"column:link;type:text;size:65535;" json:"link"` - //[ 4] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 5] from datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [CURRENT_TIMESTAMP] - From time.Time `gorm:"column:from;type:datetime;default:CURRENT_TIMESTAMP;" json:"from"` - //[ 6] to datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [CURRENT_TIMESTAMP] - To time.Time `gorm:"column:to;type:datetime;default:CURRENT_TIMESTAMP;" json:"to"` + NewsAlert int32 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` + FilesID int32 `gorm:"column:file;not null"` + Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` + Name null.String `gorm:"column:name;type:varchar(100);" json:"name"` + Link null.String `gorm:"column:link;type:text;size:65535;" json:"link"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + From time.Time `gorm:"column:from;type:datetime;default:CURRENT_TIMESTAMP;" json:"from"` + To time.Time `gorm:"column:to;type:datetime;default:CURRENT_TIMESTAMP;" json:"to"` } // TableName sets the insert table name for this struct type diff --git a/server/model/news_source.go b/server/model/news_source.go index 8fe0f222..c1b3925d 100644 --- a/server/model/news_source.go +++ b/server/model/news_source.go @@ -17,16 +17,12 @@ var ( // NewsSource struct is a row record of the newsSource table in the tca database type NewsSource struct { - //[ 0] source int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Source int32 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;" json:"source"` - //[ 1] title text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Title string `gorm:"column:title;type:text;size:16777215;" json:"title"` - //[ 2] url text(16777215) null: true primary: false isArray: false auto: false col: text len: 16777215 default: [] - URL null.String `gorm:"column:url;type:text;size:16777215;" json:"url"` - //[ 3] icon int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Icon null.Int `gorm:"column:icon;type:int;" json:"icon"` - //[ 4] hook char(12) null: true primary: false isArray: false auto: false col: char len: 12 default: [] - Hook null.String `gorm:"column:hook;type:char;size:12;" json:"hook"` + Source int32 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;"` + Title string `gorm:"column:title;type:text;size:16777215;"` + URL null.String `gorm:"column:url;type:text;size:16777215;"` + FilesID int32 `gorm:"column:icon;not null"` + Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` + Hook null.String `gorm:"column:hook;type:char;size:12;"` } // TableName sets the insert table name for this struct type diff --git a/server/swagger/fav.png b/server/swagger/fav.png new file mode 100644 index 00000000..43c43acb Binary files /dev/null and b/server/swagger/fav.png differ diff --git a/server/swagger/favicon-16x16.png b/server/swagger/favicon-16x16.png deleted file mode 100644 index 8b194e61..00000000 Binary files a/server/swagger/favicon-16x16.png and /dev/null differ diff --git a/server/swagger/favicon-32x32.png b/server/swagger/favicon-32x32.png deleted file mode 100644 index 249737fe..00000000 Binary files a/server/swagger/favicon-32x32.png and /dev/null differ diff --git a/server/swagger/index.html b/server/swagger/index.html index 60d2c93f..168efec7 100644 --- a/server/swagger/index.html +++ b/server/swagger/index.html @@ -5,55 +5,26 @@ Swagger UI - - - -
- - diff --git a/server/swagger/oauth2-redirect.html b/server/swagger/oauth2-redirect.html index 64b171f7..56409171 100644 --- a/server/swagger/oauth2-redirect.html +++ b/server/swagger/oauth2-redirect.html @@ -13,7 +13,7 @@ var isValid, qp, arr; if (/code|token|error/.test(window.location.hash)) { - qp = window.location.hash.substring(1); + qp = window.location.hash.substring(1).replace('?', '&'); } else { qp = location.search.substring(1); } @@ -38,7 +38,7 @@ authId: oauth2.auth.name, source: "auth", level: "warning", - message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server" + message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server." }); } @@ -58,7 +58,7 @@ authId: oauth2.auth.name, source: "auth", level: "error", - message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server" + message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server." }); } } else { @@ -67,9 +67,13 @@ window.close(); } - window.addEventListener('DOMContentLoaded', function () { - run(); - }); + if (document.readyState !== 'loading') { + run(); + } else { + document.addEventListener('DOMContentLoaded', function () { + run(); + }); + } diff --git a/server/swagger/swagger-ui-bundle.js b/server/swagger/swagger-ui-bundle.js index 6607e499..c611bf76 100644 --- a/server/swagger/swagger-ui-bundle.js +++ b/server/swagger/swagger-ui-bundle.js @@ -1,3 +1,3 @@ /*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=489)}([function(e,t,n){"use strict";e.exports=n(566)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return u(e)?e:K(e)}function o(e){return s(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[f])}function u(e){return!(!e||!e[p])}function s(e){return!(!e||!e[h])}function c(e){return u(e)||s(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=u,n.isIndexed=s,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var f="@@__IMMUTABLE_ITERABLE__@@",p="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m="delete",v=5,g=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function C(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return I(e,t,0)}function P(e,t){return I(e,t,t)}function I(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D="function"==typeof Symbol&&Symbol.iterator,L="@@iterator",B=D||L;function F(e){this.next=e}function z(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function U(){return{value:void 0,done:!0}}function q(e){return!!H(e)}function V(e){return e&&"function"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if("function"==typeof t)return t}function $(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?u(e)?e.toSeq():e.fromEntrySeq():ue(e)}function Y(e){return null==e?ie():i(e)?u(e)?e.entrySeq():e.toIndexedSeq():se(e)}function G(e){return(null==e?ie():i(e)?u(e)?e.entrySeq():e:se(e)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return fe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return pe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return fe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return pe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Q,Z,X,ee="@@__IMMUTABLE_SEQ__@@";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Q||(Q=new te([]))}function ue(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():q(e)?new re(e).fromEntrySeq():"object"==typeof e?new ne(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function se(e){var t=le(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ce(e){var t=le(e)||"object"==typeof e&&new ne(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):q(e)?new re(e):void 0}function fe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var u=o[n?a-i:i];if(!1===t(u[1],r?u[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function pe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?U():z(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,"",{"":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||u(e)!==u(t)||s(e)!==s(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var f=!0,p=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return f=!1,!1}));return f&&e.size===p}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function we(e,t){if(!e)throw new Error(t)}function xe(e,t,n){if(!(this instanceof xe))return new xe(e,t,n);if(we(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?U():z(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?U():z(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(U);var r=0;return new F((function(){var t=n.next();return t.done?t:z(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return z(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,P(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?U():z(e,a++,i)}))},xe.prototype.equals=function(e){return e instanceof xe?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(_e,n),t(Ee,_e),t(Se,_e),t(ke,_e),_e.Keyed=Ee,_e.Indexed=Se,_e.Set=ke;var Ae="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Oe(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Oe(n)}if("string"===t)return e.length>Fe?je(e):Te(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return Pe(e);if("function"==typeof e.toString)return Te(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function je(e){var t=qe[e];return void 0===t&&(t=Te(e),Ue===ze&&(Ue=0,qe={}),Ue++,qe[e]=t),t}function Te(e){for(var t=0,n=0;n0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De="function"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be="__immutablehash__";"function"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,ze=255,Ue=0,qe={};function Ve(e){we(e!==1/0,"Cannot perform this action with an infinite size.")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString("Map {","}")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,_n(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return pt(this,void 0,arguments)},We.prototype.mergeWith=function(t){return pt(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return pt(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return pt(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return qt(fn(this,e))},We.prototype.sortBy=function(e,t){return qt(fn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je="@@__IMMUTABLE_MAP__@@",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Qe(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return z(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=_(w),i=_(x);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,u){return e?e.update(t,n,r,o,a,i,u):a===b?e:(E(u),E(i),new Xe(t,r,[o,a]))}function ut(e){return e.constructor===Xe||e.constructor===Ze}function st(e,t,n,r,o){if(e.keyHash===r)return new Ze(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,u=(0===n?r:r>>>n)&y;return new Ge(t,1<>>=1)i[u]=1&n?t[a++]:void 0;return i[r]=o,new Qe(e,a+1,i)}function pt(e,t,n){for(var o=[],a=0;a>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:k(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,u=0;u=xt)return ct(e,s,r,o);var p=e&&e===this.ownerID,h=p?s:k(s);return f?u?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),p?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=Ce(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&y,s=1<=_t)return ft(e,p,c,u,d);if(l&&!d&&2===p.length&&ut(p[1^f]))return p[1^f];if(l&&d&&1===p.length&&ut(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^s:c|s,w=l?d?yt(p,f,d,m):wt(p,f,m):bt(p,f,d,m);return m?(this.bitmap=g,this.nodes=w,this):new Ge(e,g,w)},Qe.prototype.get=function(e,t,n,r){void 0===t&&(t=Ce(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Qe.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&y,s=o===b,c=this.nodes,l=c[u];if(s&&!l)return this;var f=it(l,e,t+v,n,r,o,a,i);if(f===l)return this;var p=this.count;if(l){if(!f&&--p0&&r=0&&e>>t&y;if(r>=this.array.length)return new Ct([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var u=Lt(this,e);if(!a)for(var s=0;s>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,Pt={};function It(e,t){var n=e._origin,r=e._capacity,o=Ut(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?u(e,n):s(e,t,n)}function u(e,i){var u=i===o?a&&a.array:e&&e.array,s=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(s===c)return Pt;var e=t?--c:s++;return u&&u[e]}}function s(e,o,a){var u,s=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(u){var e=u();if(e!==Pt)return e;u=null}if(c===l)return Pt;var n=t?--l:c++;u=i(s&&s[n],o-v,a+(n<=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=_(x);return t>=Ut(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,u=r>>>n&y,s=e&&u0){var c=e&&e.array[u],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[u]=l,i)}return s&&e.array[u]===o?e:(E(a),i=Lt(e,t),void 0===o&&u===i.array.length-1?i.array.pop():i.array[u]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new Ct(e?e.array.slice():[],t)}function Bt(e,t){if(t>=Ut(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,u=void 0===n?a:n<0?a+n:o+n;if(i===o&&u===a)return e;if(i>=u)return e.clear();for(var s=e._level,c=e._root,l=0;i+l<0;)c=new Ct(c&&c.array.length?[void 0,c]:[],r),l+=1<<(s+=v);l&&(i+=l,o+=l,u+=l,a+=l);for(var f=Ut(a),p=Ut(u);p>=1<f?new Ct([],r):h;if(h&&p>f&&iv;g-=v){var b=f>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[f>>>v&y]=h}if(u=p)i-=p,u-=p,s=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||p>>s&y;if(w!==p>>>s&y)break;w&&(l+=(1<o&&(c=c.removeBefore(r,s,i-l)),c&&pa&&(a=c.size),i(s)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function Ut(e){return e>>v<=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&u!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=u===i.size-1?i.pop():i.set(u,void 0))}else if(s){if(n===i.get(u)[1])return e;r=a,o=i.set(u,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Qt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=wn,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Zt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,u=i[0];return z(r,u,t.call(n,i[1],u,e),o)}))},r}function Xt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Qt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=wn,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,u=0;return e.__iterate((function(e,a,s){if(t.call(n,e,a,s))return u++,o(e,r?a:u-1,i)}),a),u},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),u=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var s=a.value,c=s[0],l=s[1];if(t.call(n,l,c,e))return z(o,r?c:u++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=u(e),o=(l(e)?qt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=P(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var u,s=i-a;s==s&&(u=s<0?0:s);var c=bn(e);return c.size=0===u?u:e.size&&u||void 0,!r&&ae(e)&&u>=0&&(c.get=function(t,n){return(t=O(this,t))>=0&&tu)return U();var e=o.next();return r||t===M?e:z(t,s-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,u){return t.call(n,e,o,u)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),u=!0;return new F((function(){if(!u)return U();var e=i.next();if(e.done)return e;var o=e.value,s=o[0],c=o[1];return t.call(n,c,s,a)?r===R?e:z(r,s,c,e):(u=!1,U())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var u=!0,s=0;return e.__iterate((function(e,a,c){if(!u||!(u=t.call(n,e,a,c)))return s++,o(e,r?a:s-1,i)})),s},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var u=e.__iterator(R,a),s=!0,c=0;return new F((function(){var e,a,l;do{if((e=u.next()).done)return r||o===M?e:z(o,c++,o===N?void 0:e.value[1],e);var f=e.value;a=f[0],l=f[1],s&&(s=t.call(n,l,a,i))}while(s);return o===R?e:z(o,a,l,e)}))},o}function un(e,t){var n=u(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?ue(e):se(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&u(a)||s(e)&&s(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():s(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function sn(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,u=!1;function s(e,c){var l=this;e.__iterate((function(e,o){return(!t||c0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,u=!1;return new F((function(){var n;return u||(n=a.map((function(e){return e.next()})),u=n.some((function(e){return e.done}))),u?U():z(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return u(e)?r:s(e)?o:a}function bn(e){return Object.create((u(e)?K:s(e)?Y:G).prototype)}function wn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function xn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(P(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,z(e,n++,t)}return U()}))},Vn.isStack=Wn;var Hn,$n="@@__IMMUTABLE_STACK__@@",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return qt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(u(this)?this.valueSeq():this)},toSet:function(){return jn(u(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return s(this)?this.toIndexedSeq():u(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(u(this)?this.valueSeq():this)},toList:function(){return St(u(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return mn(this,un(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Zt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Xt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,fn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(C)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,sn(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=_n(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Xn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return pn(this,e)},maxBy:function(e,t){return pn(this,t,e)},min:function(e){return pn(this,e?nr(e):ar)},minBy:function(e,t){return pn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,fn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Qn=n.prototype;Qn[f]=!0,Qn[B]=Qn.values,Qn.__toJS=Qn.toArray,Qn.__toStringMapper=rr,Qn.inspect=Qn.toSource=function(){return this.toString()},Qn.chain=Qn.flatMap,Qn.contains=Qn.includes,Gn(r,{flip:function(){return mn(this,Qt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Zn=r.prototype;function Xn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return"string"==typeof e?JSON.stringify(e):String(e)}function or(){return k(arguments)}function ar(e,t){return et?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=u(e),r=t?1:0;return ur(e.__iterate(n?t?function(e,t){r=31*r+sr(Ce(e),Ce(t))|0}:function(e,t){r=r+sr(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}function ur(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Oe((t=Ae(t^t>>>13,3266489909))^t>>>16)}function sr(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Zn[p]=!0,Zn[B]=Qn.entries,Zn.__toJS=Qn.toObject,Zn.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Xt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(k(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,sn(this,e,!1))},get:function(e,t){return(e=O(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=O(this,e))>=0&&(void 0!==this.size?this.size===1/0||e1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Ie(e){return t=e.replace(/\.[^./]*$/,""),Y()(J()(t));var t}function Ne(e,t,n,r,a){if(!t)return[];var u=[],s=t.get("nullable"),c=t.get("required"),f=t.get("maximum"),h=t.get("minimum"),d=t.get("type"),m=t.get("format"),g=t.get("maxLength"),b=t.get("minLength"),x=t.get("uniqueItems"),_=t.get("maxItems"),E=t.get("minItems"),S=t.get("pattern"),k=n||!0===c,A=null!=e;if(s&&null===e||!d||!(k||A&&"array"===d||!(!k&&!A)))return[];var O="string"===d&&e,C="array"===d&&l()(e)&&e.length,j="array"===d&&W.a.List.isList(e)&&e.count(),T=[O,C,j,"array"===d&&"string"==typeof e&&e,"file"===d&&e instanceof ue.a.File,"boolean"===d&&(e||!1===e),"number"===d&&(e||0===e),"integer"===d&&(e||0===e),"object"===d&&"object"===i()(e)&&null!==e,"object"===d&&"string"==typeof e&&e],P=I()(T).call(T,(function(e){return!!e}));if(k&&!P&&!r)return u.push("Required field is not provided"),u;if("object"===d&&(null===a||"application/json"===a)){var N,M=e;if("string"==typeof e)try{M=JSON.parse(e)}catch(e){return u.push("Parameter string value must be valid JSON"),u}if(t&&t.has("required")&&Ee(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&u.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))y()(N=t.get("properties")).call(N,(function(e,t){var n=Ne(M[t],e,!1,r,a);u.push.apply(u,o()(p()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return"Value must follow pattern "+t}(e,S);R&&u.push(R)}if(E&&"array"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.lengtht)return v()(n="Array must not contain more then ".concat(t," item")).call(n,1===t?"":"s")}(e,_);L&&u.push({needRemove:!0,error:L})}if(x&&"array"===d){var B=function(e,t){if(e&&("true"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){w()(n).call(n,(function(t){return Ee(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return p()(o).call(o,(function(e){return{index:e,error:"No duplicates allowed."}})).toArray()}}}(e,x);B&&u.push.apply(u,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n="Value must be no longer than ".concat(t," character")).call(n,1!==t?"s":"")}(e,g);F&&u.push(F)}if(b){var z=function(e,t){var n;if(e.lengtht)return"Value must be less than ".concat(t)}(e,f);U&&u.push(U)}if(h||0===h){var q=function(e,t){if(e2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,u=e.get("required"),s=Object(le.a)(e,{isOAS3:o}),c=s.schema,l=s.parameterContentMediaType;return Ne(t,c,u,i,l)},Re=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:["string"]}],Le=["object"],Be=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),u=i()(a),s=S()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Le);return te()(s,(function(e){return e===u}))?M()(a,null,2):a},Fe=function(e,t,n,r){var o,a=Be(e,t,n,r);try{"\n"===(o=me.a.dump(me.a.load(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return o.replace(/\t/g," ")},ze=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Ee(e.toJS)&&(e=e.toJS()),r&&Ee(r.toJS)&&(r=r.toJS()),/xml/.test(t)?Re(e,n,r):/(yaml|yml)/.test(t)?Fe(e,n,t,r):Be(e,n,t,r)},Ue=function(){var e={},t=ue.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},qe=function(t){return(t instanceof e?t:e.from(t.toString(),"utf-8")).toString("base64")},Ve={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},He=function(e,t,n){return!!X()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return"string"!=typeof e||""===e?"":Object(H.sanitizeUrl)(e)}function Je(e){return!(!e||D()(e).call(e,"localhost")>=0||D()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ke(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return z()(t).call(t,"2")&&_()(e.get("content")||{}).length>0})),n=e.get("default")||W.a.OrderedMap(),r=(n.get("content")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ye=function(e){return"string"==typeof e||e instanceof String?q()(e).call(e).replace(/\s/g,"%20"):""},Ge=function(e){return ce()(Ye(e).replace(/%20/g,"_"))},Qe=function(e){return w()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Ze=function(e){return w()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function Xe(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=_()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=Xe(o[e],t,r)})),o}function et(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function tt(e){return"number"==typeof e?e.toString():e}function nt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var i,u,s,c=e.get("name"),l=e.get("in"),f=[];e&&e.hashCode&&l&&c&&a&&f.push(v()(i=v()(u="".concat(l,".")).call(u,c,".hash-")).call(i,e.hashCode()));l&&c&&f.push(v()(s="".concat(l,".")).call(s,c));return f.push(c),r?f:f[0]||""}function rt(e,t){var n,r=nt(e,{returnAll:!0});return w()(n=p()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return it(pe()(32).toString("base64"))}function at(e){return it(de()("sha256").update(e).digest("base64"))}function it(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var ut=function(e){return!e||!(!ge(e)||!e.isEmpty())}}).call(this,n(132).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var r=n(184);function o(e,t){for(var n=0;n-1){var a=n[o];return o>0&&(n.splice(o,1),n.unshift(a)),a.value}return r}return{get:o,put:function(t,a){o(t)===r&&(n.unshift({key:t,value:a}),n.length>e&&n.pop())},getEntries:function(){return n},clear:function(){n=[]}}}(l,p);function d(){var t=h.get(arguments);if(t===r){if(t=e.apply(null,arguments),f){var n=h.getEntries(),o=n.find((function(e){return f(e.value,t)}));o&&(t=o.value)}h.put(arguments,t)}return t}return d.clearCache=function(){return h.clear()},d}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return"function"==typeof e?"function "+(e.name||"unnamed")+"()":typeof e})).join(", ");throw new Error("createSelector expects all input-selectors to be functions, but received the following types: ["+n+"]")}return t}function u(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r>",i=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};i.isRequired=i;var u=function(){return i};function s(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":e instanceof o.Iterable?"Immutable."+e.toSource().split(" ")[0]:t}function c(e){function t(t,n,r,o,i,u){for(var s=arguments.length,c=Array(s>6?s-6:0),l=6;l4)}function l(e){var t=e.get("swagger");return"string"==typeof t&&i()(t).call(t,"2.0")}function f(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?s.a.createElement(e,o()({},r,n,{Ori:t})):s.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){var r=n(17),o=n(221),a=n(43),i=n(176),u=n(219),s=n(334),c=o("wks"),l=r.Symbol,f=l&&l.for,p=s?l:l&&l.withoutSetter||i;e.exports=function(e){if(!a(c,e)||!u&&"string"!=typeof c[e]){var t="Symbol."+e;u&&a(l,e)?c[e]=l[e]:c[e]=s&&f?f(t):p(t)}return c[e]}},function(e,t,n){var r=n(34);e.exports=function(e){return r[e+"Prototype"]}},function(e,t,n){var r=n(246);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},function(e,t,n){e.exports=n(865)},function(e,t){e.exports=function(e){return"function"==typeof e}},function(e,t,n){var r=n(41);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},function(e,t,n){var r=n(28),o=n(58),a=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return a(o(e),t)}},function(e,t,n){var r=n(34),o=n(43),a=n(231),i=n(59).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){e.exports=n(546)},function(e,t,n){var r=n(32);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SPEC",(function(){return ee})),n.d(t,"UPDATE_URL",(function(){return te})),n.d(t,"UPDATE_JSON",(function(){return ne})),n.d(t,"UPDATE_PARAM",(function(){return re})),n.d(t,"UPDATE_EMPTY_PARAM_INCLUSION",(function(){return oe})),n.d(t,"VALIDATE_PARAMS",(function(){return ae})),n.d(t,"SET_RESPONSE",(function(){return ie})),n.d(t,"SET_REQUEST",(function(){return ue})),n.d(t,"SET_MUTATED_REQUEST",(function(){return se})),n.d(t,"LOG_REQUEST",(function(){return ce})),n.d(t,"CLEAR_RESPONSE",(function(){return le})),n.d(t,"CLEAR_REQUEST",(function(){return fe})),n.d(t,"CLEAR_VALIDATE_PARAMS",(function(){return pe})),n.d(t,"UPDATE_OPERATION_META_VALUE",(function(){return he})),n.d(t,"UPDATE_RESOLVED",(function(){return de})),n.d(t,"UPDATE_RESOLVED_SUBTREE",(function(){return me})),n.d(t,"SET_SCHEME",(function(){return ve})),n.d(t,"updateSpec",(function(){return ge})),n.d(t,"updateResolved",(function(){return ye})),n.d(t,"updateUrl",(function(){return be})),n.d(t,"updateJsonSpec",(function(){return we})),n.d(t,"parseToJson",(function(){return xe})),n.d(t,"resolveSpec",(function(){return Ee})),n.d(t,"requestResolvedSubtree",(function(){return Ae})),n.d(t,"changeParam",(function(){return Oe})),n.d(t,"changeParamByIdentity",(function(){return Ce})),n.d(t,"updateResolvedSubtree",(function(){return je})),n.d(t,"invalidateResolvedSubtreeCache",(function(){return Te})),n.d(t,"validateParams",(function(){return Pe})),n.d(t,"updateEmptyParamInclusion",(function(){return Ie})),n.d(t,"clearValidateParams",(function(){return Ne})),n.d(t,"changeConsumesValue",(function(){return Me})),n.d(t,"changeProducesValue",(function(){return Re})),n.d(t,"setResponse",(function(){return De})),n.d(t,"setRequest",(function(){return Le})),n.d(t,"setMutatedRequest",(function(){return Be})),n.d(t,"logRequest",(function(){return Fe})),n.d(t,"executeRequest",(function(){return ze})),n.d(t,"execute",(function(){return Ue})),n.d(t,"clearResponse",(function(){return qe})),n.d(t,"clearRequest",(function(){return Ve})),n.d(t,"setScheme",(function(){return We}));var r=n(25),o=n.n(r),a=n(52),i=n.n(a),u=n(73),s=n.n(u),c=n(18),l=n.n(c),f=n(40),p=n.n(f),h=n(24),d=n.n(h),m=n(4),v=n.n(m),g=n(324),y=n.n(g),b=n(30),w=n.n(b),x=n(206),_=n.n(x),E=n(67),S=n.n(E),k=n(12),A=n.n(k),O=n(207),C=n.n(O),j=n(19),T=n.n(j),P=n(22),I=n.n(P),N=n(2),M=n.n(N),R=n(15),D=n.n(R),L=n(23),B=n.n(L),F=n(325),z=n.n(F),U=n(71),q=n(1),V=n(88),W=n.n(V),H=n(140),$=n(463),J=n.n($),K=n(464),Y=n.n(K),G=n(326),Q=n.n(G),Z=n(5),X=["path","method"],ee="spec_update_spec",te="spec_update_url",ne="spec_update_json",re="spec_update_param",oe="spec_update_empty_param_inclusion",ae="spec_validate_param",ie="spec_set_response",ue="spec_set_request",se="spec_set_mutated_request",ce="spec_log_request",le="spec_clear_response",fe="spec_clear_request",pe="spec_clear_validate_param",he="spec_update_operation_meta_value",de="spec_update_resolved",me="spec_update_resolved_subtree",ve="set_scheme";function ge(e){var t,n=(t=e,J()(t)?t:"").replace(/\t/g," ");if("string"==typeof e)return{type:ee,payload:n}}function ye(e){return{type:de,payload:e}}function be(e){return{type:te,payload:e}}function we(e){return{type:ne,payload:e}}var xe=function(e){return function(t){var n=t.specActions,r=t.specSelectors,o=t.errActions,a=r.specStr,i=null;try{e=e||a(),o.clear({source:"parser"}),i=U.a.load(e)}catch(e){return console.error(e),o.newSpecErr({source:"parser",level:"error",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&"object"===l()(i)?n.updateJsonSpec(i):{}}},_e=!1,Ee=function(e,t){return function(n){var r=n.specActions,o=n.specSelectors,a=n.errActions,i=n.fn,u=i.fetch,s=i.resolve,c=i.AST,l=void 0===c?{}:c,f=n.getConfigs;_e||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),_e=!0);var p=f(),h=p.modelPropertyMacro,m=p.parameterMacro,g=p.requestInterceptor,b=p.responseInterceptor;void 0===e&&(e=o.specJson()),void 0===t&&(t=o.url());var w=l.getLineNumberForPath?l.getLineNumberForPath:function(){},x=o.specStr();return s({fetch:u,spec:e,baseDoc:t,modelPropertyMacro:h,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(a.clear({type:"thrown"}),d()(n)&&n.length>0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?w(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],ke=Y()(s()(p.a.mark((function e(){var t,n,r,o,a,i,u,c,l,f,h,m,g,b,x,E,k,O;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,u=o.AST,c=void 0===u?{}:u,l=t.specSelectors,f=t.specActions,a){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,E=g.requestInterceptor,k=g.responseInterceptor,e.prev=11,e.next=14,w()(Se).call(Se,function(){var e=s()(p.a.mark((function e(t,o){var u,c,f,g,w,O,j,T,P;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return u=e.sent,c=u.resultMap,f=u.specWithCurrentSubtrees,e.next=7,a(f,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:E,responseInterceptor:k});case 7:if(g=e.sent,w=g.errors,O=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!_()(t=e.get("fullPath")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(w)&&w.length>0&&(j=v()(w).call(w,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!O||!l.isOAS3()||"components"!==o[0]||"securitySchemes"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(P=C()(O)).call(P,(function(e){return"openIdConnect"===e.type}))).call(T,function(){var e=s()(p.a.mark((function e(t){var n,r;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:k},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+" "+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case"end":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return Q()(c,o,O),Q()(f,o,O),e.abrupt("return",{resultMap:c,specWithCurrentSubtrees:f});case 18:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(q.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:O=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:f.updateResolvedSubtree([],O.resultMap);case 23:case"end":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join("@@")}))).call(n,e.join("@@"))>-1||(Se.push(e),Se.system=t,ke())}};function Oe(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Ce(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(q.Map)()}}},Pe=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Ie=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:pe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:"consumes_value"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:"produces_value"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Fe=function(e){return{payload:e,type:ce}},ze=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,u=t.getConfigs,c=t.oas3Selectors,l=e.pathName,f=e.method,h=e.operation,m=u(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get("parameters")&&I()(n=A()(r=h.get("parameters")).call(r,(function(e){return e&&!0===e.get("allowEmptyValue")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,f],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(Z.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&f&&(e.operationId=o.opId(b,l,f)),i.isOAS3()){var w,x=M()(w="".concat(l,":")).call(w,f);e.server=c.selectedServer(x)||c.selectedServer();var _=c.serverVariables({server:e.server,namespace:x}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(_).length?_:E,e.requestContentType=c.requestContentType(l,f),e.responseContentType=c.responseContentType(l,f)||"*/*";var S,k=c.requestBodyValue(l,f),O=c.requestBodyInclusionSetting(l,f);if(k&&k.toJS)e.requestBody=A()(S=v()(k).call(k,(function(e){return q.Map.isMap(e)?e.get("value"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(Z.q)(e))||O.get(t)})).toJS();else e.requestBody=k}var C=B()({},e);C=o.buildRequest(C),a.setRequest(e.pathName,e.method,C);var j=function(){var t=s()(p.a.mark((function t(n){var r,o;return p.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt("return",r);case 6:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=z()();return o.execute(e).then((function(t){t.duration=z()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},Ue=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,X);return function(e){var a=e.fn.fetch,i=e.specSelectors,u=e.specActions,s=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),f=l.requestContentType,p=l.responseContentType,h=/xml/i.test(f),d=i.parameterValues([t,n],h).toJS();return u.executeRequest(o()(o()({},r),{},{fetch:a,spec:s,pathName:t,method:n,parameters:d,requestContentType:f,scheme:c,responseContentType:p}))}};function qe(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:fe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=e.length?{done:!0}:{done:!1,value:e[u++]}},e:function(e){throw e},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,f=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){f=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(f)throw c}}}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var r=n(17),o=n(42),a=r.String,i=r.TypeError;e.exports=function(e){if(o(e))return e;throw i(a(e)+" is not an object")}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(428),o=n(430),a=n(843);e.exports=function(e,t){if(null==e)return{};var n,i,u=a(e,t);if(r){var s=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(u[n]=e[n])}return u},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SELECTED_SERVER",(function(){return r})),n.d(t,"UPDATE_REQUEST_BODY_VALUE",(function(){return o})),n.d(t,"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG",(function(){return a})),n.d(t,"UPDATE_REQUEST_BODY_INCLUSION",(function(){return i})),n.d(t,"UPDATE_ACTIVE_EXAMPLES_MEMBER",(function(){return u})),n.d(t,"UPDATE_REQUEST_CONTENT_TYPE",(function(){return s})),n.d(t,"UPDATE_RESPONSE_CONTENT_TYPE",(function(){return c})),n.d(t,"UPDATE_SERVER_VARIABLE_VALUE",(function(){return l})),n.d(t,"SET_REQUEST_BODY_VALIDATE_ERROR",(function(){return f})),n.d(t,"CLEAR_REQUEST_BODY_VALIDATE_ERROR",(function(){return p})),n.d(t,"CLEAR_REQUEST_BODY_VALUE",(function(){return h})),n.d(t,"setSelectedServer",(function(){return d})),n.d(t,"setRequestBodyValue",(function(){return m})),n.d(t,"setRetainRequestBodyValueFlag",(function(){return v})),n.d(t,"setRequestBodyInclusion",(function(){return g})),n.d(t,"setActiveExamplesMember",(function(){return y})),n.d(t,"setRequestContentType",(function(){return b})),n.d(t,"setResponseContentType",(function(){return w})),n.d(t,"setServerVariableValue",(function(){return x})),n.d(t,"setRequestBodyValidateError",(function(){return _})),n.d(t,"clearRequestBodyValidateError",(function(){return E})),n.d(t,"initRequestBodyValidateError",(function(){return S})),n.d(t,"clearRequestBodyValue",(function(){return k}));var r="oas3_set_servers",o="oas3_set_request_body_value",a="oas3_set_request_body_retain_flag",i="oas3_set_request_body_inclusion",u="oas3_set_active_examples_member",s="oas3_set_request_content_type",c="oas3_set_response_content_type",l="oas3_set_server_variable_value",f="oas3_set_request_body_validate_error",p="oas3_clear_request_body_validate_error",h="oas3_clear_request_body_value";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:u,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:s,payload:{value:t,pathMethod:n}}}function w(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var _=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:f,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:p,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:p,payload:{path:t[0],method:t[1]}}},k=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){var r=n(148),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(e,t,n){e.exports=n(662)},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(34),o=n(17),a=n(41),i=function(e){return a(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){var r=n(17),o=n(111),a=r.Object;e.exports=function(e){return a(o(e))}},function(e,t,n){var r=n(17),o=n(46),a=n(335),i=n(337),u=n(50),s=n(174),c=r.TypeError,l=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p="enumerable",h="configurable",d="writable";t.f=o?i?function(e,t,n){if(u(e),t=s(t),u(n),"function"==typeof e&&"prototype"===t&&"value"in n&&d in n&&!n.writable){var r=f(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:h in n?n.configurable:r.configurable,enumerable:p in n?n.enumerable:r.enumerable,writable:!1})}return l(e,t,n)}:l:function(e,t,n){if(u(e),t=s(t),u(n),a)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";n.d(t,"b",(function(){return m})),n.d(t,"e",(function(){return v})),n.d(t,"c",(function(){return y})),n.d(t,"a",(function(){return b})),n.d(t,"d",(function(){return w}));var r=n(49),o=n.n(r),a=n(18),i=n.n(a),u=n(106),s=n.n(u),c=n(2),l=n.n(c),f=n(31),p=n.n(f),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\w]/gi,"_")};function m(e){var t=e.openapi;return!!t&&s()(t).call(t,"3")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||"object"!==i()(e))return null;var a=(e.operationId||"").replace(/\s/g,"");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,u=l()(a="".concat(t.toLowerCase(),"_")).call(a,e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return(u=u||l()(i="".concat(e.substring(1),"_")).call(i,t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return l()(n="".concat(h(t))).call(n,d(e))}function y(e,t){var n;return l()(n="".concat(h(t),"-")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||"object"!==i()(e)||!e.paths||"object"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if("PARAMETERS"!==a.toUpperCase()){var u=r[o][a];if(u&&"object"===i()(u)){var s={spec:e,pathName:o,method:a.toUpperCase(),operation:u},c=t(s);if(n&&c)return s}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function w(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var u,s=n[a];if(null!=s&&p()(u=["object","function"]).call(u,i()(s))){var c=s.parameters,f=function(e){var n,u=s[e];if(null==u||!p()(n=["object","function"]).call(n,i()(u)))return"continue";var f=v(u,a,e);if(f){r[f]?r[f].push(u):r[f]=[u];var h=r[f];if(h.length>1)h.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=l()(n="".concat(f)).call(n,t+1)}));else if(void 0!==u.operationId){var d=h[0];d.__originalOperationId=d.__originalOperationId||u.operationId,d.operationId=f}}if("parameters"!==e){var m=[],g={};for(var y in t)"produces"!==y&&"consumes"!==y&&"security"!==y||(g[y]=t[y],m.push(g));if(c&&(g.parameters=c,m.push(g)),m.length){var b,w=o()(m);try{for(w.s();!(b=w.n()).done;){var x=b.value;for(var _ in x)if(u[_]){if("parameters"===_){var E,S=o()(x[_]);try{var k=function(){var e=E.value;u[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||u[_].push(e)};for(S.s();!(E=S.n()).done;)k()}catch(e){S.e(e)}finally{S.f()}}}else u[_]=x[_]}}catch(e){w.e(e)}finally{w.f()}}}};for(var h in s)f(h)}}return t.$$normalized=!0,e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",(function(){return o})),n.d(t,"NEW_THROWN_ERR_BATCH",(function(){return a})),n.d(t,"NEW_SPEC_ERR",(function(){return i})),n.d(t,"NEW_SPEC_ERR_BATCH",(function(){return u})),n.d(t,"NEW_AUTH_ERR",(function(){return s})),n.d(t,"CLEAR",(function(){return c})),n.d(t,"CLEAR_BY",(function(){return l})),n.d(t,"newThrownErr",(function(){return f})),n.d(t,"newThrownErrBatch",(function(){return p})),n.d(t,"newSpecErr",(function(){return h})),n.d(t,"newSpecErrBatch",(function(){return d})),n.d(t,"newAuthErr",(function(){return m})),n.d(t,"clear",(function(){return v})),n.d(t,"clearBy",(function(){return g}));var r=n(140),o="err_new_thrown_err",a="err_new_thrown_err_batch",i="err_new_spec_err",u="err_new_spec_err_batch",s="err_new_auth_err",c="err_clear",l="err_clear_by";function f(e){return{type:o,payload:Object(r.serializeError)(e)}}function p(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:u,payload:e}}function m(e){return{type:s,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(173),o=n(111);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(338);e.exports=function(e){return r(e.length)}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){var r=n(132),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},i.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){e.exports=n(431)},function(e,t,n){var r=n(17),o=n(75),a=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return a(e)}},function(e,t,n){n(77);var r=n(516),o=n(17),a=n(75),i=n(85),u=n(130),s=n(37)("toStringTag");for(var c in r){var l=o[c],f=l&&l.prototype;f&&a(f)!==s&&i(f,s,c),u[c]=u.Array}},function(e,t,n){var r=n(361),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},function(e,t,n){"use strict";function r(e){return null==e}var o={isNothing:r,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:r(e)?[]:[e]},repeat:function(e,t){var n,r="";for(n=0;nu&&(t=r-u+(a=" ... ").length),n-r>u&&(n=r+u-(i=" ...").length),{str:a+e.slice(t,n).replace(/\t/g,"→")+i,pos:r-t+a.length}}function c(e,t){return o.repeat(" ",t-e.length)+e}var l=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,r=/\r?\n|\r|\0/g,a=[0],i=[],u=-1;n=r.exec(e.buffer);)i.push(n.index),a.push(n.index+n[0].length),e.position<=n.index&&u<0&&(u=a.length-2);u<0&&(u=a.length-1);var l,f,p="",h=Math.min(e.line+t.linesAfter,i.length).toString().length,d=t.maxLength-(t.indent+h+3);for(l=1;l<=t.linesBefore&&!(u-l<0);l++)f=s(e.buffer,a[u-l],i[u-l],e.position-(a[u]-a[u-l]),d),p=o.repeat(" ",t.indent)+c((e.line-l+1).toString(),h)+" | "+f.str+"\n"+p;for(f=s(e.buffer,a[u],i[u],e.position,d),p+=o.repeat(" ",t.indent)+c((e.line+1).toString(),h)+" | "+f.str+"\n",p+=o.repeat("-",t.indent+h+3+f.pos)+"^\n",l=1;l<=t.linesAfter&&!(u+l>=i.length);l++)f=s(e.buffer,a[u+l],i[u+l],e.position-(a[u]-a[u+l]),d),p+=o.repeat(" ",t.indent)+c((e.line+l+1).toString(),h)+" | "+f.str+"\n";return p.replace(/\n$/,"")},f=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],p=["scalar","sequence","mapping"];var h=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===f.indexOf(t))throw new u('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===p.indexOf(this.kind))throw new u('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function d(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,r){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=r)})),n[t]=e})),n}function m(e){return this.extend(e)}m.prototype.extend=function(e){var t=[],n=[];if(e instanceof h)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new u("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof h))throw new u("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new u("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new u("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(e){if(!(e instanceof h))throw new u("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var r=Object.create(m.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=d(r,"implicit"),r.compiledExplicit=d(r,"explicit"),r.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),A=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var O=/^[-+]?[0-9]+e/;var C=new h("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!A.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||o.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(o.isNegativeZero(e))return"-0.0";return n=e.toString(10),O.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),j=w.extend({implicit:[x,_,k,C]}),T=j,P=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),I=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var N=new h("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==P.exec(e)||null!==I.exec(e))},construct:function(e){var t,n,r,o,a,i,u,s,c=0,l=null;if(null===(t=P.exec(e))&&(t=I.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],r=+t[2]-1,o=+t[3],!t[4])return new Date(Date.UTC(n,r,o));if(a=+t[4],i=+t[5],u=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+="0";c=+c}return t[9]&&(l=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(l=-l)),s=new Date(Date.UTC(n,r,o,a,i,u,c)),l&&s.setTime(s.getTime()-l),s},instanceOf:Date,represent:function(e){return e.toISOString()}});var M=new h("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),R="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var D=new h("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,a=R;for(n=0;n64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\r\n=]/g,""),o=r.length,a=R,i=0,u=[];for(t=0;t>16&255),u.push(i>>8&255),u.push(255&i)),i=i<<6|a.indexOf(r.charAt(t));return 0===(n=o%4*6)?(u.push(i>>16&255),u.push(i>>8&255),u.push(255&i)):18===n?(u.push(i>>10&255),u.push(i>>2&255)):12===n&&u.push(i>>4&255),new Uint8Array(u)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r="",o=0,a=e.length,i=R;for(t=0;t>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]),o=(o<<8)+e[t];return 0===(n=a%3)?(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]):2===n?(r+=i[o>>10&63],r+=i[o>>4&63],r+=i[o<<2&63],r+=i[64]):1===n&&(r+=i[o>>2&63],r+=i[o<<4&63],r+=i[64],r+=i[64]),r}}),L=Object.prototype.hasOwnProperty,B=Object.prototype.toString;var F=new h("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=[],u=e;for(t=0,n=u.length;t>10),56320+(e-65536&1023))}for(var ae=new Array(256),ie=new Array(256),ue=0;ue<256;ue++)ae[ue]=re(ue)?1:0,ie[ue]=re(ue);function se(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||W,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ce(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=l(n),new u(t,n)}function le(e,t){throw ce(e,t)}function fe(e,t){e.onWarning&&e.onWarning.call(null,ce(e,t))}var pe={YAML:function(e,t,n){var r,o,a;null!==e.version&&le(e,"duplication of %YAML directive"),1!==n.length&&le(e,"YAML directive accepts exactly one argument"),null===(r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&le(e,"ill-formed argument of the YAML directive"),o=parseInt(r[1],10),a=parseInt(r[2],10),1!==o&&le(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=a<2,1!==a&&2!==a&&fe(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var r,o;2!==n.length&&le(e,"TAG directive accepts exactly two arguments"),r=n[0],o=n[1],Y.test(r)||le(e,"ill-formed tag handle (first argument) of the TAG directive"),H.call(e.tagMap,r)&&le(e,'there is a previously declared suffix for "'+r+'" tag handle'),G.test(o)||le(e,"ill-formed tag prefix (second argument) of the TAG directive");try{o=decodeURIComponent(o)}catch(t){le(e,"tag prefix is malformed: "+o)}e.tagMap[r]=o}};function he(e,t,n,r){var o,a,i,u;if(t1&&(e.result+=o.repeat("\n",t-1))}function we(e,t){var n,r,o=e.tag,a=e.anchor,i=[],u=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,le(e,"tab characters must not be used in indentation")),45===r)&&ee(e.input.charCodeAt(e.position+1));)if(u=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)i.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,Ee(e,t,3,!1,!0),i.push(e.result),ge(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)le(e,"bad indentation of a sequence entry");else if(e.lineIndentt?m=1:e.lineIndent===t?m=0:e.lineIndentt?m=1:e.lineIndent===t?m=0:e.lineIndentt)&&(g&&(i=e.line,u=e.lineStart,s=e.position),Ee(e,t,4,!0,o)&&(g?m=e.result:v=e.result),g||(me(e,p,h,d,m,v,i,u,s),d=m=v=null),ge(e,!0,-1),c=e.input.charCodeAt(e.position)),(e.line===a||e.lineIndent>t)&&0!==c)le(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===a?le(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?le(e,"repeat of an indentation width identifier"):(f=t+a-1,l=!0)}if(X(i)){do{i=e.input.charCodeAt(++e.position)}while(X(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!Z(i)&&0!==i)}for(;0!==i;){for(ve(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!l||e.lineIndentf&&(f=e.lineIndent),Z(i))p++;else{if(e.lineIndent0){for(o=i,a=0;o>0;o--)(i=ne(u=e.input.charCodeAt(++e.position)))>=0?a=(a<<4)+i:le(e,"expected hexadecimal character");e.result+=oe(a),e.position++}else le(e,"unknown escape sequence");n=r=e.position}else Z(u)?(he(e,n,r,!0),be(e,ge(e,!1,t)),n=r=e.position):e.position===e.lineStart&&ye(e)?le(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}le(e,"unexpected end of the stream within a double quoted scalar")}(e,h)?g=!0:!function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!ee(r)&&!te(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&le(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),H.call(e.anchorMap,n)||le(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var r,o,a,i,u,s,c,l,f=e.kind,p=e.result;if(ee(l=e.input.charCodeAt(e.position))||te(l)||35===l||38===l||42===l||33===l||124===l||62===l||39===l||34===l||37===l||64===l||96===l)return!1;if((63===l||45===l)&&(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r)))return!1;for(e.kind="scalar",e.result="",o=a=e.position,i=!1;0!==l;){if(58===l){if(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r))break}else if(35===l){if(ee(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&ye(e)||n&&te(l))break;if(Z(l)){if(u=e.line,s=e.lineStart,c=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){i=!0,l=e.input.charCodeAt(e.position);continue}e.position=a,e.line=u,e.lineStart=s,e.lineIndent=c;break}}i&&(he(e,o,a,!1),be(e,e.line-u),o=a=e.position,i=!1),X(l)||(a=e.position+1),l=e.input.charCodeAt(++e.position)}return he(e,o,a,!1),!!e.result||(e.kind=f,e.result=p,!1)}(e,h,1===n)&&(g=!0,null===e.tag&&(e.tag="?")):(g=!0,null===e.tag&&null===e.anchor||le(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===m&&(g=s&&we(e,d))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&le(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),c=0,l=e.implicitTypes.length;c"),null!==e.result&&p.kind!==e.kind&&le(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+p.kind+'", not "'+e.kind+'"'),p.resolve(e.result,e.tag)?(e.result=p.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):le(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||g}function Se(e){var t,n,r,o,a=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(o=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(i=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&le(e,"directive name must not be less than one character in length");0!==o;){for(;X(o);)o=e.input.charCodeAt(++e.position);if(35===o){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&!Z(o));break}if(Z(o))break;for(t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==o&&ve(e),H.call(pe,n)?pe[n](e,n,r):fe(e,'unknown document directive "'+n+'"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):i&&le(e,"directives end mark is expected"),Ee(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&J.test(e.input.slice(a,e.position))&&fe(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&ye(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position=55296&&r<=56319&&t+1=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function qe(e){return/^\n* /.test(e)}function Ve(e,t,n,r,o,a,i,u){var s,c,l=0,f=null,p=!1,h=!1,d=-1!==r,m=-1,v=Be(c=Ue(e,0))&&c!==je&&!Le(c)&&45!==c&&63!==c&&58!==c&&44!==c&&91!==c&&93!==c&&123!==c&&125!==c&&35!==c&&38!==c&&42!==c&&33!==c&&124!==c&&61!==c&&62!==c&&39!==c&&34!==c&&37!==c&&64!==c&&96!==c&&function(e){return!Le(e)&&58!==e}(Ue(e,e.length-1));if(t||i)for(s=0;s=65536?s+=2:s++){if(!Be(l=Ue(e,s)))return 5;v=v&&ze(l,f,u),f=l}else{for(s=0;s=65536?s+=2:s++){if(10===(l=Ue(e,s)))p=!0,d&&(h=h||s-m-1>r&&" "!==e[m+1],m=s);else if(!Be(l))return 5;v=v&&ze(l,f,u),f=l}h=h||d&&s-m-1>r&&" "!==e[m+1]}return p||h?n>9&&qe(e)?5:i?2===a?5:2:h?4:3:!v||i||o(e)?2===a?5:2:1}function We(e,t,n,r,o){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Pe.indexOf(t)||Ie.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),i=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),s=r||e.flowLevel>-1&&n>=e.flowLevel;switch(Ve(t,s,e.indent,i,(function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n"+He(t,e.indent)+$e(Re(function(e,t){var n,r,o=/(\n+)([^\n]*)/g,a=(u=e.indexOf("\n"),u=-1!==u?u:e.length,o.lastIndex=u,Je(e.slice(0,u),t)),i="\n"===e[0]||" "===e[0];var u;for(;r=o.exec(e);){var s=r[1],c=r[2];n=" "===c[0],a+=s+(i||n||""===c?"":"\n")+Je(c,t),i=n}return a}(t,i),a));case 5:return'"'+function(e){for(var t,n="",r=0,o=0;o=65536?o+=2:o++)r=Ue(e,o),!(t=Te[r])&&Be(r)?(n+=e[o],r>=65536&&(n+=e[o+1])):n+=t||Ne(r);return n}(t)+'"';default:throw new u("impossible error: invalid scalar style")}}()}function He(e,t){var n=qe(e)?String(t):"",r="\n"===e[e.length-1];return n+(r&&("\n"===e[e.length-2]||"\n"===e)?"+":r?"":"-")+"\n"}function $e(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Je(e,t){if(""===e||" "===e[0])return e;for(var n,r,o=/ [^ ]/g,a=0,i=0,u=0,s="";n=o.exec(e);)(u=n.index)-a>t&&(r=i>a?i:u,s+="\n"+e.slice(a,r),a=r+1),i=u;return s+="\n",e.length-a>t&&i>a?s+=e.slice(a,i)+"\n"+e.slice(i+1):s+=e.slice(a),s.slice(1)}function Ke(e,t,n,r){var o,a,i,u="",s=e.tag;for(o=0,a=n.length;o tag resolver accepts not "'+c+'" style');r=s.represent[c](t,c)}e.dump=r}return!0}return!1}function Ge(e,t,n,r,o,a,i){e.tag=null,e.dump=n,Ye(e,n,!1)||Ye(e,n,!0);var s,c=Oe.call(e.dump),l=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var f,p,h="[object Object]"===c||"[object Array]"===c;if(h&&(p=-1!==(f=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||p||2!==e.indent&&t>0)&&(o=!1),p&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(h&&p&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),"[object Object]"===c)r&&0!==Object.keys(e.dump).length?(!function(e,t,n,r){var o,a,i,s,c,l,f="",p=e.tag,h=Object.keys(n);if(!0===e.sortKeys)h.sort();else if("function"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new u("sortKeys must be a boolean or a function");for(o=0,a=h.length;o1024)&&(e.dump&&10===e.dump.charCodeAt(0)?l+="?":l+="? "),l+=e.dump,c&&(l+=De(e,t)),Ge(e,t+1,s,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=":":l+=": ",f+=l+=e.dump));e.tag=p,e.dump=f||"{}"}(e,t,e.dump,o),p&&(e.dump="&ref_"+f+e.dump)):(!function(e,t,n){var r,o,a,i,u,s="",c=e.tag,l=Object.keys(n);for(r=0,o=l.length;r1024&&(u+="? "),u+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ge(e,t,i,!1,!1)&&(s+=u+=e.dump));e.tag=c,e.dump="{"+s+"}"}(e,t,e.dump),p&&(e.dump="&ref_"+f+" "+e.dump));else if("[object Array]"===c)r&&0!==e.dump.length?(e.noArrayIndent&&!i&&t>0?Ke(e,t-1,e.dump,o):Ke(e,t,e.dump,o),p&&(e.dump="&ref_"+f+e.dump)):(!function(e,t,n){var r,o,a,i="",u=e.tag;for(r=0,o=n.length;r",e.dump=s+" "+e.dump)}return!0}function Qe(e,t){var n,r,o=[],a=[];for(Ze(e,o,a),n=0,r=a.length;n=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var d=a.Arguments=a.Array;if(o("keys"),o("values"),o("entries"),!c&&l&&"values"!==d.name)try{u(d,"name",{value:"values"})}catch(e){}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){e.exports=n(634)},function(e,t,n){"use strict";var r=n(978),o=n(979);function a(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){o.isString(e)&&(e=b(e));return e instanceof a?e.format():a.prototype.format.call(e)},t.Url=a;var i=/^([a-z0-9.+-]+:)/i,u=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(c),f=["%","/","?",";","#"].concat(l),p=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},v={javascript:!0,"javascript:":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(980);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var a=e.indexOf("?"),u=-1!==a&&a127?N+="x":N+=I[M];if(!N.match(h)){var D=T.slice(0,O),L=T.slice(O+1),B=I.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b="/"+L.join(".")+b),this.hostname=D.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?":"+this.port:"",z=this.hostname||"";this.host=z+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!m[_])for(O=0,P=l.length;O0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var k=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&("."===k||".."===k)||""===k,O=0,C=E.length;C>=0;C--)"."===(k=E[C])?E.splice(C,1):".."===k?(E.splice(C,1),O++):O&&(E.splice(C,1),O--);if(!x&&!_)for(;O--;O)E.unshift("..");!x||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),A&&"/"!==E.join("/").substr(-1)&&E.push("");var j,T=""===E[0]||E[0]&&"/"===E[0].charAt(0);S&&(n.hostname=n.host=T?"":E.length?E.shift():"",(j=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(x=x||n.host&&E.length)&&!T&&E.unshift(""),E.length?n.pathname=E.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=u.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",(function(){return h})),n.d(t,"AUTHORIZE",(function(){return d})),n.d(t,"LOGOUT",(function(){return m})),n.d(t,"PRE_AUTHORIZE_OAUTH2",(function(){return v})),n.d(t,"AUTHORIZE_OAUTH2",(function(){return g})),n.d(t,"VALIDATE",(function(){return y})),n.d(t,"CONFIGURE_AUTH",(function(){return b})),n.d(t,"RESTORE_AUTHORIZATION",(function(){return w})),n.d(t,"showDefinitions",(function(){return x})),n.d(t,"authorize",(function(){return _})),n.d(t,"authorizeWithPersistOption",(function(){return E})),n.d(t,"logout",(function(){return S})),n.d(t,"logoutWithPersistOption",(function(){return k})),n.d(t,"preAuthorizeImplicit",(function(){return A})),n.d(t,"authorizeOauth2",(function(){return O})),n.d(t,"authorizeOauth2WithPersistOption",(function(){return C})),n.d(t,"authorizePassword",(function(){return j})),n.d(t,"authorizeApplication",(function(){return T})),n.d(t,"authorizeAccessCodeWithFormParams",(function(){return P})),n.d(t,"authorizeAccessCodeWithBasicAuthentication",(function(){return I})),n.d(t,"authorizeRequest",(function(){return N})),n.d(t,"configureAuth",(function(){return M})),n.d(t,"restoreAuthorization",(function(){return R})),n.d(t,"persistAuthorizationIfNeeded",(function(){return D}));var r=n(18),o=n.n(r),a=n(33),i=n.n(a),u=n(23),s=n.n(u),c=n(88),l=n.n(c),f=n(27),p=n(5),h="show_popup",d="authorize",m="logout",v="pre_authorize_oauth2",g="authorize_oauth2",y="validate",b="configure_auth",w="restore_authorization";function x(e){return{type:h,payload:e}}function _(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var k=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,u=e.isValid,s=o.schema,c=o.name,l=s.get("flow");delete f.a.swaggerUIRedirectOauth2,"accessCode"===l||u||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),a.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function O(e){return{type:g,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,u=e.passwordType,c=e.clientId,l=e.clientSecret,f={grant_type:"password",scope:e.scopes.join(" "),username:a,password:i},h={};switch(u){case"request-body":!function(e,t,n){t&&s()(e,{client_id:t});n&&s()(e,{client_secret:n})}(f,c,l);break;case"basic":h.Authorization="Basic "+Object(p.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(u," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(p.b)(f),url:r.get("tokenUrl"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,u=e.clientSecret,s={Authorization:"Basic "+Object(p.a)(i+":"+u)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(p.b)(c),name:a,url:r.get("tokenUrl"),auth:e,headers:s})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,u=t.clientSecret,s=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:i,client_secret:u,redirect_uri:n,code_verifier:s};return r.authorizeRequest({body:Object(p.b)(c),name:a,url:o.get("tokenUrl"),auth:t})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,u=t.clientSecret,s=t.codeVerifier,c={Authorization:"Basic "+Object(p.a)(i+":"+u)},l={grant_type:"authorization_code",code:t.code,client_id:i,redirect_uri:n,code_verifier:s};return r.authorizeRequest({body:Object(p.b)(l),name:a,url:o.get("tokenUrl"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,u=t.authActions,c=t.errActions,f=t.oas3Selectors,p=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,w=e.url,x=e.auth,_=(h.getConfigs()||{}).additionalQueryStringParams;if(p.isOAS3()){var E=f.serverEffectiveValue(f.selectedServer());n=l()(w,E,!0)}else n=l()(w,p.url(),!0);"object"===o()(_)&&(n.query=s()({},n.query,_));var S=n.toString(),k=s()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:S,method:"post",headers:k,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:i()(t)}):u.authorizeOauth2WithPersistOption({auth:x,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:w,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem("authorized",i()(n.toJS()))}}}},function(e,t,n){var r=n(950);e.exports=function(e){for(var t=1;tS;S++)if((h||S in x)&&(b=_(y=x[S],S,w),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:c(A,y)}else switch(e){case 4:return!1;case 7:c(A,y)}return f?-1:o||l?l:A}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterReject:l(7)}},function(e,t,n){"use strict";n.r(t),n.d(t,"lastError",(function(){return M})),n.d(t,"url",(function(){return R})),n.d(t,"specStr",(function(){return D})),n.d(t,"specSource",(function(){return L})),n.d(t,"specJson",(function(){return B})),n.d(t,"specResolved",(function(){return F})),n.d(t,"specResolvedSubtree",(function(){return z})),n.d(t,"specJsonWithResolvedSubtrees",(function(){return q})),n.d(t,"spec",(function(){return V})),n.d(t,"isOAS3",(function(){return W})),n.d(t,"info",(function(){return H})),n.d(t,"externalDocs",(function(){return $})),n.d(t,"version",(function(){return J})),n.d(t,"semver",(function(){return K})),n.d(t,"paths",(function(){return Y})),n.d(t,"operations",(function(){return G})),n.d(t,"consumes",(function(){return Q})),n.d(t,"produces",(function(){return Z})),n.d(t,"security",(function(){return X})),n.d(t,"securityDefinitions",(function(){return ee})),n.d(t,"findDefinition",(function(){return te})),n.d(t,"definitions",(function(){return ne})),n.d(t,"basePath",(function(){return re})),n.d(t,"host",(function(){return oe})),n.d(t,"schemes",(function(){return ae})),n.d(t,"operationsWithRootInherited",(function(){return ie})),n.d(t,"tags",(function(){return ue})),n.d(t,"tagDetails",(function(){return se})),n.d(t,"operationsWithTags",(function(){return ce})),n.d(t,"taggedOperations",(function(){return le})),n.d(t,"responses",(function(){return fe})),n.d(t,"requests",(function(){return pe})),n.d(t,"mutatedRequests",(function(){return he})),n.d(t,"responseFor",(function(){return de})),n.d(t,"requestFor",(function(){return me})),n.d(t,"mutatedRequestFor",(function(){return ve})),n.d(t,"allowTryItOutFor",(function(){return ge})),n.d(t,"parameterWithMetaByIdentity",(function(){return ye})),n.d(t,"parameterInclusionSettingFor",(function(){return be})),n.d(t,"parameterWithMeta",(function(){return we})),n.d(t,"operationWithMeta",(function(){return xe})),n.d(t,"getParameter",(function(){return _e})),n.d(t,"hasHost",(function(){return Ee})),n.d(t,"parameterValues",(function(){return Se})),n.d(t,"parametersIncludeIn",(function(){return ke})),n.d(t,"parametersIncludeType",(function(){return Ae})),n.d(t,"contentTypeValues",(function(){return Oe})),n.d(t,"currentProducesFor",(function(){return Ce})),n.d(t,"producesOptionsFor",(function(){return je})),n.d(t,"consumesOptionsFor",(function(){return Te})),n.d(t,"operationScheme",(function(){return Pe})),n.d(t,"canExecuteScheme",(function(){return Ie})),n.d(t,"validateBeforeExecute",(function(){return Ne})),n.d(t,"getOAS3RequiredRequestBodyContentType",(function(){return Me})),n.d(t,"isMediaTypeSchemaPropertiesEqual",(function(){return Re}));var r=n(13),o=n.n(r),a=n(14),i=n.n(a),u=n(2),s=n.n(u),c=n(20),l=n.n(c),f=n(22),p=n.n(f),h=n(19),d=n.n(h),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(55),w=n.n(b),x=n(30),_=n.n(x),E=n(205),S=n.n(E),k=n(72),A=n.n(k),O=n(24),C=n.n(O),j=n(16),T=n(5),P=n(1),I=["get","put","post","delete","options","head","patch","trace"],N=function(e){return e||Object(P.Map)()},M=Object(j.a)(N,(function(e){return e.get("lastError")})),R=Object(j.a)(N,(function(e){return e.get("url")})),D=Object(j.a)(N,(function(e){return e.get("spec")||""})),L=Object(j.a)(N,(function(e){return e.get("specSource")||"not-editor"})),B=Object(j.a)(N,(function(e){return e.get("json",Object(P.Map)())})),F=Object(j.a)(N,(function(e){return e.get("resolved",Object(P.Map)())})),z=function(e,t){var n;return e.getIn(s()(n=["resolvedSubtrees"]).call(n,i()(t)),void 0)},U=function e(t,n){return P.Map.isMap(t)&&P.Map.isMap(n)?n.get("$$ref")?n:Object(P.OrderedMap)().mergeWith(e,t,n):n},q=Object(j.a)(N,(function(e){return Object(P.OrderedMap)().mergeWith(U,e.get("json"),e.get("resolvedSubtrees"))})),V=function(e){return B(e)},W=Object(j.a)(V,(function(){return!1})),H=Object(j.a)(V,(function(e){return De(e&&e.get("info"))})),$=Object(j.a)(V,(function(e){return De(e&&e.get("externalDocs"))})),J=Object(j.a)(H,(function(e){return e&&e.get("version")})),K=Object(j.a)(J,(function(e){var t;return l()(t=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e)).call(t,1)})),Y=Object(j.a)(q,(function(e){return e.get("paths")})),G=Object(j.a)(Y,(function(e){if(!e||e.size<1)return Object(P.List)();var t=Object(P.List)();return e&&p()(e)?(p()(e).call(e,(function(e,n){if(!e||!p()(e))return{};p()(e).call(e,(function(e,r){var o;d()(I).call(I,r)<0||(t=t.push(Object(P.fromJS)({path:n,method:r,operation:e,id:s()(o="".concat(r,"-")).call(o,n)})))}))})),t):Object(P.List)()})),Q=Object(j.a)(V,(function(e){return Object(P.Set)(e.get("consumes"))})),Z=Object(j.a)(V,(function(e){return Object(P.Set)(e.get("produces"))})),X=Object(j.a)(V,(function(e){return e.get("security",Object(P.List)())})),ee=Object(j.a)(V,(function(e){return e.get("securityDefinitions")})),te=function(e,t){var n=e.getIn(["resolvedSubtrees","definitions",t],null),r=e.getIn(["json","definitions",t],null);return n||r||null},ne=Object(j.a)(V,(function(e){var t=e.get("definitions");return P.Map.isMap(t)?t:Object(P.Map)()})),re=Object(j.a)(V,(function(e){return e.get("basePath")})),oe=Object(j.a)(V,(function(e){return e.get("host")})),ae=Object(j.a)(V,(function(e){return e.get("schemes",Object(P.Map)())})),ie=Object(j.a)(G,Q,Z,(function(e,t,n){return v()(e).call(e,(function(e){return e.update("operation",(function(e){if(e){if(!P.Map.isMap(e))return;return e.withMutations((function(e){return e.get("consumes")||e.update("consumes",(function(e){return Object(P.Set)(e).merge(t)})),e.get("produces")||e.update("produces",(function(e){return Object(P.Set)(e).merge(n)})),e}))}return Object(P.Map)()}))}))})),ue=Object(j.a)(V,(function(e){var t=e.get("tags",Object(P.List)());return P.List.isList(t)?y()(t).call(t,(function(e){return P.Map.isMap(e)})):Object(P.List)()})),se=function(e,t){var n,r=ue(e)||Object(P.List)();return w()(n=y()(r).call(r,P.Map.isMap)).call(n,(function(e){return e.get("name")===t}),Object(P.Map)())},ce=Object(j.a)(ie,ue,(function(e,t){return _()(e).call(e,(function(e,t){var n=Object(P.Set)(t.getIn(["operation","tags"]));return n.count()<1?e.update("default",Object(P.List)(),(function(e){return e.push(t)})):_()(n).call(n,(function(e,n){return e.update(n,Object(P.List)(),(function(e){return e.push(t)}))}),e)}),_()(t).call(t,(function(e,t){return e.set(t.get("name"),Object(P.List)())}),Object(P.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),o=r.tagsSorter,a=r.operationsSorter;return v()(n=ce(e).sortBy((function(e,t){return t}),(function(e,t){var n="function"==typeof o?o:T.H.tagsSorter[o];return n?n(e,t):null}))).call(n,(function(t,n){var r="function"==typeof a?a:T.H.operationsSorter[a],o=r?S()(t).call(t,r):t;return Object(P.Map)({tagDetails:se(e,n),operations:o})}))}},fe=Object(j.a)(N,(function(e){return e.get("responses",Object(P.Map)())})),pe=Object(j.a)(N,(function(e){return e.get("requests",Object(P.Map)())})),he=Object(j.a)(N,(function(e){return e.get("mutatedRequests",Object(P.Map)())})),de=function(e,t,n){return fe(e).getIn([t,n],null)},me=function(e,t,n){return pe(e).getIn([t,n],null)},ve=function(e,t,n){return he(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,o,a=q(e).getIn(s()(r=["paths"]).call(r,i()(t),["parameters"]),Object(P.OrderedMap)()),u=e.getIn(s()(o=["meta","paths"]).call(o,i()(t),["parameters"]),Object(P.OrderedMap)()),c=v()(a).call(a,(function(e){var t,r,o,a=u.get(s()(t="".concat(n.get("in"),".")).call(t,n.get("name"))),i=u.get(s()(r=s()(o="".concat(n.get("in"),".")).call(o,n.get("name"),".hash-")).call(r,n.hashCode()));return Object(P.OrderedMap)().merge(e,a,i)}));return w()(c).call(c,(function(e){return e.get("in")===n.get("in")&&e.get("name")===n.get("name")}),Object(P.OrderedMap)())},be=function(e,t,n,r){var o,a,u=s()(o="".concat(r,".")).call(o,n);return e.getIn(s()(a=["meta","paths"]).call(a,i()(t),["parameter_inclusions",u]),!1)},we=function(e,t,n,r){var o,a=q(e).getIn(s()(o=["paths"]).call(o,i()(t),["parameters"]),Object(P.OrderedMap)()),u=w()(a).call(a,(function(e){return e.get("in")===r&&e.get("name")===n}),Object(P.OrderedMap)());return ye(e,t,u)},xe=function(e,t,n){var r,o=q(e).getIn(["paths",t,n],Object(P.OrderedMap)()),a=e.getIn(["meta","paths",t,n],Object(P.OrderedMap)()),i=v()(r=o.get("parameters",Object(P.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(P.OrderedMap)().merge(o,a).set("parameters",i)};function _e(e,t,n,r){var o;t=t||[];var a=e.getIn(s()(o=["meta","paths"]).call(o,i()(t),["parameters"]),Object(P.fromJS)([]));return w()(a).call(a,(function(e){return P.Map.isMap(e)&&e.get("name")===n&&e.get("in")===r}))||Object(P.Map)()}var Ee=Object(j.a)(V,(function(e){var t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=xe.apply(void 0,s()(r=[e]).call(r,i()(t))).get("parameters",Object(P.List)());return _()(o).call(o,(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(P.fromJS)({}))}function ke(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(P.List.isList(e))return A()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get("in")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(P.List.isList(e))return A()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get("type")===t}))}function Oe(e,t){var n,r;t=t||[];var o=q(e).getIn(s()(n=["paths"]).call(n,i()(t)),Object(P.fromJS)({})),a=e.getIn(s()(r=["meta","paths"]).call(r,i()(t)),Object(P.fromJS)({})),u=Ce(e,t),c=o.get("parameters")||new P.List,l=a.get("consumes_value")?a.get("consumes_value"):Ae(c,"file")?"multipart/form-data":Ae(c,"formData")?"application/x-www-form-urlencoded":void 0;return Object(P.fromJS)({requestContentType:l,responseContentType:u})}function Ce(e,t){var n,r;t=t||[];var o=q(e).getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(s()(r=["meta","paths"]).call(r,i()(t),["produces_value"]),null),u=o.getIn(["produces",0],null);return a||u||"application/json"}}function je(e,t){var n;t=t||[];var r=q(e),a=r.getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var u=t,c=o()(u,1)[0],l=a.get("produces",null),f=r.getIn(["paths",c,"produces"],null),p=r.getIn(["produces"],null);return l||f||p}}function Te(e,t){var n;t=t||[];var r=q(e),a=r.getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var u=t,c=o()(u,1)[0],l=a.get("consumes",null),f=r.getIn(["paths",c,"consumes"],null),p=r.getIn(["consumes"],null);return l||f||p}}var Pe=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=C()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||o||""},Ie=function(e,t,n){var r;return d()(r=["http","https"]).call(r,Pe(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(s()(n=["meta","paths"]).call(n,i()(t),["parameters"]),Object(P.fromJS)([])),o=!0;return p()(r).call(r,(function(e){var t=e.get("errors");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(s()(n=["resolvedSubtrees","paths"]).call(n,i()(t),["requestBody"]),Object(P.fromJS)([]));return a.size<1||(a.getIn(["required"])&&(o.requestBody=a.getIn(["required"])),p()(r=a.getIn(["content"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn(["schema","required"])){var n=e[1].getIn(["schema","required"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(s()(o=["resolvedSubtrees","paths"]).call(o,i()(t),["requestBody","content"]),Object(P.fromJS)([]));if(a.size<2||!n||!r)return!1;var u=a.getIn([n,"schema","properties"],Object(P.fromJS)([])),c=a.getIn([r,"schema","properties"],Object(P.fromJS)([]));return!!u.equals(c)};function De(e){return P.Map.isMap(e)?e:new P.Map}},function(e,t,n){"use strict";(function(t){var r=n(872),o=n(873),a=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,i=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,u=/^[a-zA-Z]:/,s=new RegExp("^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]+");function c(e){return(e||"").toString().replace(s,"")}var l=[["#","hash"],["?","query"],function(e,t){return h(t.protocol)?e.replace(/\\/g,"/"):e},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],f={hash:1,query:1};function p(e){var n,r=("undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if("blob:"===e.protocol)o=new m(unescape(e.pathname),{});else if("string"===i)for(n in o=new m(e,{}),f)delete o[n];else if("object"===i){for(n in e)n in f||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function h(e){return"file:"===e||"ftp:"===e||"http:"===e||"https:"===e||"ws:"===e||"wss:"===e}function d(e,t){e=c(e),t=t||{};var n,r=i.exec(e),o=r[1]?r[1].toLowerCase():"",a=!!r[2],u=!!r[3],s=0;return a?u?(n=r[2]+r[3]+r[4],s=r[2].length+r[3].length):(n=r[2]+r[4],s=r[2].length):u?(n=r[3]+r[4],s=r[3].length):n=r[4],"file:"===o?s>=2&&(n=n.slice(2)):h(o)?n=r[4]:o?a&&(n=n.slice(2)):s>=2&&h(t.protocol)&&(n=r[4]),{protocol:o,slashes:a||h(o),slashesCount:s,rest:n}}function m(e,t,n){if(e=c(e),!(this instanceof m))return new m(e,t,n);var a,i,s,f,v,g,y=l.slice(),b=typeof t,w=this,x=0;for("object"!==b&&"string"!==b&&(n=t,t=null),n&&"function"!=typeof n&&(n=o.parse),a=!(i=d(e||"",t=p(t))).protocol&&!i.slashes,w.slashes=i.slashes||a&&t.slashes,w.protocol=i.protocol||t.protocol||"",e=i.rest,("file:"===i.protocol&&(2!==i.slashesCount||u.test(e))||!i.slashes&&(i.protocol||i.slashesCount<2||!h(w.protocol)))&&(y[3]=[/(.*)/,"pathname"]);x=4?[t[0],t[1],t[2],t[3],"".concat(t[0],".").concat(t[1]),"".concat(t[0],".").concat(t[2]),"".concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[0]),"".concat(t[1],".").concat(t[2]),"".concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[1]),"".concat(t[2],".").concat(t[3]),"".concat(t[3],".").concat(t[0]),"".concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[0]),"".concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[1],".").concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[2],".").concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[3],".").concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[2],".").concat(t[1],".").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return"token"!==e})),o=y(r);return o.reduce((function(e,t){return p()({},e,n[t])}),t)}function w(e){return e.join(" ")}function x(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,u=t.properties,s=t.type,c=t.tagName,l=t.value;if("text"===s)return l;if(c){var f,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return x({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(".").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=u.className&&u.className.includes("token")?["token"]:[],y=u.className&&g.concat(u.className.filter((function(e){return!m.includes(e)})));f=p()({},u,{className:w(y)||void 0,style:b(u.className,Object.assign({},u.style,o),n)})}else f=p()({},u,{className:w(u.className)});var _=h(t.children);return d.a.createElement(c,v()({key:i},f),_)}}var _=/\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,i=void 0===a?{}:a,u=e.startingLineNumber;return d.a.createElement("code",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(o):r},"".concat(o,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:u}))}function S(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function k(e,t,n){var r,o={display:"inline-block",minWidth:(r=n,"".concat(r.toString().length,".25em")),paddingRight:"1em",textAlign:"right",userSelect:"none"},a="function"==typeof e?e(t):e;return p()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,u=void 0===i?{}:i,s=e.className,c=void 0===s?[]:s,l=e.showLineNumbers,f=e.wrapLongLines,h="function"==typeof u?u(n):u;if(h.className=c,n&&a){var d=k(r,n,o);t.unshift(S(n,d))}return f&l&&(h.style=p()({},h.style,{display:"flex"})),{type:"element",tagName:"span",properties:h,children:t}}function O(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:u,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:s})}function m(e,t){if(r&&t&&o){var n=k(u,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(_)){var n=t.split("\n");n.forEach((function(t,o){var i=r&&f.length+a,u={type:"text",value:"".concat(t,"\n")};if(0===o){var s=v(l.slice(p+1,h).concat(A({children:[u],className:e.properties.className})),i);f.push(s)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([u],i,e.properties.className);f.push(d)}}else{var m=v([u],i,e.properties.className);f.push(m)}})),p=h}h++};h .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},X=o()(Z),ee=function(e){return i()(X).call(X,e)?Z[e]:(console.warn("Request style '".concat(e,"' is not available, returning default instead")),Q)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.File=t.Blob=t.FormData=void 0;const r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window;t.FormData=r.FormData,t.Blob=r.Blob,t.File=r.File},function(e,t,n){var r=n(148),o=Function.prototype,a=o.apply,i=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?i.bind(a):function(){return i.apply(a,arguments)})},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(57);e.exports=r("navigator","userAgent")||""},function(e,t){},function(e,t,n){var r,o=n(50),a=n(178),i=n(228),u=n(153),s=n(341),c=n(223),l=n(179),f=l("IE_PROTO"),p=function(){},h=function(e){return"