// Copyright 2024 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.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.33.0
// 	protoc        v4.25.3
// source: google/maps/places/v1/places_service.proto

package placespb

import (
	context "context"
	reflect "reflect"
	sync "sync"

	_ "google.golang.org/genproto/googleapis/api/annotations"
	viewport "google.golang.org/genproto/googleapis/geo/type/viewport"
	latlng "google.golang.org/genproto/googleapis/type/latlng"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

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)
)

// How results will be ranked in the response.
type SearchNearbyRequest_RankPreference int32

const (
	// RankPreference value not set. Will use rank by POPULARITY by default.
	SearchNearbyRequest_RANK_PREFERENCE_UNSPECIFIED SearchNearbyRequest_RankPreference = 0
	// Ranks results by distance.
	SearchNearbyRequest_DISTANCE SearchNearbyRequest_RankPreference = 1
	// Ranks results by popularity.
	SearchNearbyRequest_POPULARITY SearchNearbyRequest_RankPreference = 2
)

// Enum value maps for SearchNearbyRequest_RankPreference.
var (
	SearchNearbyRequest_RankPreference_name = map[int32]string{
		0: "RANK_PREFERENCE_UNSPECIFIED",
		1: "DISTANCE",
		2: "POPULARITY",
	}
	SearchNearbyRequest_RankPreference_value = map[string]int32{
		"RANK_PREFERENCE_UNSPECIFIED": 0,
		"DISTANCE":                    1,
		"POPULARITY":                  2,
	}
)

func (x SearchNearbyRequest_RankPreference) Enum() *SearchNearbyRequest_RankPreference {
	p := new(SearchNearbyRequest_RankPreference)
	*p = x
	return p
}

func (x SearchNearbyRequest_RankPreference) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SearchNearbyRequest_RankPreference) Descriptor() protoreflect.EnumDescriptor {
	return file_google_maps_places_v1_places_service_proto_enumTypes[0].Descriptor()
}

func (SearchNearbyRequest_RankPreference) Type() protoreflect.EnumType {
	return &file_google_maps_places_v1_places_service_proto_enumTypes[0]
}

func (x SearchNearbyRequest_RankPreference) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SearchNearbyRequest_RankPreference.Descriptor instead.
func (SearchNearbyRequest_RankPreference) EnumDescriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{0, 0}
}

// How results will be ranked in the response.
type SearchTextRequest_RankPreference int32

const (
	// For a categorical query such as "Restaurants in New York City", RELEVANCE
	// is the default. For non-categorical queries such as "Mountain View, CA"
	// we recommend that you leave rankPreference unset.
	SearchTextRequest_RANK_PREFERENCE_UNSPECIFIED SearchTextRequest_RankPreference = 0
	// Ranks results by distance.
	SearchTextRequest_DISTANCE SearchTextRequest_RankPreference = 1
	// Ranks results by relevance. Sort order determined by normal ranking
	// stack.
	SearchTextRequest_RELEVANCE SearchTextRequest_RankPreference = 2
)

// Enum value maps for SearchTextRequest_RankPreference.
var (
	SearchTextRequest_RankPreference_name = map[int32]string{
		0: "RANK_PREFERENCE_UNSPECIFIED",
		1: "DISTANCE",
		2: "RELEVANCE",
	}
	SearchTextRequest_RankPreference_value = map[string]int32{
		"RANK_PREFERENCE_UNSPECIFIED": 0,
		"DISTANCE":                    1,
		"RELEVANCE":                   2,
	}
)

func (x SearchTextRequest_RankPreference) Enum() *SearchTextRequest_RankPreference {
	p := new(SearchTextRequest_RankPreference)
	*p = x
	return p
}

func (x SearchTextRequest_RankPreference) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SearchTextRequest_RankPreference) Descriptor() protoreflect.EnumDescriptor {
	return file_google_maps_places_v1_places_service_proto_enumTypes[1].Descriptor()
}

func (SearchTextRequest_RankPreference) Type() protoreflect.EnumType {
	return &file_google_maps_places_v1_places_service_proto_enumTypes[1]
}

func (x SearchTextRequest_RankPreference) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SearchTextRequest_RankPreference.Descriptor instead.
func (SearchTextRequest_RankPreference) EnumDescriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{2, 0}
}

// Request proto for Search Nearby.
type SearchNearbyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Place details will be displayed with the preferred language if available.
	// If the language code is unspecified or unrecognized, place details of any
	// language may be returned, with a preference for English if such details
	// exist.
	//
	// Current list of supported languages:
	// https://developers.google.com/maps/faq#languagesupport.
	LanguageCode string `protobuf:"bytes,1,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// The Unicode country/region code (CLDR) of the location where the
	// request is coming from. This parameter is used to display the place
	// details, like region-specific place name, if available. The parameter can
	// affect results based on applicable law.
	//
	// For more information, see
	// https://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html.
	//
	// Note that 3-digit region codes are not currently supported.
	RegionCode string `protobuf:"bytes,2,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Included Place type (eg, "restaurant" or "gas_station") from
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	//
	// Up to 50 types from [Table
	// A](https://developers.google.com/maps/documentation/places/web-service/place-types#table-a)
	// may be specified.
	//
	// If there are any conflicting types, i.e. a type appears in both
	// included_types and excluded_types, an INVALID_ARGUMENT error is
	// returned.
	//
	// If a Place type is specified with multiple type restrictions, only places
	// that satisfy all of the restrictions are returned. For example, if we
	// have {included_types = ["restaurant"], excluded_primary_types =
	// ["restaurant"]}, the returned places provide "restaurant"
	// related services but do not operate primarily as "restaurants".
	IncludedTypes []string `protobuf:"bytes,3,rep,name=included_types,json=includedTypes,proto3" json:"included_types,omitempty"`
	// Excluded Place type (eg, "restaurant" or "gas_station") from
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	//
	// Up to 50 types from [Table
	// A](https://developers.google.com/maps/documentation/places/web-service/place-types#table-a)
	// may be specified.
	//
	// If the client provides both included_types (e.g. restaurant) and
	// excluded_types (e.g. cafe), then the response should include places that
	// are restaurant but not cafe. The response includes places that match at
	// least one of the included_types and none of the excluded_types.
	//
	// If there are any conflicting types, i.e. a type appears in both
	// included_types and excluded_types, an INVALID_ARGUMENT error is returned.
	//
	// If a Place type is specified with multiple type restrictions, only places
	// that satisfy all of the restrictions are returned. For example, if we
	// have {included_types = ["restaurant"], excluded_primary_types =
	// ["restaurant"]}, the returned places provide "restaurant"
	// related services but do not operate primarily as "restaurants".
	ExcludedTypes []string `protobuf:"bytes,4,rep,name=excluded_types,json=excludedTypes,proto3" json:"excluded_types,omitempty"`
	// Included primary Place type (e.g. "restaurant" or "gas_station") from
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	// A place can only have a single primary type from the supported types table
	// associated with it.
	//
	// Up to 50 types from [Table
	// A](https://developers.google.com/maps/documentation/places/web-service/place-types#table-a)
	// may be specified.
	//
	// If there are any conflicting primary types, i.e. a type appears in both
	// included_primary_types and excluded_primary_types, an INVALID_ARGUMENT
	// error is returned.
	//
	// If a Place type is specified with multiple type restrictions, only places
	// that satisfy all of the restrictions are returned. For example, if we
	// have {included_types = ["restaurant"], excluded_primary_types =
	// ["restaurant"]}, the returned places provide "restaurant"
	// related services but do not operate primarily as "restaurants".
	IncludedPrimaryTypes []string `protobuf:"bytes,5,rep,name=included_primary_types,json=includedPrimaryTypes,proto3" json:"included_primary_types,omitempty"`
	// Excluded primary Place type (e.g. "restaurant" or "gas_station") from
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	//
	// Up to 50 types from [Table
	// A](https://developers.google.com/maps/documentation/places/web-service/place-types#table-a)
	// may be specified.
	//
	// If there are any conflicting primary types, i.e. a type appears in both
	// included_primary_types and excluded_primary_types, an INVALID_ARGUMENT
	// error is returned.
	//
	// If a Place type is specified with multiple type restrictions, only places
	// that satisfy all of the restrictions are returned. For example, if we
	// have {included_types = ["restaurant"], excluded_primary_types =
	// ["restaurant"]}, the returned places provide "restaurant"
	// related services but do not operate primarily as "restaurants".
	ExcludedPrimaryTypes []string `protobuf:"bytes,6,rep,name=excluded_primary_types,json=excludedPrimaryTypes,proto3" json:"excluded_primary_types,omitempty"`
	// Maximum number of results to return. It must be between 1 and 20 (default),
	// inclusively. If the number is unset, it falls back to the upper limit. If
	// the number is set to negative or exceeds the upper limit, an
	// INVALID_ARGUMENT error is returned.
	MaxResultCount int32 `protobuf:"varint,7,opt,name=max_result_count,json=maxResultCount,proto3" json:"max_result_count,omitempty"`
	// Required. The region to search.
	LocationRestriction *SearchNearbyRequest_LocationRestriction `protobuf:"bytes,8,opt,name=location_restriction,json=locationRestriction,proto3" json:"location_restriction,omitempty"`
	// How results will be ranked in the response.
	RankPreference SearchNearbyRequest_RankPreference `protobuf:"varint,9,opt,name=rank_preference,json=rankPreference,proto3,enum=google.maps.places.v1.SearchNearbyRequest_RankPreference" json:"rank_preference,omitempty"`
}

func (x *SearchNearbyRequest) Reset() {
	*x = SearchNearbyRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchNearbyRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchNearbyRequest) ProtoMessage() {}

func (x *SearchNearbyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchNearbyRequest.ProtoReflect.Descriptor instead.
func (*SearchNearbyRequest) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{0}
}

func (x *SearchNearbyRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

func (x *SearchNearbyRequest) GetRegionCode() string {
	if x != nil {
		return x.RegionCode
	}
	return ""
}

func (x *SearchNearbyRequest) GetIncludedTypes() []string {
	if x != nil {
		return x.IncludedTypes
	}
	return nil
}

func (x *SearchNearbyRequest) GetExcludedTypes() []string {
	if x != nil {
		return x.ExcludedTypes
	}
	return nil
}

func (x *SearchNearbyRequest) GetIncludedPrimaryTypes() []string {
	if x != nil {
		return x.IncludedPrimaryTypes
	}
	return nil
}

func (x *SearchNearbyRequest) GetExcludedPrimaryTypes() []string {
	if x != nil {
		return x.ExcludedPrimaryTypes
	}
	return nil
}

func (x *SearchNearbyRequest) GetMaxResultCount() int32 {
	if x != nil {
		return x.MaxResultCount
	}
	return 0
}

func (x *SearchNearbyRequest) GetLocationRestriction() *SearchNearbyRequest_LocationRestriction {
	if x != nil {
		return x.LocationRestriction
	}
	return nil
}

func (x *SearchNearbyRequest) GetRankPreference() SearchNearbyRequest_RankPreference {
	if x != nil {
		return x.RankPreference
	}
	return SearchNearbyRequest_RANK_PREFERENCE_UNSPECIFIED
}

// Response proto for Search Nearby.
type SearchNearbyResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A list of places that meets user's requirements like places
	// types, number of places and specific location restriction.
	Places []*Place `protobuf:"bytes,1,rep,name=places,proto3" json:"places,omitempty"`
}

func (x *SearchNearbyResponse) Reset() {
	*x = SearchNearbyResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchNearbyResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchNearbyResponse) ProtoMessage() {}

func (x *SearchNearbyResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchNearbyResponse.ProtoReflect.Descriptor instead.
func (*SearchNearbyResponse) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{1}
}

func (x *SearchNearbyResponse) GetPlaces() []*Place {
	if x != nil {
		return x.Places
	}
	return nil
}

// Request proto for SearchText.
type SearchTextRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The text query for textual search.
	TextQuery string `protobuf:"bytes,1,opt,name=text_query,json=textQuery,proto3" json:"text_query,omitempty"`
	// Place details will be displayed with the preferred language if available.
	// If the language code is unspecified or unrecognized, place details of any
	// language may be returned, with a preference for English if such details
	// exist.
	//
	// Current list of supported languages:
	// https://developers.google.com/maps/faq#languagesupport.
	LanguageCode string `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// The Unicode country/region code (CLDR) of the location where the
	// request is coming from. This parameter is used to display the place
	// details, like region-specific place name, if available. The parameter can
	// affect results based on applicable law.
	//
	// For more information, see
	// https://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html.
	//
	// Note that 3-digit region codes are not currently supported.
	RegionCode string `protobuf:"bytes,3,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// How results will be ranked in the response.
	RankPreference SearchTextRequest_RankPreference `protobuf:"varint,4,opt,name=rank_preference,json=rankPreference,proto3,enum=google.maps.places.v1.SearchTextRequest_RankPreference" json:"rank_preference,omitempty"`
	// The requested place type. Full list of types supported:
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	// Only support one included type.
	IncludedType string `protobuf:"bytes,6,opt,name=included_type,json=includedType,proto3" json:"included_type,omitempty"`
	// Used to restrict the search to places that are currently open.  The default
	// is false.
	OpenNow bool `protobuf:"varint,7,opt,name=open_now,json=openNow,proto3" json:"open_now,omitempty"`
	// Filter out results whose average user rating is strictly less than this
	// limit. A valid value must be a float between 0 and 5 (inclusively) at a
	// 0.5 cadence i.e. [0, 0.5, 1.0, ... , 5.0] inclusively. The input rating
	// will round up to the nearest 0.5(ceiling). For instance, a rating of 0.6
	// will eliminate all results with a less than 1.0 rating.
	MinRating float64 `protobuf:"fixed64,9,opt,name=min_rating,json=minRating,proto3" json:"min_rating,omitempty"`
	// Maximum number of results to return. It must be between 1 and 20,
	// inclusively. The default is 20.  If the number is unset, it falls back to
	// the upper limit. If the number is set to negative or exceeds the upper
	// limit, an INVALID_ARGUMENT error is returned.
	MaxResultCount int32 `protobuf:"varint,10,opt,name=max_result_count,json=maxResultCount,proto3" json:"max_result_count,omitempty"`
	// Used to restrict the search to places that are marked as certain price
	// levels. Users can choose any combinations of price levels. Default to
	// select all price levels.
	PriceLevels []PriceLevel `protobuf:"varint,11,rep,packed,name=price_levels,json=priceLevels,proto3,enum=google.maps.places.v1.PriceLevel" json:"price_levels,omitempty"`
	// Used to set strict type filtering for included_type. If set to true, only
	// results of the same type will be returned. Default to false.
	StrictTypeFiltering bool `protobuf:"varint,12,opt,name=strict_type_filtering,json=strictTypeFiltering,proto3" json:"strict_type_filtering,omitempty"`
	// The region to search. This location serves as a bias which means results
	// around given location might be returned. Cannot be set along with
	// location_restriction.
	LocationBias *SearchTextRequest_LocationBias `protobuf:"bytes,13,opt,name=location_bias,json=locationBias,proto3" json:"location_bias,omitempty"`
	// The region to search. This location serves as a restriction which means
	// results outside given location will not be returned. Cannot be set along
	// with location_bias.
	LocationRestriction *SearchTextRequest_LocationRestriction `protobuf:"bytes,14,opt,name=location_restriction,json=locationRestriction,proto3" json:"location_restriction,omitempty"`
	// Optional. Set the searchable EV options of a place search request.
	EvOptions *SearchTextRequest_EVOptions `protobuf:"bytes,15,opt,name=ev_options,json=evOptions,proto3" json:"ev_options,omitempty"`
}

func (x *SearchTextRequest) Reset() {
	*x = SearchTextRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchTextRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchTextRequest) ProtoMessage() {}

func (x *SearchTextRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchTextRequest.ProtoReflect.Descriptor instead.
func (*SearchTextRequest) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{2}
}

func (x *SearchTextRequest) GetTextQuery() string {
	if x != nil {
		return x.TextQuery
	}
	return ""
}

func (x *SearchTextRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

func (x *SearchTextRequest) GetRegionCode() string {
	if x != nil {
		return x.RegionCode
	}
	return ""
}

func (x *SearchTextRequest) GetRankPreference() SearchTextRequest_RankPreference {
	if x != nil {
		return x.RankPreference
	}
	return SearchTextRequest_RANK_PREFERENCE_UNSPECIFIED
}

func (x *SearchTextRequest) GetIncludedType() string {
	if x != nil {
		return x.IncludedType
	}
	return ""
}

func (x *SearchTextRequest) GetOpenNow() bool {
	if x != nil {
		return x.OpenNow
	}
	return false
}

func (x *SearchTextRequest) GetMinRating() float64 {
	if x != nil {
		return x.MinRating
	}
	return 0
}

func (x *SearchTextRequest) GetMaxResultCount() int32 {
	if x != nil {
		return x.MaxResultCount
	}
	return 0
}

func (x *SearchTextRequest) GetPriceLevels() []PriceLevel {
	if x != nil {
		return x.PriceLevels
	}
	return nil
}

func (x *SearchTextRequest) GetStrictTypeFiltering() bool {
	if x != nil {
		return x.StrictTypeFiltering
	}
	return false
}

func (x *SearchTextRequest) GetLocationBias() *SearchTextRequest_LocationBias {
	if x != nil {
		return x.LocationBias
	}
	return nil
}

func (x *SearchTextRequest) GetLocationRestriction() *SearchTextRequest_LocationRestriction {
	if x != nil {
		return x.LocationRestriction
	}
	return nil
}

func (x *SearchTextRequest) GetEvOptions() *SearchTextRequest_EVOptions {
	if x != nil {
		return x.EvOptions
	}
	return nil
}

// Response proto for SearchText.
type SearchTextResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A list of places that meet the user's text search criteria.
	Places []*Place `protobuf:"bytes,1,rep,name=places,proto3" json:"places,omitempty"`
}

func (x *SearchTextResponse) Reset() {
	*x = SearchTextResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchTextResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchTextResponse) ProtoMessage() {}

func (x *SearchTextResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchTextResponse.ProtoReflect.Descriptor instead.
func (*SearchTextResponse) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{3}
}

func (x *SearchTextResponse) GetPlaces() []*Place {
	if x != nil {
		return x.Places
	}
	return nil
}

// Request for fetching a photo of a place using a photo resource name.
type GetPhotoMediaRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of a photo media in the format:
	// `places/{place_id}/photos/{photo_reference}/media`.
	//
	// The resource name of a photo as returned in a Place object's `photos.name`
	// field comes with the format
	// `places/{place_id}/photos/{photo_reference}`. You need to append `/media`
	// at the end of the photo resource to get the photo media resource name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. Specifies the maximum desired width, in pixels, of the image. If
	// the image is smaller than the values specified, the original image will be
	// returned. If the image is larger in either dimension, it will be scaled to
	// match the smaller of the two dimensions, restricted to its original aspect
	// ratio. Both the max_height_px and max_width_px properties accept an integer
	// between 1 and 4800, inclusively. If the value is not within the allowed
	// range, an INVALID_ARGUMENT error will be returned.
	//
	// At least one of max_height_px or max_width_px needs to be specified. If
	// neither max_height_px nor max_width_px is specified, an INVALID_ARGUMENT
	// error will be returned.
	MaxWidthPx int32 `protobuf:"varint,2,opt,name=max_width_px,json=maxWidthPx,proto3" json:"max_width_px,omitempty"`
	// Optional. Specifies the maximum desired height, in pixels, of the image. If
	// the image is smaller than the values specified, the original image will be
	// returned. If the image is larger in either dimension, it will be scaled to
	// match the smaller of the two dimensions, restricted to its original aspect
	// ratio. Both the max_height_px and max_width_px properties accept an integer
	// between 1 and 4800, inclusively. If the value is not within the allowed
	// range, an INVALID_ARGUMENT error will be returned.
	//
	// At least one of max_height_px or max_width_px needs to be specified. If
	// neither max_height_px nor max_width_px is specified, an INVALID_ARGUMENT
	// error will be returned.
	MaxHeightPx int32 `protobuf:"varint,3,opt,name=max_height_px,json=maxHeightPx,proto3" json:"max_height_px,omitempty"`
	// Optional. If set, skip the default HTTP redirect behavior and render a text
	// format (for example, in JSON format for HTTP use case) response. If not
	// set, an HTTP redirect will be issued to redirect the call to the image
	// media. This option is ignored for non-HTTP requests.
	SkipHttpRedirect bool `protobuf:"varint,4,opt,name=skip_http_redirect,json=skipHttpRedirect,proto3" json:"skip_http_redirect,omitempty"`
}

func (x *GetPhotoMediaRequest) Reset() {
	*x = GetPhotoMediaRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetPhotoMediaRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetPhotoMediaRequest) ProtoMessage() {}

func (x *GetPhotoMediaRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 GetPhotoMediaRequest.ProtoReflect.Descriptor instead.
func (*GetPhotoMediaRequest) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{4}
}

func (x *GetPhotoMediaRequest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *GetPhotoMediaRequest) GetMaxWidthPx() int32 {
	if x != nil {
		return x.MaxWidthPx
	}
	return 0
}

func (x *GetPhotoMediaRequest) GetMaxHeightPx() int32 {
	if x != nil {
		return x.MaxHeightPx
	}
	return 0
}

func (x *GetPhotoMediaRequest) GetSkipHttpRedirect() bool {
	if x != nil {
		return x.SkipHttpRedirect
	}
	return false
}

// A photo media from Places API.
type PhotoMedia struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The resource name of a photo media in the format:
	// `places/{place_id}/photos/{photo_reference}/media`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// A short-lived uri that can be used to render the photo.
	PhotoUri string `protobuf:"bytes,2,opt,name=photo_uri,json=photoUri,proto3" json:"photo_uri,omitempty"`
}

func (x *PhotoMedia) Reset() {
	*x = PhotoMedia{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PhotoMedia) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PhotoMedia) ProtoMessage() {}

func (x *PhotoMedia) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 PhotoMedia.ProtoReflect.Descriptor instead.
func (*PhotoMedia) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{5}
}

func (x *PhotoMedia) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *PhotoMedia) GetPhotoUri() string {
	if x != nil {
		return x.PhotoUri
	}
	return ""
}

// Request for fetching a Place based on its resource name, which is a string in
// the `places/{place_id}` format.
type GetPlaceRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of a place, in the `places/{place_id}` format.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. Place details will be displayed with the preferred language if
	// available.
	//
	// Current list of supported languages:
	// https://developers.google.com/maps/faq#languagesupport.
	LanguageCode string `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The Unicode country/region code (CLDR) of the location where the
	// request is coming from. This parameter is used to display the place
	// details, like region-specific place name, if available. The parameter can
	// affect results based on applicable law.
	// For more information, see
	// https://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html.
	//
	// Note that 3-digit region codes are not currently supported.
	RegionCode string `protobuf:"bytes,3,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Optional. A string which identifies an Autocomplete session for billing
	// purposes. Must be a URL and filename safe base64 string with at most 36
	// ASCII characters in length. Otherwise an INVALID_ARGUMENT error is
	// returned.
	//
	// The session begins when the user starts typing a query, and concludes when
	// they select a place and a call to Place Details or Address Validation is
	// made. Each session can have multiple queries, followed by one Place Details
	// or Address Validation request. The credentials used for each request within
	// a session must belong to the same Google Cloud Console project. Once a
	// session has concluded, the token is no longer valid; your app must generate
	// a fresh token for each session. If the `session_token` parameter is
	// omitted, or if you reuse a session token, the session is charged as if no
	// session token was provided (each request is billed separately).
	//
	// We recommend the following guidelines:
	//
	//   - Use session tokens for all Place Autocomplete calls.
	//   - Generate a fresh token for each session. Using a version 4 UUID is
	//     recommended.
	//   - Ensure that the credentials used for all Place Autocomplete, Place
	//     Details, and Address Validation requests within a session belong to the
	//     same Cloud Console project.
	//   - Be sure to pass a unique session token for each new session. Using the
	//     same token for more than one session will result in each request being
	//     billed individually.
	SessionToken string `protobuf:"bytes,4,opt,name=session_token,json=sessionToken,proto3" json:"session_token,omitempty"`
}

func (x *GetPlaceRequest) Reset() {
	*x = GetPlaceRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetPlaceRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetPlaceRequest) ProtoMessage() {}

func (x *GetPlaceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 GetPlaceRequest.ProtoReflect.Descriptor instead.
func (*GetPlaceRequest) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{6}
}

func (x *GetPlaceRequest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *GetPlaceRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

func (x *GetPlaceRequest) GetRegionCode() string {
	if x != nil {
		return x.RegionCode
	}
	return ""
}

func (x *GetPlaceRequest) GetSessionToken() string {
	if x != nil {
		return x.SessionToken
	}
	return ""
}

// Request proto for AutocompletePlaces.
type AutocompletePlacesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The text string on which to search.
	Input string `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"`
	// Optional. Bias results to a specified location.
	//
	// At most one of `location_bias` or `location_restriction` should be set. If
	// neither are set, the results will be biased by IP address, meaning the IP
	// address will be mapped to an imprecise location and used as a biasing
	// signal.
	LocationBias *AutocompletePlacesRequest_LocationBias `protobuf:"bytes,2,opt,name=location_bias,json=locationBias,proto3" json:"location_bias,omitempty"`
	// Optional. Restrict results to a specified location.
	//
	// At most one of `location_bias` or `location_restriction` should be set. If
	// neither are set, the results will be biased by IP address, meaning the IP
	// address will be mapped to an imprecise location and used as a biasing
	// signal.
	LocationRestriction *AutocompletePlacesRequest_LocationRestriction `protobuf:"bytes,3,opt,name=location_restriction,json=locationRestriction,proto3" json:"location_restriction,omitempty"`
	// Optional. Included primary Place type (for example, "restaurant" or
	// "gas_station") from
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	// A Place is only returned if its primary type is included in this list. Up
	// to 5 values can be specified. If no types are specified, all Place types
	// are returned.
	IncludedPrimaryTypes []string `protobuf:"bytes,4,rep,name=included_primary_types,json=includedPrimaryTypes,proto3" json:"included_primary_types,omitempty"`
	// Optional. Only include results in the specified regions, specified as up to
	// 15 CLDR two-character region codes. An empty set will not restrict the
	// results. If both `location_restriction` and `included_region_codes` are
	// set, the results will be located in the area of intersection.
	IncludedRegionCodes []string `protobuf:"bytes,5,rep,name=included_region_codes,json=includedRegionCodes,proto3" json:"included_region_codes,omitempty"`
	// Optional. The language in which to return results. Defaults to en-US. The
	// results may be in mixed languages if the language used in `input` is
	// different from `language_code` or if the returned Place does not have a
	// translation from the local language to `language_code`.
	LanguageCode string `protobuf:"bytes,6,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The region code, specified as a CLDR two-character region code.
	// This affects address formatting, result ranking, and may influence what
	// results are returned. This does not restrict results to the specified
	// region. To restrict results to a region, use `region_code_restriction`.
	RegionCode string `protobuf:"bytes,7,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Optional. The origin point from which to calculate geodesic distance to the
	// destination (returned as `distance_meters`). If this value is omitted,
	// geodesic distance will not be returned.
	Origin *latlng.LatLng `protobuf:"bytes,8,opt,name=origin,proto3" json:"origin,omitempty"`
	// Optional. A zero-based Unicode character offset of `input` indicating the
	// cursor position in `input`. The cursor position may influence what
	// predictions are returned.
	//
	// If empty, defaults to the length of `input`.
	InputOffset int32 `protobuf:"varint,9,opt,name=input_offset,json=inputOffset,proto3" json:"input_offset,omitempty"`
	// Optional. If true, the response will include both Place and query
	// predictions. Otherwise the response will only return Place predictions.
	IncludeQueryPredictions bool `protobuf:"varint,10,opt,name=include_query_predictions,json=includeQueryPredictions,proto3" json:"include_query_predictions,omitempty"`
	// Optional. A string which identifies an Autocomplete session for billing
	// purposes. Must be a URL and filename safe base64 string with at most 36
	// ASCII characters in length. Otherwise an INVALID_ARGUMENT error is
	// returned.
	//
	// The session begins when the user starts typing a query, and concludes when
	// they select a place and a call to Place Details or Address Validation is
	// made. Each session can have multiple queries, followed by one Place Details
	// or Address Validation request. The credentials used for each request within
	// a session must belong to the same Google Cloud Console project. Once a
	// session has concluded, the token is no longer valid; your app must generate
	// a fresh token for each session. If the `session_token` parameter is
	// omitted, or if you reuse a session token, the session is charged as if no
	// session token was provided (each request is billed separately).
	//
	// We recommend the following guidelines:
	//
	//   - Use session tokens for all Place Autocomplete calls.
	//   - Generate a fresh token for each session. Using a version 4 UUID is
	//     recommended.
	//   - Ensure that the credentials used for all Place Autocomplete, Place
	//     Details, and Address Validation requests within a session belong to the
	//     same Cloud Console project.
	//   - Be sure to pass a unique session token for each new session. Using the
	//     same token for more than one session will result in each request being
	//     billed individually.
	SessionToken string `protobuf:"bytes,11,opt,name=session_token,json=sessionToken,proto3" json:"session_token,omitempty"`
}

func (x *AutocompletePlacesRequest) Reset() {
	*x = AutocompletePlacesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesRequest) ProtoMessage() {}

func (x *AutocompletePlacesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesRequest.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesRequest) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{7}
}

func (x *AutocompletePlacesRequest) GetInput() string {
	if x != nil {
		return x.Input
	}
	return ""
}

func (x *AutocompletePlacesRequest) GetLocationBias() *AutocompletePlacesRequest_LocationBias {
	if x != nil {
		return x.LocationBias
	}
	return nil
}

func (x *AutocompletePlacesRequest) GetLocationRestriction() *AutocompletePlacesRequest_LocationRestriction {
	if x != nil {
		return x.LocationRestriction
	}
	return nil
}

func (x *AutocompletePlacesRequest) GetIncludedPrimaryTypes() []string {
	if x != nil {
		return x.IncludedPrimaryTypes
	}
	return nil
}

func (x *AutocompletePlacesRequest) GetIncludedRegionCodes() []string {
	if x != nil {
		return x.IncludedRegionCodes
	}
	return nil
}

func (x *AutocompletePlacesRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

func (x *AutocompletePlacesRequest) GetRegionCode() string {
	if x != nil {
		return x.RegionCode
	}
	return ""
}

func (x *AutocompletePlacesRequest) GetOrigin() *latlng.LatLng {
	if x != nil {
		return x.Origin
	}
	return nil
}

func (x *AutocompletePlacesRequest) GetInputOffset() int32 {
	if x != nil {
		return x.InputOffset
	}
	return 0
}

func (x *AutocompletePlacesRequest) GetIncludeQueryPredictions() bool {
	if x != nil {
		return x.IncludeQueryPredictions
	}
	return false
}

func (x *AutocompletePlacesRequest) GetSessionToken() string {
	if x != nil {
		return x.SessionToken
	}
	return ""
}

// Response proto for AutocompletePlaces.
type AutocompletePlacesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Contains a list of suggestions, ordered in descending order of relevance.
	Suggestions []*AutocompletePlacesResponse_Suggestion `protobuf:"bytes,1,rep,name=suggestions,proto3" json:"suggestions,omitempty"`
}

func (x *AutocompletePlacesResponse) Reset() {
	*x = AutocompletePlacesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse) ProtoMessage() {}

func (x *AutocompletePlacesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8}
}

func (x *AutocompletePlacesResponse) GetSuggestions() []*AutocompletePlacesResponse_Suggestion {
	if x != nil {
		return x.Suggestions
	}
	return nil
}

// The region to search.
type SearchNearbyRequest_LocationRestriction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//
	//	*SearchNearbyRequest_LocationRestriction_Circle
	Type isSearchNearbyRequest_LocationRestriction_Type `protobuf_oneof:"type"`
}

func (x *SearchNearbyRequest_LocationRestriction) Reset() {
	*x = SearchNearbyRequest_LocationRestriction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchNearbyRequest_LocationRestriction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchNearbyRequest_LocationRestriction) ProtoMessage() {}

func (x *SearchNearbyRequest_LocationRestriction) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchNearbyRequest_LocationRestriction.ProtoReflect.Descriptor instead.
func (*SearchNearbyRequest_LocationRestriction) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{0, 0}
}

func (m *SearchNearbyRequest_LocationRestriction) GetType() isSearchNearbyRequest_LocationRestriction_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *SearchNearbyRequest_LocationRestriction) GetCircle() *Circle {
	if x, ok := x.GetType().(*SearchNearbyRequest_LocationRestriction_Circle); ok {
		return x.Circle
	}
	return nil
}

type isSearchNearbyRequest_LocationRestriction_Type interface {
	isSearchNearbyRequest_LocationRestriction_Type()
}

type SearchNearbyRequest_LocationRestriction_Circle struct {
	// A circle defined by center point and radius.
	Circle *Circle `protobuf:"bytes,2,opt,name=circle,proto3,oneof"`
}

func (*SearchNearbyRequest_LocationRestriction_Circle) isSearchNearbyRequest_LocationRestriction_Type() {
}

// The region to search. This location serves as a bias which means results
// around given location might be returned.
type SearchTextRequest_LocationBias struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//
	//	*SearchTextRequest_LocationBias_Rectangle
	//	*SearchTextRequest_LocationBias_Circle
	Type isSearchTextRequest_LocationBias_Type `protobuf_oneof:"type"`
}

func (x *SearchTextRequest_LocationBias) Reset() {
	*x = SearchTextRequest_LocationBias{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchTextRequest_LocationBias) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchTextRequest_LocationBias) ProtoMessage() {}

func (x *SearchTextRequest_LocationBias) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchTextRequest_LocationBias.ProtoReflect.Descriptor instead.
func (*SearchTextRequest_LocationBias) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{2, 0}
}

func (m *SearchTextRequest_LocationBias) GetType() isSearchTextRequest_LocationBias_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *SearchTextRequest_LocationBias) GetRectangle() *viewport.Viewport {
	if x, ok := x.GetType().(*SearchTextRequest_LocationBias_Rectangle); ok {
		return x.Rectangle
	}
	return nil
}

func (x *SearchTextRequest_LocationBias) GetCircle() *Circle {
	if x, ok := x.GetType().(*SearchTextRequest_LocationBias_Circle); ok {
		return x.Circle
	}
	return nil
}

type isSearchTextRequest_LocationBias_Type interface {
	isSearchTextRequest_LocationBias_Type()
}

type SearchTextRequest_LocationBias_Rectangle struct {
	// A rectangle box defined by northeast and southwest corner.
	// `rectangle.high()` must be the northeast point of the rectangle
	// viewport. `rectangle.low()` must be the southwest point of the
	// rectangle viewport. `rectangle.low().latitude()` cannot be greater than
	// `rectangle.high().latitude()`. This will result in an empty latitude
	// range. A rectangle viewport cannot be wider than 180 degrees.
	Rectangle *viewport.Viewport `protobuf:"bytes,1,opt,name=rectangle,proto3,oneof"`
}

type SearchTextRequest_LocationBias_Circle struct {
	// A circle defined by center point and radius.
	Circle *Circle `protobuf:"bytes,2,opt,name=circle,proto3,oneof"`
}

func (*SearchTextRequest_LocationBias_Rectangle) isSearchTextRequest_LocationBias_Type() {}

func (*SearchTextRequest_LocationBias_Circle) isSearchTextRequest_LocationBias_Type() {}

// The region to search. This location serves as a restriction which means
// results outside given location will not be returned.
type SearchTextRequest_LocationRestriction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//
	//	*SearchTextRequest_LocationRestriction_Rectangle
	Type isSearchTextRequest_LocationRestriction_Type `protobuf_oneof:"type"`
}

func (x *SearchTextRequest_LocationRestriction) Reset() {
	*x = SearchTextRequest_LocationRestriction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchTextRequest_LocationRestriction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchTextRequest_LocationRestriction) ProtoMessage() {}

func (x *SearchTextRequest_LocationRestriction) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchTextRequest_LocationRestriction.ProtoReflect.Descriptor instead.
func (*SearchTextRequest_LocationRestriction) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{2, 1}
}

func (m *SearchTextRequest_LocationRestriction) GetType() isSearchTextRequest_LocationRestriction_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *SearchTextRequest_LocationRestriction) GetRectangle() *viewport.Viewport {
	if x, ok := x.GetType().(*SearchTextRequest_LocationRestriction_Rectangle); ok {
		return x.Rectangle
	}
	return nil
}

type isSearchTextRequest_LocationRestriction_Type interface {
	isSearchTextRequest_LocationRestriction_Type()
}

type SearchTextRequest_LocationRestriction_Rectangle struct {
	// A rectangle box defined by northeast and southwest corner.
	// `rectangle.high()` must be the northeast point of the rectangle
	// viewport. `rectangle.low()` must be the southwest point of the
	// rectangle viewport. `rectangle.low().latitude()` cannot be greater than
	// `rectangle.high().latitude()`. This will result in an empty latitude
	// range. A rectangle viewport cannot be wider than 180 degrees.
	Rectangle *viewport.Viewport `protobuf:"bytes,1,opt,name=rectangle,proto3,oneof"`
}

func (*SearchTextRequest_LocationRestriction_Rectangle) isSearchTextRequest_LocationRestriction_Type() {
}

// Searchable EV options of a place search request.
type SearchTextRequest_EVOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Optional. Minimum required charging rate in kilowatts. A place with a
	// charging rate less than the specified rate is filtered out.
	MinimumChargingRateKw float64 `protobuf:"fixed64,1,opt,name=minimum_charging_rate_kw,json=minimumChargingRateKw,proto3" json:"minimum_charging_rate_kw,omitempty"`
	// Optional. The list of preferred EV connector types. A place that does not
	// support any of the listed connector types is filtered out.
	ConnectorTypes []EVConnectorType `protobuf:"varint,2,rep,packed,name=connector_types,json=connectorTypes,proto3,enum=google.maps.places.v1.EVConnectorType" json:"connector_types,omitempty"`
}

func (x *SearchTextRequest_EVOptions) Reset() {
	*x = SearchTextRequest_EVOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SearchTextRequest_EVOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SearchTextRequest_EVOptions) ProtoMessage() {}

func (x *SearchTextRequest_EVOptions) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 SearchTextRequest_EVOptions.ProtoReflect.Descriptor instead.
func (*SearchTextRequest_EVOptions) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{2, 2}
}

func (x *SearchTextRequest_EVOptions) GetMinimumChargingRateKw() float64 {
	if x != nil {
		return x.MinimumChargingRateKw
	}
	return 0
}

func (x *SearchTextRequest_EVOptions) GetConnectorTypes() []EVConnectorType {
	if x != nil {
		return x.ConnectorTypes
	}
	return nil
}

// The region to search. The results may be biased around the specified
// region.
type AutocompletePlacesRequest_LocationBias struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//
	//	*AutocompletePlacesRequest_LocationBias_Rectangle
	//	*AutocompletePlacesRequest_LocationBias_Circle
	Type isAutocompletePlacesRequest_LocationBias_Type `protobuf_oneof:"type"`
}

func (x *AutocompletePlacesRequest_LocationBias) Reset() {
	*x = AutocompletePlacesRequest_LocationBias{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesRequest_LocationBias) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesRequest_LocationBias) ProtoMessage() {}

func (x *AutocompletePlacesRequest_LocationBias) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesRequest_LocationBias.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesRequest_LocationBias) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{7, 0}
}

func (m *AutocompletePlacesRequest_LocationBias) GetType() isAutocompletePlacesRequest_LocationBias_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *AutocompletePlacesRequest_LocationBias) GetRectangle() *viewport.Viewport {
	if x, ok := x.GetType().(*AutocompletePlacesRequest_LocationBias_Rectangle); ok {
		return x.Rectangle
	}
	return nil
}

func (x *AutocompletePlacesRequest_LocationBias) GetCircle() *Circle {
	if x, ok := x.GetType().(*AutocompletePlacesRequest_LocationBias_Circle); ok {
		return x.Circle
	}
	return nil
}

type isAutocompletePlacesRequest_LocationBias_Type interface {
	isAutocompletePlacesRequest_LocationBias_Type()
}

type AutocompletePlacesRequest_LocationBias_Rectangle struct {
	// A viewport defined by a northeast and a southwest corner.
	Rectangle *viewport.Viewport `protobuf:"bytes,1,opt,name=rectangle,proto3,oneof"`
}

type AutocompletePlacesRequest_LocationBias_Circle struct {
	// A circle defined by a center point and radius.
	Circle *Circle `protobuf:"bytes,2,opt,name=circle,proto3,oneof"`
}

func (*AutocompletePlacesRequest_LocationBias_Rectangle) isAutocompletePlacesRequest_LocationBias_Type() {
}

func (*AutocompletePlacesRequest_LocationBias_Circle) isAutocompletePlacesRequest_LocationBias_Type() {
}

// The region to search. The results will be restricted to the specified
// region.
type AutocompletePlacesRequest_LocationRestriction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//
	//	*AutocompletePlacesRequest_LocationRestriction_Rectangle
	//	*AutocompletePlacesRequest_LocationRestriction_Circle
	Type isAutocompletePlacesRequest_LocationRestriction_Type `protobuf_oneof:"type"`
}

func (x *AutocompletePlacesRequest_LocationRestriction) Reset() {
	*x = AutocompletePlacesRequest_LocationRestriction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesRequest_LocationRestriction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesRequest_LocationRestriction) ProtoMessage() {}

func (x *AutocompletePlacesRequest_LocationRestriction) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesRequest_LocationRestriction.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesRequest_LocationRestriction) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{7, 1}
}

func (m *AutocompletePlacesRequest_LocationRestriction) GetType() isAutocompletePlacesRequest_LocationRestriction_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *AutocompletePlacesRequest_LocationRestriction) GetRectangle() *viewport.Viewport {
	if x, ok := x.GetType().(*AutocompletePlacesRequest_LocationRestriction_Rectangle); ok {
		return x.Rectangle
	}
	return nil
}

func (x *AutocompletePlacesRequest_LocationRestriction) GetCircle() *Circle {
	if x, ok := x.GetType().(*AutocompletePlacesRequest_LocationRestriction_Circle); ok {
		return x.Circle
	}
	return nil
}

type isAutocompletePlacesRequest_LocationRestriction_Type interface {
	isAutocompletePlacesRequest_LocationRestriction_Type()
}

type AutocompletePlacesRequest_LocationRestriction_Rectangle struct {
	// A viewport defined by a northeast and a southwest corner.
	Rectangle *viewport.Viewport `protobuf:"bytes,1,opt,name=rectangle,proto3,oneof"`
}

type AutocompletePlacesRequest_LocationRestriction_Circle struct {
	// A circle defined by a center point and radius.
	Circle *Circle `protobuf:"bytes,2,opt,name=circle,proto3,oneof"`
}

func (*AutocompletePlacesRequest_LocationRestriction_Rectangle) isAutocompletePlacesRequest_LocationRestriction_Type() {
}

func (*AutocompletePlacesRequest_LocationRestriction_Circle) isAutocompletePlacesRequest_LocationRestriction_Type() {
}

// An Autocomplete suggestion result.
type AutocompletePlacesResponse_Suggestion struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Kind:
	//
	//	*AutocompletePlacesResponse_Suggestion_PlacePrediction_
	//	*AutocompletePlacesResponse_Suggestion_QueryPrediction_
	Kind isAutocompletePlacesResponse_Suggestion_Kind `protobuf_oneof:"kind"`
}

func (x *AutocompletePlacesResponse_Suggestion) Reset() {
	*x = AutocompletePlacesResponse_Suggestion{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0}
}

func (m *AutocompletePlacesResponse_Suggestion) GetKind() isAutocompletePlacesResponse_Suggestion_Kind {
	if m != nil {
		return m.Kind
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion) GetPlacePrediction() *AutocompletePlacesResponse_Suggestion_PlacePrediction {
	if x, ok := x.GetKind().(*AutocompletePlacesResponse_Suggestion_PlacePrediction_); ok {
		return x.PlacePrediction
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion) GetQueryPrediction() *AutocompletePlacesResponse_Suggestion_QueryPrediction {
	if x, ok := x.GetKind().(*AutocompletePlacesResponse_Suggestion_QueryPrediction_); ok {
		return x.QueryPrediction
	}
	return nil
}

type isAutocompletePlacesResponse_Suggestion_Kind interface {
	isAutocompletePlacesResponse_Suggestion_Kind()
}

type AutocompletePlacesResponse_Suggestion_PlacePrediction_ struct {
	// A prediction for a Place.
	PlacePrediction *AutocompletePlacesResponse_Suggestion_PlacePrediction `protobuf:"bytes,1,opt,name=place_prediction,json=placePrediction,proto3,oneof"`
}

type AutocompletePlacesResponse_Suggestion_QueryPrediction_ struct {
	// A prediction for a query.
	QueryPrediction *AutocompletePlacesResponse_Suggestion_QueryPrediction `protobuf:"bytes,2,opt,name=query_prediction,json=queryPrediction,proto3,oneof"`
}

func (*AutocompletePlacesResponse_Suggestion_PlacePrediction_) isAutocompletePlacesResponse_Suggestion_Kind() {
}

func (*AutocompletePlacesResponse_Suggestion_QueryPrediction_) isAutocompletePlacesResponse_Suggestion_Kind() {
}

// Identifies a substring within a given text.
type AutocompletePlacesResponse_Suggestion_StringRange struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Zero-based offset of the first Unicode character of the string
	// (inclusive).
	StartOffset int32 `protobuf:"varint,1,opt,name=start_offset,json=startOffset,proto3" json:"start_offset,omitempty"`
	// Zero-based offset of the last Unicode character (exclusive).
	EndOffset int32 `protobuf:"varint,2,opt,name=end_offset,json=endOffset,proto3" json:"end_offset,omitempty"`
}

func (x *AutocompletePlacesResponse_Suggestion_StringRange) Reset() {
	*x = AutocompletePlacesResponse_Suggestion_StringRange{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion_StringRange) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion_StringRange) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion_StringRange) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion_StringRange.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion_StringRange) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0, 0}
}

func (x *AutocompletePlacesResponse_Suggestion_StringRange) GetStartOffset() int32 {
	if x != nil {
		return x.StartOffset
	}
	return 0
}

func (x *AutocompletePlacesResponse_Suggestion_StringRange) GetEndOffset() int32 {
	if x != nil {
		return x.EndOffset
	}
	return 0
}

// Text representing a Place or query prediction. The text may be used as is
// or formatted.
type AutocompletePlacesResponse_Suggestion_FormattableText struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Text that may be used as is or formatted with `matches`.
	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// A list of string ranges identifying where the input request matched in
	// `text`. The ranges can be used to format specific parts of `text`. The
	// substrings may not be exact matches of `input` if the matching was
	// determined by criteria other than string matching (for example, spell
	// corrections or transliterations).
	//
	// These values are Unicode character offsets of `text`. The ranges are
	// guaranteed to be ordered in increasing offset values.
	Matches []*AutocompletePlacesResponse_Suggestion_StringRange `protobuf:"bytes,2,rep,name=matches,proto3" json:"matches,omitempty"`
}

func (x *AutocompletePlacesResponse_Suggestion_FormattableText) Reset() {
	*x = AutocompletePlacesResponse_Suggestion_FormattableText{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion_FormattableText) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion_FormattableText) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion_FormattableText) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion_FormattableText.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion_FormattableText) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0, 1}
}

func (x *AutocompletePlacesResponse_Suggestion_FormattableText) GetText() string {
	if x != nil {
		return x.Text
	}
	return ""
}

func (x *AutocompletePlacesResponse_Suggestion_FormattableText) GetMatches() []*AutocompletePlacesResponse_Suggestion_StringRange {
	if x != nil {
		return x.Matches
	}
	return nil
}

// Contains a breakdown of a Place or query prediction into main text
// and secondary text.
//
// For Place predictions, the main text contains the specific name of the
// Place. For query predictions, the main text contains the query.
//
// The secondary text contains additional disambiguating features (such as a
// city or region) to further identify the Place or refine the query.
type AutocompletePlacesResponse_Suggestion_StructuredFormat struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Represents the name of the Place or query.
	MainText *AutocompletePlacesResponse_Suggestion_FormattableText `protobuf:"bytes,1,opt,name=main_text,json=mainText,proto3" json:"main_text,omitempty"`
	// Represents additional disambiguating features (such as a city or
	// region) to further identify the Place or refine the query.
	SecondaryText *AutocompletePlacesResponse_Suggestion_FormattableText `protobuf:"bytes,2,opt,name=secondary_text,json=secondaryText,proto3" json:"secondary_text,omitempty"`
}

func (x *AutocompletePlacesResponse_Suggestion_StructuredFormat) Reset() {
	*x = AutocompletePlacesResponse_Suggestion_StructuredFormat{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion_StructuredFormat) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion_StructuredFormat) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion_StructuredFormat) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion_StructuredFormat.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion_StructuredFormat) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0, 2}
}

func (x *AutocompletePlacesResponse_Suggestion_StructuredFormat) GetMainText() *AutocompletePlacesResponse_Suggestion_FormattableText {
	if x != nil {
		return x.MainText
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion_StructuredFormat) GetSecondaryText() *AutocompletePlacesResponse_Suggestion_FormattableText {
	if x != nil {
		return x.SecondaryText
	}
	return nil
}

// Prediction results for a Place Autocomplete prediction.
type AutocompletePlacesResponse_Suggestion_PlacePrediction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The resource name of the suggested Place. This name can be used in
	// other APIs that accept Place names.
	Place string `protobuf:"bytes,1,opt,name=place,proto3" json:"place,omitempty"`
	// The unique identifier of the suggested Place. This identifier can be
	// used in other APIs that accept Place IDs.
	PlaceId string `protobuf:"bytes,2,opt,name=place_id,json=placeId,proto3" json:"place_id,omitempty"`
	// Contains the human-readable name for the returned result. For
	// establishment results, this is usually the business name and address.
	//
	// `text` is recommended for developers who wish to show a single UI
	// element. Developers who wish to show two separate, but related, UI
	// elements may want to use `structured_format` instead. They are two
	// different ways to represent a Place prediction. Users should not try to
	// parse `structured_format` into `text` or vice versa.
	//
	// This text may be different from the `display_name` returned by
	// GetPlace.
	//
	// May be in mixed languages if the request `input` and `language_code`
	// are in different languages or if the Place does not have a translation
	// from the local language to `language_code`.
	Text *AutocompletePlacesResponse_Suggestion_FormattableText `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"`
	// A breakdown of the Place prediction into main text containing the name
	// of the Place and secondary text containing additional disambiguating
	// features (such as a city or region).
	//
	// `structured_format` is recommended for developers who wish to show two
	// separate, but related, UI elements. Developers who wish to show a
	// single UI element may want to use `text` instead. They are two
	// different ways to represent a Place prediction. Users should not try to
	// parse `structured_format` into `text` or vice versa.
	StructuredFormat *AutocompletePlacesResponse_Suggestion_StructuredFormat `protobuf:"bytes,4,opt,name=structured_format,json=structuredFormat,proto3" json:"structured_format,omitempty"`
	// List of types that apply to this Place from Table A or Table B in
	// https://developers.google.com/maps/documentation/places/web-service/place-types.
	//
	// A type is a categorization of a Place. Places with shared types will
	// share similar characteristics.
	Types []string `protobuf:"bytes,5,rep,name=types,proto3" json:"types,omitempty"`
	// The length of the geodesic in meters from `origin` if `origin` is
	// specified. Certain predictions such as routes may not populate this
	// field.
	DistanceMeters int32 `protobuf:"varint,6,opt,name=distance_meters,json=distanceMeters,proto3" json:"distance_meters,omitempty"`
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) Reset() {
	*x = AutocompletePlacesResponse_Suggestion_PlacePrediction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion_PlacePrediction) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion_PlacePrediction.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion_PlacePrediction) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0, 3}
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetPlace() string {
	if x != nil {
		return x.Place
	}
	return ""
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetPlaceId() string {
	if x != nil {
		return x.PlaceId
	}
	return ""
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetText() *AutocompletePlacesResponse_Suggestion_FormattableText {
	if x != nil {
		return x.Text
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetStructuredFormat() *AutocompletePlacesResponse_Suggestion_StructuredFormat {
	if x != nil {
		return x.StructuredFormat
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetTypes() []string {
	if x != nil {
		return x.Types
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion_PlacePrediction) GetDistanceMeters() int32 {
	if x != nil {
		return x.DistanceMeters
	}
	return 0
}

// Prediction results for a Query Autocomplete prediction.
type AutocompletePlacesResponse_Suggestion_QueryPrediction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The predicted text. This text does not represent a Place, but rather a
	// text query that could be used in a search endpoint (for example,
	// Text Search).
	//
	// `text` is recommended for developers who wish to show a single UI
	// element. Developers who wish to show two separate, but related, UI
	// elements may want to use `structured_format` instead. They are two
	// different ways to represent a query prediction. Users should not try to
	// parse `structured_format` into `text` or vice versa.
	//
	// May be in mixed languages if the request `input` and `language_code`
	// are in different languages or if part of the query does not have a
	// translation from the local language to `language_code`.
	Text *AutocompletePlacesResponse_Suggestion_FormattableText `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// A breakdown of the query prediction into main text containing the query
	// and secondary text containing additional disambiguating features (such
	// as a city or region).
	//
	// `structured_format` is recommended for developers who wish to show two
	// separate, but related, UI elements. Developers who wish to show a
	// single UI element may want to use `text` instead. They are two
	// different ways to represent a query prediction. Users should not try to
	// parse `structured_format` into `text` or vice versa.
	StructuredFormat *AutocompletePlacesResponse_Suggestion_StructuredFormat `protobuf:"bytes,2,opt,name=structured_format,json=structuredFormat,proto3" json:"structured_format,omitempty"`
}

func (x *AutocompletePlacesResponse_Suggestion_QueryPrediction) Reset() {
	*x = AutocompletePlacesResponse_Suggestion_QueryPrediction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_maps_places_v1_places_service_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AutocompletePlacesResponse_Suggestion_QueryPrediction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AutocompletePlacesResponse_Suggestion_QueryPrediction) ProtoMessage() {}

func (x *AutocompletePlacesResponse_Suggestion_QueryPrediction) ProtoReflect() protoreflect.Message {
	mi := &file_google_maps_places_v1_places_service_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 AutocompletePlacesResponse_Suggestion_QueryPrediction.ProtoReflect.Descriptor instead.
func (*AutocompletePlacesResponse_Suggestion_QueryPrediction) Descriptor() ([]byte, []int) {
	return file_google_maps_places_v1_places_service_proto_rawDescGZIP(), []int{8, 0, 4}
}

func (x *AutocompletePlacesResponse_Suggestion_QueryPrediction) GetText() *AutocompletePlacesResponse_Suggestion_FormattableText {
	if x != nil {
		return x.Text
	}
	return nil
}

func (x *AutocompletePlacesResponse_Suggestion_QueryPrediction) GetStructuredFormat() *AutocompletePlacesResponse_Suggestion_StructuredFormat {
	if x != nil {
		return x.StructuredFormat
	}
	return nil
}

var File_google_maps_places_v1_places_service_proto protoreflect.FileDescriptor

var file_google_maps_places_v1_places_service_proto_rawDesc = []byte{
	0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x2f, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x73,
	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73,
	0x2e, 0x76, 0x31, 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, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c,
	0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68,
	0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x67,
	0x65, 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d,
	0x61, 0x70, 0x73, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x76,
	0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x24, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x2f, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x61,
	0x70, 0x73, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6c, 0x61, 0x74, 0x6c, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xc4, 0x05, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4e, 0x65, 0x61,
	0x72, 0x62, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61,
	0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12,
	0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65,
	0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70,
	0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
	0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75,
	0x64, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52,
	0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34,
	0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61,
	0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14,
	0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x54,
	0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64,
	0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x72,
	0x69, 0x6d, 0x61, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61,
	0x78, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07,
	0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43,
	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x76, 0x0a, 0x14, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63,
	0x68, 0x4e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c,
	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x13, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x0f,
	0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18,
	0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,
	0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65,
	0x61, 0x72, 0x63, 0x68, 0x4e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x2e, 0x52, 0x61, 0x6e, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
	0x52, 0x0e, 0x72, 0x61, 0x6e, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
	0x1a, 0x56, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74,
	0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
	0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65,
	0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x4f, 0x0a, 0x0e, 0x52, 0x61, 0x6e, 0x6b,
	0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x41,
	0x4e, 0x4b, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44,
	0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x4f, 0x50,
	0x55, 0x4c, 0x41, 0x52, 0x49, 0x54, 0x59, 0x10, 0x02, 0x22, 0x4c, 0x0a, 0x14, 0x53, 0x65, 0x61,
	0x72, 0x63, 0x68, 0x4e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52,
	0x06, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x22, 0xe0, 0x09, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72,
	0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a,
	0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x51, 0x75, 0x65, 0x72,
	0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f,
	0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
	0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x67,
	0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x60, 0x0a, 0x0f, 0x72, 0x61, 0x6e, 0x6b, 0x5f,
	0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70,
	0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54,
	0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x61, 0x6e, 0x6b, 0x50,
	0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x6b, 0x50,
	0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63,
	0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19,
	0x0a, 0x08, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x4e, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e,
	0x5f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6d,
	0x69, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01,
	0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x75,
	0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65,
	0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31,
	0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0b, 0x70, 0x72, 0x69,
	0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x69,
	0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e,
	0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x0d,
	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x18, 0x0d, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70,
	0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72,
	0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x6f,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x61, 0x73, 0x12, 0x6f, 0x0a, 0x14, 0x6c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53,
	0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x0a, 0x65, 0x76, 0x5f,
	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x56, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x65, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x1a, 0x8a, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69,
	0x61, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67,
	0x65, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74,
	0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x12, 0x37, 0x0a,
	0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x06,
	0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x58,
	0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67,
	0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x70,
	0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65,
	0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x09, 0x45, 0x56, 0x4f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75,
	0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f,
	0x6b, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x6d,
	0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x52, 0x61,
	0x74, 0x65, 0x4b, 0x77, 0x12, 0x54, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f,
	0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x56, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f,
	0x72, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e,
	0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0e, 0x52, 0x61,
	0x6e, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x1b,
	0x52, 0x41, 0x4e, 0x4b, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f,
	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a,
	0x08, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52,
	0x45, 0x4c, 0x45, 0x56, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x02, 0x22, 0x4a, 0x0a, 0x12, 0x53, 0x65,
	0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x12, 0x34, 0x0a, 0x06, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70,
	0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x06,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
	0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0,
	0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x68, 0x6f,
	0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a,
	0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5f, 0x70, 0x78, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x57, 0x69, 0x64,
	0x74, 0x68, 0x50, 0x78, 0x12, 0x27, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67,
	0x68, 0x74, 0x5f, 0x70, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01,
	0x52, 0x0b, 0x6d, 0x61, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x78, 0x12, 0x31, 0x0a,
	0x12, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72,
	0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10,
	0x73, 0x6b, 0x69, 0x70, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
	0x22, 0xaf, 0x01, 0x0a, 0x0a, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x12,
	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x75, 0x72, 0x69,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x55, 0x72, 0x69,
	0x3a, 0x70, 0xea, 0x41, 0x6d, 0x0a, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x68, 0x6f,
	0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x12, 0x30, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2f,
	0x7b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x74, 0x6f,
	0x73, 0x2f, 0x7b, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
	0x63, 0x65, 0x7d, 0x2f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x2a, 0x0b, 0x70, 0x68, 0x6f, 0x74, 0x6f,
	0x4d, 0x65, 0x64, 0x69, 0x61, 0x73, 0x32, 0x0a, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64,
	0x69, 0x61, 0x22, 0xc4, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1d, 0x0a, 0x1b, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
	0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x28, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6c, 0x61, 0x6e,
	0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x67,
	0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
	0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12,
	0x28, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x73,
	0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc7, 0x07, 0x0a, 0x19, 0x41, 0x75,
	0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x69, 0x6e, 0x70,
	0x75, 0x74, 0x12, 0x67, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62,
	0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76,
	0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x61, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6c,
	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x14, 0x6c,
	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76,
	0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42,
	0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x16, 0x69, 0x6e, 0x63,
	0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x74, 0x79,
	0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x14,
	0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x54,
	0x79, 0x70, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64,
	0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20,
	0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
	0x65, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x28, 0x0a,
	0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75,
	0x61, 0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x6f,
	0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
	0x01, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a,
	0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c,
	0x6e, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12,
	0x26, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,
	0x09, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x69, 0x6e, 0x70, 0x75,
	0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75,
	0x64, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
	0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65,
	0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42,
	0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b,
	0x65, 0x6e, 0x1a, 0x8a, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42,
	0x69, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x67, 0x65, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72,
	0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x12, 0x37,
	0x0a, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x48, 0x00, 0x52,
	0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a,
	0x91, 0x01, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74,
	0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61,
	0x6e, 0x67, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x56, 0x69, 0x65,
	0x77, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67,
	0x6c, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73,
	0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x6c,
	0x65, 0x48, 0x00, 0x52, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74,
	0x79, 0x70, 0x65, 0x22, 0xd1, 0x0b, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70,
	0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
	0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65,
	0x73, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x1a, 0xd2, 0x0a, 0x0a, 0x0a, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x79, 0x0a, 0x10, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73,
	0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
	0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53,
	0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x50,
	0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x79, 0x0a, 0x10,
	0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41,
	0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65,
	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73,
	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63,
	0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65,
	0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e,
	0x67, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f,
	0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x74,
	0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64,
	0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65,
	0x6e, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x1a, 0x89, 0x01, 0x0a, 0x0f, 0x46, 0x6f, 0x72,
	0x6d, 0x61, 0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04,
	0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74,
	0x12, 0x62, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f,
	0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x74,
	0x63, 0x68, 0x65, 0x73, 0x1a, 0xf2, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75,
	0x72, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x69, 0x0a, 0x09, 0x6d, 0x61, 0x69,
	0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65,
	0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
	0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
	0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61,
	0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x08, 0x6d, 0x61, 0x69, 0x6e,
	0x54, 0x65, 0x78, 0x74, 0x12, 0x73, 0x0a, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72,
	0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65,
	0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
	0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
	0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61,
	0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x6f,
	0x6e, 0x64, 0x61, 0x72, 0x79, 0x54, 0x65, 0x78, 0x74, 0x1a, 0x81, 0x03, 0x0a, 0x0f, 0x50, 0x6c,
	0x61, 0x63, 0x65, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a,
	0x05, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0xfa, 0x41,
	0x1d, 0x0a, 0x1b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x05,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x69,
	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x49, 0x64,
	0x12, 0x60, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f, 0x72,
	0x6d, 0x61, 0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x04, 0x74, 0x65,
	0x78, 0x74, 0x12, 0x7a, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64,
	0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
	0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x75,
	0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x10, 0x73, 0x74,
	0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14,
	0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74,
	0x79, 0x70, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
	0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x64,
	0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0xef, 0x01,
	0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x60, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70,
	0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x6f,
	0x72, 0x6d, 0x61, 0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x04, 0x74,
	0x65, 0x78, 0x74, 0x12, 0x7a, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65,
	0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
	0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72,
	0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x10, 0x73,
	0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42,
	0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x32, 0xe1, 0x05, 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x63,
	0x65, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4e, 0x65, 0x61,
	0x72, 0x62, 0x79, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70,
	0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72,
	0x63, 0x68, 0x4e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
	0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4e, 0x65,
	0x61, 0x72, 0x62, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3,
	0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4e, 0x65, 0x61, 0x72, 0x62, 0x79,
	0x12, 0x83, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x12,
	0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65,
	0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76,
	0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22,
	0x15, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x61, 0x72,
	0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x12, 0x92, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x12, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31,
	0x2e, 0x47, 0x65, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,
	0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x22, 0x31, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61,
	0x6d, 0x65, 0x3d, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x70, 0x68, 0x6f, 0x74,
	0x6f, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x7d, 0x12, 0x74, 0x0a, 0x08, 0x47,
	0x65, 0x74, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
	0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
	0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x22, 0x22, 0xda,
	0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76,
	0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x2a,
	0x7d, 0x12, 0x9d, 0x01, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
	0x74, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31,
	0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61,
	0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e,
	0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x50,
	0x6c, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82,
	0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c,
	0x61, 0x63, 0x65, 0x73, 0x3a, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
	0x65, 0x1a, 0x18, 0xca, 0x41, 0x15, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0xa6, 0x01, 0x0a, 0x19,
	0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x61, 0x70, 0x73, 0x2e,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x42, 0x12, 0x50, 0x6c, 0x61, 0x63, 0x65,
	0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
	0x37, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
	0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73,
	0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x70, 0x62, 0x3b,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x06, 0x47, 0x4d,
	0x50, 0x53, 0x56, 0x31, 0xaa, 0x02, 0x15, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x4d, 0x61,
	0x70, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x4d, 0x61, 0x70, 0x73, 0x5c, 0x50, 0x6c, 0x61, 0x63, 0x65,
	0x73, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_maps_places_v1_places_service_proto_rawDescOnce sync.Once
	file_google_maps_places_v1_places_service_proto_rawDescData = file_google_maps_places_v1_places_service_proto_rawDesc
)

func file_google_maps_places_v1_places_service_proto_rawDescGZIP() []byte {
	file_google_maps_places_v1_places_service_proto_rawDescOnce.Do(func() {
		file_google_maps_places_v1_places_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_maps_places_v1_places_service_proto_rawDescData)
	})
	return file_google_maps_places_v1_places_service_proto_rawDescData
}

var file_google_maps_places_v1_places_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_google_maps_places_v1_places_service_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
var file_google_maps_places_v1_places_service_proto_goTypes = []interface{}{
	(SearchNearbyRequest_RankPreference)(0),                        // 0: google.maps.places.v1.SearchNearbyRequest.RankPreference
	(SearchTextRequest_RankPreference)(0),                          // 1: google.maps.places.v1.SearchTextRequest.RankPreference
	(*SearchNearbyRequest)(nil),                                    // 2: google.maps.places.v1.SearchNearbyRequest
	(*SearchNearbyResponse)(nil),                                   // 3: google.maps.places.v1.SearchNearbyResponse
	(*SearchTextRequest)(nil),                                      // 4: google.maps.places.v1.SearchTextRequest
	(*SearchTextResponse)(nil),                                     // 5: google.maps.places.v1.SearchTextResponse
	(*GetPhotoMediaRequest)(nil),                                   // 6: google.maps.places.v1.GetPhotoMediaRequest
	(*PhotoMedia)(nil),                                             // 7: google.maps.places.v1.PhotoMedia
	(*GetPlaceRequest)(nil),                                        // 8: google.maps.places.v1.GetPlaceRequest
	(*AutocompletePlacesRequest)(nil),                              // 9: google.maps.places.v1.AutocompletePlacesRequest
	(*AutocompletePlacesResponse)(nil),                             // 10: google.maps.places.v1.AutocompletePlacesResponse
	(*SearchNearbyRequest_LocationRestriction)(nil),                // 11: google.maps.places.v1.SearchNearbyRequest.LocationRestriction
	(*SearchTextRequest_LocationBias)(nil),                         // 12: google.maps.places.v1.SearchTextRequest.LocationBias
	(*SearchTextRequest_LocationRestriction)(nil),                  // 13: google.maps.places.v1.SearchTextRequest.LocationRestriction
	(*SearchTextRequest_EVOptions)(nil),                            // 14: google.maps.places.v1.SearchTextRequest.EVOptions
	(*AutocompletePlacesRequest_LocationBias)(nil),                 // 15: google.maps.places.v1.AutocompletePlacesRequest.LocationBias
	(*AutocompletePlacesRequest_LocationRestriction)(nil),          // 16: google.maps.places.v1.AutocompletePlacesRequest.LocationRestriction
	(*AutocompletePlacesResponse_Suggestion)(nil),                  // 17: google.maps.places.v1.AutocompletePlacesResponse.Suggestion
	(*AutocompletePlacesResponse_Suggestion_StringRange)(nil),      // 18: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StringRange
	(*AutocompletePlacesResponse_Suggestion_FormattableText)(nil),  // 19: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText
	(*AutocompletePlacesResponse_Suggestion_StructuredFormat)(nil), // 20: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StructuredFormat
	(*AutocompletePlacesResponse_Suggestion_PlacePrediction)(nil),  // 21: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.PlacePrediction
	(*AutocompletePlacesResponse_Suggestion_QueryPrediction)(nil),  // 22: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.QueryPrediction
	(*Place)(nil),             // 23: google.maps.places.v1.Place
	(PriceLevel)(0),           // 24: google.maps.places.v1.PriceLevel
	(*latlng.LatLng)(nil),     // 25: google.type.LatLng
	(*Circle)(nil),            // 26: google.maps.places.v1.Circle
	(*viewport.Viewport)(nil), // 27: google.geo.type.Viewport
	(EVConnectorType)(0),      // 28: google.maps.places.v1.EVConnectorType
}
var file_google_maps_places_v1_places_service_proto_depIdxs = []int32{
	11, // 0: google.maps.places.v1.SearchNearbyRequest.location_restriction:type_name -> google.maps.places.v1.SearchNearbyRequest.LocationRestriction
	0,  // 1: google.maps.places.v1.SearchNearbyRequest.rank_preference:type_name -> google.maps.places.v1.SearchNearbyRequest.RankPreference
	23, // 2: google.maps.places.v1.SearchNearbyResponse.places:type_name -> google.maps.places.v1.Place
	1,  // 3: google.maps.places.v1.SearchTextRequest.rank_preference:type_name -> google.maps.places.v1.SearchTextRequest.RankPreference
	24, // 4: google.maps.places.v1.SearchTextRequest.price_levels:type_name -> google.maps.places.v1.PriceLevel
	12, // 5: google.maps.places.v1.SearchTextRequest.location_bias:type_name -> google.maps.places.v1.SearchTextRequest.LocationBias
	13, // 6: google.maps.places.v1.SearchTextRequest.location_restriction:type_name -> google.maps.places.v1.SearchTextRequest.LocationRestriction
	14, // 7: google.maps.places.v1.SearchTextRequest.ev_options:type_name -> google.maps.places.v1.SearchTextRequest.EVOptions
	23, // 8: google.maps.places.v1.SearchTextResponse.places:type_name -> google.maps.places.v1.Place
	15, // 9: google.maps.places.v1.AutocompletePlacesRequest.location_bias:type_name -> google.maps.places.v1.AutocompletePlacesRequest.LocationBias
	16, // 10: google.maps.places.v1.AutocompletePlacesRequest.location_restriction:type_name -> google.maps.places.v1.AutocompletePlacesRequest.LocationRestriction
	25, // 11: google.maps.places.v1.AutocompletePlacesRequest.origin:type_name -> google.type.LatLng
	17, // 12: google.maps.places.v1.AutocompletePlacesResponse.suggestions:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion
	26, // 13: google.maps.places.v1.SearchNearbyRequest.LocationRestriction.circle:type_name -> google.maps.places.v1.Circle
	27, // 14: google.maps.places.v1.SearchTextRequest.LocationBias.rectangle:type_name -> google.geo.type.Viewport
	26, // 15: google.maps.places.v1.SearchTextRequest.LocationBias.circle:type_name -> google.maps.places.v1.Circle
	27, // 16: google.maps.places.v1.SearchTextRequest.LocationRestriction.rectangle:type_name -> google.geo.type.Viewport
	28, // 17: google.maps.places.v1.SearchTextRequest.EVOptions.connector_types:type_name -> google.maps.places.v1.EVConnectorType
	27, // 18: google.maps.places.v1.AutocompletePlacesRequest.LocationBias.rectangle:type_name -> google.geo.type.Viewport
	26, // 19: google.maps.places.v1.AutocompletePlacesRequest.LocationBias.circle:type_name -> google.maps.places.v1.Circle
	27, // 20: google.maps.places.v1.AutocompletePlacesRequest.LocationRestriction.rectangle:type_name -> google.geo.type.Viewport
	26, // 21: google.maps.places.v1.AutocompletePlacesRequest.LocationRestriction.circle:type_name -> google.maps.places.v1.Circle
	21, // 22: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.place_prediction:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.PlacePrediction
	22, // 23: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.query_prediction:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.QueryPrediction
	18, // 24: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText.matches:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StringRange
	19, // 25: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StructuredFormat.main_text:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText
	19, // 26: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StructuredFormat.secondary_text:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText
	19, // 27: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.PlacePrediction.text:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText
	20, // 28: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.PlacePrediction.structured_format:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StructuredFormat
	19, // 29: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.QueryPrediction.text:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.FormattableText
	20, // 30: google.maps.places.v1.AutocompletePlacesResponse.Suggestion.QueryPrediction.structured_format:type_name -> google.maps.places.v1.AutocompletePlacesResponse.Suggestion.StructuredFormat
	2,  // 31: google.maps.places.v1.Places.SearchNearby:input_type -> google.maps.places.v1.SearchNearbyRequest
	4,  // 32: google.maps.places.v1.Places.SearchText:input_type -> google.maps.places.v1.SearchTextRequest
	6,  // 33: google.maps.places.v1.Places.GetPhotoMedia:input_type -> google.maps.places.v1.GetPhotoMediaRequest
	8,  // 34: google.maps.places.v1.Places.GetPlace:input_type -> google.maps.places.v1.GetPlaceRequest
	9,  // 35: google.maps.places.v1.Places.AutocompletePlaces:input_type -> google.maps.places.v1.AutocompletePlacesRequest
	3,  // 36: google.maps.places.v1.Places.SearchNearby:output_type -> google.maps.places.v1.SearchNearbyResponse
	5,  // 37: google.maps.places.v1.Places.SearchText:output_type -> google.maps.places.v1.SearchTextResponse
	7,  // 38: google.maps.places.v1.Places.GetPhotoMedia:output_type -> google.maps.places.v1.PhotoMedia
	23, // 39: google.maps.places.v1.Places.GetPlace:output_type -> google.maps.places.v1.Place
	10, // 40: google.maps.places.v1.Places.AutocompletePlaces:output_type -> google.maps.places.v1.AutocompletePlacesResponse
	36, // [36:41] is the sub-list for method output_type
	31, // [31:36] is the sub-list for method input_type
	31, // [31:31] is the sub-list for extension type_name
	31, // [31:31] is the sub-list for extension extendee
	0,  // [0:31] is the sub-list for field type_name
}

func init() { file_google_maps_places_v1_places_service_proto_init() }
func file_google_maps_places_v1_places_service_proto_init() {
	if File_google_maps_places_v1_places_service_proto != nil {
		return
	}
	file_google_maps_places_v1_ev_charging_proto_init()
	file_google_maps_places_v1_geometry_proto_init()
	file_google_maps_places_v1_place_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_maps_places_v1_places_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchNearbyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchNearbyResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchTextRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchTextResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPhotoMediaRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PhotoMedia); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPlaceRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchNearbyRequest_LocationRestriction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchTextRequest_LocationBias); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchTextRequest_LocationRestriction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SearchTextRequest_EVOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesRequest_LocationBias); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesRequest_LocationRestriction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion_StringRange); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion_FormattableText); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion_StructuredFormat); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion_PlacePrediction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_maps_places_v1_places_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutocompletePlacesResponse_Suggestion_QueryPrediction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[9].OneofWrappers = []interface{}{
		(*SearchNearbyRequest_LocationRestriction_Circle)(nil),
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[10].OneofWrappers = []interface{}{
		(*SearchTextRequest_LocationBias_Rectangle)(nil),
		(*SearchTextRequest_LocationBias_Circle)(nil),
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[11].OneofWrappers = []interface{}{
		(*SearchTextRequest_LocationRestriction_Rectangle)(nil),
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[13].OneofWrappers = []interface{}{
		(*AutocompletePlacesRequest_LocationBias_Rectangle)(nil),
		(*AutocompletePlacesRequest_LocationBias_Circle)(nil),
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[14].OneofWrappers = []interface{}{
		(*AutocompletePlacesRequest_LocationRestriction_Rectangle)(nil),
		(*AutocompletePlacesRequest_LocationRestriction_Circle)(nil),
	}
	file_google_maps_places_v1_places_service_proto_msgTypes[15].OneofWrappers = []interface{}{
		(*AutocompletePlacesResponse_Suggestion_PlacePrediction_)(nil),
		(*AutocompletePlacesResponse_Suggestion_QueryPrediction_)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_maps_places_v1_places_service_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   21,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_google_maps_places_v1_places_service_proto_goTypes,
		DependencyIndexes: file_google_maps_places_v1_places_service_proto_depIdxs,
		EnumInfos:         file_google_maps_places_v1_places_service_proto_enumTypes,
		MessageInfos:      file_google_maps_places_v1_places_service_proto_msgTypes,
	}.Build()
	File_google_maps_places_v1_places_service_proto = out.File
	file_google_maps_places_v1_places_service_proto_rawDesc = nil
	file_google_maps_places_v1_places_service_proto_goTypes = nil
	file_google_maps_places_v1_places_service_proto_depIdxs = nil
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// PlacesClient is the client API for Places service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PlacesClient interface {
	// Search for places near locations.
	SearchNearby(ctx context.Context, in *SearchNearbyRequest, opts ...grpc.CallOption) (*SearchNearbyResponse, error)
	// Text query based place search.
	SearchText(ctx context.Context, in *SearchTextRequest, opts ...grpc.CallOption) (*SearchTextResponse, error)
	// Get a photo media with a photo reference string.
	GetPhotoMedia(ctx context.Context, in *GetPhotoMediaRequest, opts ...grpc.CallOption) (*PhotoMedia, error)
	// Get the details of a place based on its resource name, which is a string
	// in the `places/{place_id}` format.
	GetPlace(ctx context.Context, in *GetPlaceRequest, opts ...grpc.CallOption) (*Place, error)
	// Returns predictions for the given input.
	AutocompletePlaces(ctx context.Context, in *AutocompletePlacesRequest, opts ...grpc.CallOption) (*AutocompletePlacesResponse, error)
}

type placesClient struct {
	cc grpc.ClientConnInterface
}

func NewPlacesClient(cc grpc.ClientConnInterface) PlacesClient {
	return &placesClient{cc}
}

func (c *placesClient) SearchNearby(ctx context.Context, in *SearchNearbyRequest, opts ...grpc.CallOption) (*SearchNearbyResponse, error) {
	out := new(SearchNearbyResponse)
	err := c.cc.Invoke(ctx, "/google.maps.places.v1.Places/SearchNearby", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *placesClient) SearchText(ctx context.Context, in *SearchTextRequest, opts ...grpc.CallOption) (*SearchTextResponse, error) {
	out := new(SearchTextResponse)
	err := c.cc.Invoke(ctx, "/google.maps.places.v1.Places/SearchText", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *placesClient) GetPhotoMedia(ctx context.Context, in *GetPhotoMediaRequest, opts ...grpc.CallOption) (*PhotoMedia, error) {
	out := new(PhotoMedia)
	err := c.cc.Invoke(ctx, "/google.maps.places.v1.Places/GetPhotoMedia", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *placesClient) GetPlace(ctx context.Context, in *GetPlaceRequest, opts ...grpc.CallOption) (*Place, error) {
	out := new(Place)
	err := c.cc.Invoke(ctx, "/google.maps.places.v1.Places/GetPlace", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *placesClient) AutocompletePlaces(ctx context.Context, in *AutocompletePlacesRequest, opts ...grpc.CallOption) (*AutocompletePlacesResponse, error) {
	out := new(AutocompletePlacesResponse)
	err := c.cc.Invoke(ctx, "/google.maps.places.v1.Places/AutocompletePlaces", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PlacesServer is the server API for Places service.
type PlacesServer interface {
	// Search for places near locations.
	SearchNearby(context.Context, *SearchNearbyRequest) (*SearchNearbyResponse, error)
	// Text query based place search.
	SearchText(context.Context, *SearchTextRequest) (*SearchTextResponse, error)
	// Get a photo media with a photo reference string.
	GetPhotoMedia(context.Context, *GetPhotoMediaRequest) (*PhotoMedia, error)
	// Get the details of a place based on its resource name, which is a string
	// in the `places/{place_id}` format.
	GetPlace(context.Context, *GetPlaceRequest) (*Place, error)
	// Returns predictions for the given input.
	AutocompletePlaces(context.Context, *AutocompletePlacesRequest) (*AutocompletePlacesResponse, error)
}

// UnimplementedPlacesServer can be embedded to have forward compatible implementations.
type UnimplementedPlacesServer struct {
}

func (*UnimplementedPlacesServer) SearchNearby(context.Context, *SearchNearbyRequest) (*SearchNearbyResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SearchNearby not implemented")
}
func (*UnimplementedPlacesServer) SearchText(context.Context, *SearchTextRequest) (*SearchTextResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SearchText not implemented")
}
func (*UnimplementedPlacesServer) GetPhotoMedia(context.Context, *GetPhotoMediaRequest) (*PhotoMedia, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPhotoMedia not implemented")
}
func (*UnimplementedPlacesServer) GetPlace(context.Context, *GetPlaceRequest) (*Place, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPlace not implemented")
}
func (*UnimplementedPlacesServer) AutocompletePlaces(context.Context, *AutocompletePlacesRequest) (*AutocompletePlacesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AutocompletePlaces not implemented")
}

func RegisterPlacesServer(s *grpc.Server, srv PlacesServer) {
	s.RegisterService(&_Places_serviceDesc, srv)
}

func _Places_SearchNearby_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SearchNearbyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PlacesServer).SearchNearby(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.maps.places.v1.Places/SearchNearby",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PlacesServer).SearchNearby(ctx, req.(*SearchNearbyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Places_SearchText_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SearchTextRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PlacesServer).SearchText(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.maps.places.v1.Places/SearchText",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PlacesServer).SearchText(ctx, req.(*SearchTextRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Places_GetPhotoMedia_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetPhotoMediaRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PlacesServer).GetPhotoMedia(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.maps.places.v1.Places/GetPhotoMedia",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PlacesServer).GetPhotoMedia(ctx, req.(*GetPhotoMediaRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Places_GetPlace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetPlaceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PlacesServer).GetPlace(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.maps.places.v1.Places/GetPlace",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PlacesServer).GetPlace(ctx, req.(*GetPlaceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Places_AutocompletePlaces_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AutocompletePlacesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PlacesServer).AutocompletePlaces(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.maps.places.v1.Places/AutocompletePlaces",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PlacesServer).AutocompletePlaces(ctx, req.(*AutocompletePlacesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Places_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.maps.places.v1.Places",
	HandlerType: (*PlacesServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "SearchNearby",
			Handler:    _Places_SearchNearby_Handler,
		},
		{
			MethodName: "SearchText",
			Handler:    _Places_SearchText_Handler,
		},
		{
			MethodName: "GetPhotoMedia",
			Handler:    _Places_GetPhotoMedia_Handler,
		},
		{
			MethodName: "GetPlace",
			Handler:    _Places_GetPlace_Handler,
		},
		{
			MethodName: "AutocompletePlaces",
			Handler:    _Places_AutocompletePlaces_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/maps/places/v1/places_service.proto",
}
