// Code generated by protoc-gen-go. DO NOT EDIT.
// source: feeds.proto

package maps_booking_feeds

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

// Defines how a total price is determined from an availability.
type PriceType int32

const (
	// The price is for a fixed amount. This is the default value if the field is
	// not set.
	PriceType_FIXED_RATE_DEFAULT PriceType = 0
	// The price specified is per person, and the total price is calculated
	// according to the party size specified in Resources as
	// price_micros * party_size. A PER_PERSON price must be accompanied by a
	// party size in the availability resources. If it is not, a party size of one
	// is used.
	PriceType_PER_PERSON PriceType = 1
)

var PriceType_name = map[int32]string{
	0: "FIXED_RATE_DEFAULT",
	1: "PER_PERSON",
}

var PriceType_value = map[string]int32{
	"FIXED_RATE_DEFAULT": 0,
	"PER_PERSON":         1,
}

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}

func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
}

// Defines whether a credit card is required in order to book an appointment.
type RequireCreditCard int32

const (
	// The credit card requirement is not explicitly specified and the
	// behaviour is identical to the one specified for CONDITIONAL.
	RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED RequireCreditCard = 0
	// Google will require a credit card for the booking if any of the following
	// conditions are met:
	// * the availability has a price and the prepayment_type is REQUIRED
	// * the no_show_fee is set
	// * the deposit field is set.
	RequireCreditCard_REQUIRE_CREDIT_CARD_CONDITIONAL RequireCreditCard = 1
	// A credit card is always required in order to book this availability
	// regardless of other field values.
	RequireCreditCard_REQUIRE_CREDIT_CARD_ALWAYS RequireCreditCard = 2
)

var RequireCreditCard_name = map[int32]string{
	0: "REQUIRE_CREDIT_CARD_UNSPECIFIED",
	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
	2: "REQUIRE_CREDIT_CARD_ALWAYS",
}

var RequireCreditCard_value = map[string]int32{
	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
	"REQUIRE_CREDIT_CARD_ALWAYS":      2,
}

func (x RequireCreditCard) String() string {
	return proto.EnumName(RequireCreditCard_name, int32(x))
}

func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

// The platform that the action is performed on. Web application is the general
// fallback. It is recommended to have at least one ActionLink with
// ACTION_PLATFORM_WEB_APPLICATION. Links with Android and iOS as platform are
// only used on the respective system.
type ActionPlatform int32

const (
	// The platform is unspecified.
	ActionPlatform_ACTION_PLATFORM_UNSPECIFIED ActionPlatform = 0
	// The action platform is web in general.
	ActionPlatform_ACTION_PLATFORM_WEB_APPLICATION ActionPlatform = 1
	// The action platform is web on mobile devices.
	ActionPlatform_ACTION_PLATFORM_MOBILE_WEB ActionPlatform = 2
	// The action platform is Android OS.
	ActionPlatform_ACTION_PLATFORM_ANDROID ActionPlatform = 3
	// The action platform is iOS.
	ActionPlatform_ACTION_PLATFORM_IOS ActionPlatform = 4
)

var ActionPlatform_name = map[int32]string{
	0: "ACTION_PLATFORM_UNSPECIFIED",
	1: "ACTION_PLATFORM_WEB_APPLICATION",
	2: "ACTION_PLATFORM_MOBILE_WEB",
	3: "ACTION_PLATFORM_ANDROID",
	4: "ACTION_PLATFORM_IOS",
}

var ActionPlatform_value = map[string]int32{
	"ACTION_PLATFORM_UNSPECIFIED":     0,
	"ACTION_PLATFORM_WEB_APPLICATION": 1,
	"ACTION_PLATFORM_MOBILE_WEB":      2,
	"ACTION_PLATFORM_ANDROID":         3,
	"ACTION_PLATFORM_IOS":             4,
}

func (x ActionPlatform) String() string {
	return proto.EnumName(ActionPlatform_name, int32(x))
}

func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

type FeedMetadata_ProcessingInstruction int32

const (
	// By default we will assume that this feed is an incremental feed.
	FeedMetadata_PROCESS_UNKNOWN FeedMetadata_ProcessingInstruction = 0
	// This Feed message is one shard of a complete feed. Anything previously
	// supplied by this partner will be deleted; the contents of this feed
	// represent the entire state of the world.
	FeedMetadata_PROCESS_AS_COMPLETE FeedMetadata_ProcessingInstruction = 1
	// This Feed message is one shard of an incremental feed. Existing entities
	// will be left untouched except as modified in this feed.
	FeedMetadata_PROCESS_AS_INCREMENTAL FeedMetadata_ProcessingInstruction = 2
)

var FeedMetadata_ProcessingInstruction_name = map[int32]string{
	0: "PROCESS_UNKNOWN",
	1: "PROCESS_AS_COMPLETE",
	2: "PROCESS_AS_INCREMENTAL",
}

var FeedMetadata_ProcessingInstruction_value = map[string]int32{
	"PROCESS_UNKNOWN":        0,
	"PROCESS_AS_COMPLETE":    1,
	"PROCESS_AS_INCREMENTAL": 2,
}

func (x FeedMetadata_ProcessingInstruction) String() string {
	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}

func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
}

// Enum to indicate the prepayment type.
type Service_PrepaymentType int32

const (
	// By default we will assume that the prepayment is NOT_SUPPORTED.
	Service_PREPAYMENT_TYPE_UNSPECIFIED Service_PrepaymentType = 0
	// The user has to pay this service at the booking time.
	Service_REQUIRED Service_PrepaymentType = 1
	// The user can choose to pre-pay this service at the booking time or later,
	// but it is not required in order to book.
	Service_OPTIONAL Service_PrepaymentType = 2
	// The prepayment is not supported for this service.
	Service_NOT_SUPPORTED Service_PrepaymentType = 3
)

var Service_PrepaymentType_name = map[int32]string{
	0: "PREPAYMENT_TYPE_UNSPECIFIED",
	1: "REQUIRED",
	2: "OPTIONAL",
	3: "NOT_SUPPORTED",
}

var Service_PrepaymentType_value = map[string]int32{
	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
	"REQUIRED":                    1,
	"OPTIONAL":                    2,
	"NOT_SUPPORTED":               3,
}

func (x Service_PrepaymentType) String() string {
	return proto.EnumName(Service_PrepaymentType_name, int32(x))
}

func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
}

type Service_ServiceType int32

const (
	Service_SERVICE_TYPE_UNSPECIFIED        Service_ServiceType = 0
	Service_SERVICE_TYPE_DINING_RESERVATION Service_ServiceType = 1
	Service_SERVICE_TYPE_FOOD_ORDERING      Service_ServiceType = 2
	Service_SERVICE_TYPE_EVENT_TICKET       Service_ServiceType = 3
	Service_SERVICE_TYPE_TRIP_TOUR          Service_ServiceType = 4
)

var Service_ServiceType_name = map[int32]string{
	0: "SERVICE_TYPE_UNSPECIFIED",
	1: "SERVICE_TYPE_DINING_RESERVATION",
	2: "SERVICE_TYPE_FOOD_ORDERING",
	3: "SERVICE_TYPE_EVENT_TICKET",
	4: "SERVICE_TYPE_TRIP_TOUR",
}

var Service_ServiceType_value = map[string]int32{
	"SERVICE_TYPE_UNSPECIFIED":        0,
	"SERVICE_TYPE_DINING_RESERVATION": 1,
	"SERVICE_TYPE_FOOD_ORDERING":      2,
	"SERVICE_TYPE_EVENT_TICKET":       3,
	"SERVICE_TYPE_TRIP_TOUR":          4,
}

func (x Service_ServiceType) String() string {
	return proto.EnumName(Service_ServiceType_name, int32(x))
}

func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 1}
}

// Enum to indicate the type of field.
type ServiceIntakeFormField_FieldType int32

const (
	// Fields of unspecified or unknown type will be ignored.
	ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED ServiceIntakeFormField_FieldType = 0
	// A one-line input field for text.
	ServiceIntakeFormField_SHORT_ANSWER ServiceIntakeFormField_FieldType = 1
	// A multi-line input field for text.
	ServiceIntakeFormField_PARAGRAPH ServiceIntakeFormField_FieldType = 2
	// A set of radio buttons that requires one choice from many options.
	ServiceIntakeFormField_MULTIPLE_CHOICE ServiceIntakeFormField_FieldType = 3
	// One or more enumerated items with checkboxes.
	ServiceIntakeFormField_CHECKBOXES ServiceIntakeFormField_FieldType = 4
	// A selection from a dropdown.
	ServiceIntakeFormField_DROPDOWN ServiceIntakeFormField_FieldType = 5
	// A yes/no button.
	ServiceIntakeFormField_BOOLEAN ServiceIntakeFormField_FieldType = 6
)

var ServiceIntakeFormField_FieldType_name = map[int32]string{
	0: "FIELD_TYPE_UNSPECIFIED",
	1: "SHORT_ANSWER",
	2: "PARAGRAPH",
	3: "MULTIPLE_CHOICE",
	4: "CHECKBOXES",
	5: "DROPDOWN",
	6: "BOOLEAN",
}

var ServiceIntakeFormField_FieldType_value = map[string]int32{
	"FIELD_TYPE_UNSPECIFIED": 0,
	"SHORT_ANSWER":           1,
	"PARAGRAPH":              2,
	"MULTIPLE_CHOICE":        3,
	"CHECKBOXES":             4,
	"DROPDOWN":               5,
	"BOOLEAN":                6,
}

func (x ServiceIntakeFormField_FieldType) String() string {
	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
}

func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{11, 0}
}

// Enum to indicate the type of this media source. Only photos are supported.
// Please reach out to Google if supporting animations or videos is
// important to your feature and we will find the best solution for you.
type RelatedMedia_MediaType int32

const (
	// Unused.
	RelatedMedia_TYPE_UNSPECIFIED RelatedMedia_MediaType = 0
	// Indicates the media provided by the url is a photo.
	RelatedMedia_PHOTO RelatedMedia_MediaType = 1
)

var RelatedMedia_MediaType_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PHOTO",
}

var RelatedMedia_MediaType_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"PHOTO":            1,
}

func (x RelatedMedia_MediaType) String() string {
	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
}

func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
}

type FeedMetadata struct {
	// Instructs us how to process the feed: either as a shard of a complete feed,
	// or as a shard of an incremental update.
	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
	// The current shard and total number of shards for this feed.
	//
	// Shard number is assumed to be zero-based.
	//
	// There does not need to be any relationship to the file name.
	//
	// Shards do not need to be transferred in order, and they may not be
	// processed in order.
	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"`
	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"`
	// An identifier that must be consistent across all shards in a feed.
	// This value must be globally unique across each feed type.
	//
	// This value ensures that complete feeds spanning multiple shards are
	// processed together correctly.
	//
	// Clients only need to set this value when the processing_instruction is set
	// to PROCESS_AS_COMPLETE and the feed spans multiple shards (defined by
	// total_shards).
	//
	// Feeds that span multiple shards must set this nonce to the same value.
	Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"`
	// The timestamp at which this feed shard was generated.
	//
	// In Unix time format (seconds since the epoch).
	GenerationTimestamp  int64    `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FeedMetadata) Reset()         { *m = FeedMetadata{} }
func (m *FeedMetadata) String() string { return proto.CompactTextString(m) }
func (*FeedMetadata) ProtoMessage()    {}
func (*FeedMetadata) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
}

func (m *FeedMetadata) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FeedMetadata.Unmarshal(m, b)
}
func (m *FeedMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FeedMetadata.Marshal(b, m, deterministic)
}
func (m *FeedMetadata) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FeedMetadata.Merge(m, src)
}
func (m *FeedMetadata) XXX_Size() int {
	return xxx_messageInfo_FeedMetadata.Size(m)
}
func (m *FeedMetadata) XXX_DiscardUnknown() {
	xxx_messageInfo_FeedMetadata.DiscardUnknown(m)
}

var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo

func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
	if m != nil {
		return m.ProcessingInstruction
	}
	return FeedMetadata_PROCESS_UNKNOWN
}

func (m *FeedMetadata) GetShardNumber() int32 {
	if m != nil {
		return m.ShardNumber
	}
	return 0
}

func (m *FeedMetadata) GetTotalShards() int32 {
	if m != nil {
		return m.TotalShards
	}
	return 0
}

func (m *FeedMetadata) GetNonce() uint64 {
	if m != nil {
		return m.Nonce
	}
	return 0
}

func (m *FeedMetadata) GetGenerationTimestamp() int64 {
	if m != nil {
		return m.GenerationTimestamp
	}
	return 0
}

type AvailabilityFeed struct {
	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *AvailabilityFeed) Reset()         { *m = AvailabilityFeed{} }
func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
func (*AvailabilityFeed) ProtoMessage()    {}
func (*AvailabilityFeed) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b)
}
func (m *AvailabilityFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AvailabilityFeed.Marshal(b, m, deterministic)
}
func (m *AvailabilityFeed) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AvailabilityFeed.Merge(m, src)
}
func (m *AvailabilityFeed) XXX_Size() int {
	return xxx_messageInfo_AvailabilityFeed.Size(m)
}
func (m *AvailabilityFeed) XXX_DiscardUnknown() {
	xxx_messageInfo_AvailabilityFeed.DiscardUnknown(m)
}

var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo

func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *AvailabilityFeed) GetServiceAvailability() []*ServiceAvailability {
	if m != nil {
		return m.ServiceAvailability
	}
	return nil
}

type ServiceAvailability struct {
	// If provided, we will consider the Availability entities provided to be a
	// complete snapshot from [start_timestamp_restrict, end_timestamp_restrict).
	// That is, all existing availability will be deleted if the following
	// condition holds true:
	//
	//    start_timestamp_restrict <= Availability.start_sec &&
	//    Availability.start_sec < end_timestamp_restrict
	//
	// If a resource_restrict message is set, the condition is further restricted:
	//
	//    Availability.resource.staff_id == resource_restrict.staff_id &&
	//    Availability.resource.room_id == resource_restrict.room_id
	//
	// These fields are typically used to provide a complete update of
	// availability in a given time range.
	//
	// Setting start_timestamp_restrict while leaving end_timestamp_restrict unset
	// is interpreted to mean all time beginning at start_timestamp_restrict.
	//
	// Setting end_timestamp_restrict while leaving start_timestamp_restrict unset
	// is interpreted to mean all time up to the end_timestamp_restrict.
	//
	// In Unix time format (seconds since the epoch).
	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"`
	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"`
	// If provided, the timestamp restricts will be applied only to the given
	// merchant or service.
	//
	// These fields are typically used to provide complete snapshot of
	// availability in a given range (defined above) for a specific merchant or
	// service.
	//
	// Leaving these fields unset, or setting these to the empty string or null,
	// is interpreted to mean that no restrict is intended.
	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"`
	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"`
	// Setting resources_restrict further restricts the scope of the update to
	// just this set of resources. All id fields of the resources must match
	// exactly.
	ResourcesRestrict    *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"`
	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *ServiceAvailability) Reset()         { *m = ServiceAvailability{} }
func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
func (*ServiceAvailability) ProtoMessage()    {}
func (*ServiceAvailability) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b)
}
func (m *ServiceAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceAvailability.Marshal(b, m, deterministic)
}
func (m *ServiceAvailability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceAvailability.Merge(m, src)
}
func (m *ServiceAvailability) XXX_Size() int {
	return xxx_messageInfo_ServiceAvailability.Size(m)
}
func (m *ServiceAvailability) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceAvailability.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo

func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
	if m != nil {
		return m.StartTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetEndTimestampRestrict() int64 {
	if m != nil {
		return m.EndTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetMerchantIdRestrict() string {
	if m != nil {
		return m.MerchantIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetServiceIdRestrict() string {
	if m != nil {
		return m.ServiceIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetResourcesRestrict() *Resources {
	if m != nil {
		return m.ResourcesRestrict
	}
	return nil
}

func (m *ServiceAvailability) GetAvailability() []*Availability {
	if m != nil {
		return m.Availability
	}
	return nil
}

// An availability of the merchant's service, indicating time and number
// of spots.
// The availability feed should be a list of this message.
// Please note that it's up to the partner to call out all the possible
// availabilities.
// If a massage therapist is available 9am-12pm, and they provide
// one-hour massage sessions, the aggregator should provide the feed as
//   availability {start_sec: 9am, duration: 60 minutes, ...}
//   availability {start_sec: 10am, duration: 60 minutes, ...}
//   availability {start_sec: 11am, duration: 60 minutes, ...}
// instead of
//   availability {start_sec: 9am, duration: 180 minutes, ...}
//
type Availability struct {
	// An opaque string from an aggregator to identify a merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from aggregator to identify a service of the
	// merchant. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of this availability, using epoch time in seconds in UTC.
	// (required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
	// (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of total spots and open spots of this availability.
	// E.g. a Yoga class of 10 spots with 3 booked.
	//   availability {spots_total: 10, spots_open: 7 ...}
	// E.g. a chair massage session which was already booked.
	//   availability {spots_total: 1, spots_open: 0 ...}
	//
	// Note: If sending requests using the availability compression format defined
	//       below, these two fields will be inferred. A Recurrence
	//       implies spots_total=1 and spots_open=1. A ScheduleException implies
	//       spots_total=1 and spots_open=0.
	// (both required if recurrence not set)
	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"`
	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	// An optional opaque string to identify this availability slot. If set, it
	// will be included in the requests that book/update/cancel appointments.
	// (optional)
	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// Optional resources used to disambiguate this availability slot from
	// others when different staff, room, or party_size values are part
	// of the service.
	//
	// E.g. the same Yoga class with two 2 instructors.
	//  availability { resources { staff_id: "1" staff_name: "Amy" }
	//                 spots_total: 10 spots_open: 7 }
	//  availability { resources { staff_id: "2" staff_name: "John" }
	//                 spots_total: 5 spots_open: 2 }
	// (optional)
	Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"`
	// A list of IDs referencing the payment options which can be used to pay
	// for this slot. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants.
	//
	// This field overrides any payment_option_ids specified in the service
	// message. Similarly payment_option_ids specified here do NOT have to be
	// present in the service message, though must be defined at the
	// Merchant level.
	// Our current implementation limits the number of entries in this array to
	// one element. Multiple payment_option_id are still allowed at the Service
	// level, but an override at the availability slot level, is limited to a
	// single payment_option_id. (optional)
	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// The recurrence information for the availability, representing more than one
	// start time. A recurrence should contain appointments for one working day.
	// (optional)
	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"`
	// Times when this service cannot be scheduled. To limit the number of
	// schedule_exception messages, consider joining adjacent exceptions.
	// (optional)
	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"`
	// Defines how a deposit may be charged to the user. Overrides the service
	// deposit if one was specified. Setting this to an empty Deposit message
	// removes any service-level deposit. (optional)
	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Overrides the
	// service no show fee if one was specified. Setting this to an empty
	// NoShowFee message removes any service-level no show fee. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// availability slot.
	// If the value is not set, it is inherited from the service level if it's set
	// there. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// Indicates a list of supported ticket types for this availability slot. If
	// unset, all ticket types in the parent service are available for this slot.
	// Note that the values of this field must be defined in the parent service.
	// Examples:
	//
	// * Service with four ticket types:
	// TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"}
	// TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"}
	// TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"}
	// TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"}
	//
	// To represent the inventory during the weekdays:
	//   `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`.
	// To represent the inventory during the holidays:
	//   `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`.
	//
	// * Service with three ticket types:
	// TicketType {ticket_type_id: "adult" short_description: "Adult"}
	// TicketType {ticket_type_id: "youth" short_description: "Youth"}
	// TicketType {ticket_type_id: "senior" short_description: "Senior"}
	//
	// To indicate that all three ticket types are available for this time
	// slot, use either
	//   `availability {ticket_type_id: "adult" ticket_type_id: "youth"
	//   ticket_type_id: "senior" ...}`
	// or
	//   `availability {...}' (do not set ticket_type_id in this slot).
	//
	//  (optional)
	TicketTypeId         []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Availability) Reset()         { *m = Availability{} }
func (m *Availability) String() string { return proto.CompactTextString(m) }
func (*Availability) ProtoMessage()    {}
func (*Availability) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3}
}

func (m *Availability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability.Unmarshal(m, b)
}
func (m *Availability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability.Marshal(b, m, deterministic)
}
func (m *Availability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability.Merge(m, src)
}
func (m *Availability) XXX_Size() int {
	return xxx_messageInfo_Availability.Size(m)
}
func (m *Availability) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability.DiscardUnknown(m)
}

var xxx_messageInfo_Availability proto.InternalMessageInfo

func (m *Availability) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Availability) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Availability) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *Availability) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *Availability) GetSpotsTotal() int64 {
	if m != nil {
		return m.SpotsTotal
	}
	return 0
}

func (m *Availability) GetSpotsOpen() int64 {
	if m != nil {
		return m.SpotsOpen
	}
	return 0
}

func (m *Availability) GetAvailabilityTag() string {
	if m != nil {
		return m.AvailabilityTag
	}
	return ""
}

func (m *Availability) GetResources() *Resources {
	if m != nil {
		return m.Resources
	}
	return nil
}

func (m *Availability) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Availability) GetRecurrence() *Availability_Recurrence {
	if m != nil {
		return m.Recurrence
	}
	return nil
}

func (m *Availability) GetScheduleException() []*Availability_ScheduleException {
	if m != nil {
		return m.ScheduleException
	}
	return nil
}

func (m *Availability) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Availability) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Availability) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Availability) GetTicketTypeId() []string {
	if m != nil {
		return m.TicketTypeId
	}
	return nil
}

// Recurrence messages are optional, but allow for a more compact
// representation of consistently repeating availability slots. They typically
// represent a day's working schedule.
// ScheduleException messages are then used to represent booked/unavailable
// time ranges within the work day.
//
// Requirements:
//   1. The expansion of availability slots or recurrences must NOT create
//      identical slots. If the ids, start_sec, duration_sec, and resources
//      match, slots are considered identical.
//   2. Do NOT mix the standard availability format and recurrence within the
//      slots of a single service. Recurrence benefits merchants/services that
//      offer appointments. The standard format is geared towards
//      merchants/services with regularly scheduled classes.
type Availability_Recurrence struct {
	// The inclusive maximum UTC timestamp the availability repeats until.
	// (required)
	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
	// Defines the time between successive availability slots.
	//
	// Example: An availability with a duration of 20 min, a repeat_every_sec of
	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
	// 11-11:20am. (required)
	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Availability_Recurrence) Reset()         { *m = Availability_Recurrence{} }
func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) }
func (*Availability_Recurrence) ProtoMessage()    {}
func (*Availability_Recurrence) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
}

func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b)
}
func (m *Availability_Recurrence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability_Recurrence.Marshal(b, m, deterministic)
}
func (m *Availability_Recurrence) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability_Recurrence.Merge(m, src)
}
func (m *Availability_Recurrence) XXX_Size() int {
	return xxx_messageInfo_Availability_Recurrence.Size(m)
}
func (m *Availability_Recurrence) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability_Recurrence.DiscardUnknown(m)
}

var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo

func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
	if m != nil {
		return m.RepeatUntilSec
	}
	return 0
}

func (m *Availability_Recurrence) GetRepeatEverySec() int32 {
	if m != nil {
		return m.RepeatEverySec
	}
	return 0
}

// ScheduleException messages represent booked/unavailable time ranges within
// the workday, which are exceptions to the recurrence described above. As
// time slots are booked, the list of exceptions should be updated to reflect
// the newly unavailable time ranges. The recurrence itself shouldn't be
// modified.
type Availability_ScheduleException struct {
	// The time range of the exception. Any slots described by the recurrence
	// which overlap this closed-open time range will be considered unavailable.
	//
	// Example: If the recurrence specifies a duration of 20 min, a
	// repeat_every_sec of 30 min, a start_time of 9:00am, and a
	// repeat_until_sec of 11:00am, then a ScheduleException with a time_range
	// of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am,
	// 10-10:20am, and 10:30-10:50am.
	//
	// Note that because the time range is closed-open, the slot beginning at
	// 11am slot would not be impacted.
	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Availability_ScheduleException) Reset()         { *m = Availability_ScheduleException{} }
func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
func (*Availability_ScheduleException) ProtoMessage()    {}
func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 1}
}

func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b)
}
func (m *Availability_ScheduleException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability_ScheduleException.Marshal(b, m, deterministic)
}
func (m *Availability_ScheduleException) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability_ScheduleException.Merge(m, src)
}
func (m *Availability_ScheduleException) XXX_Size() int {
	return xxx_messageInfo_Availability_ScheduleException.Size(m)
}
func (m *Availability_ScheduleException) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability_ScheduleException.DiscardUnknown(m)
}

var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo

func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
	if m != nil {
		return m.TimeRange
	}
	return nil
}

// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
type Resources struct {
	// Optional id for a staff member providing the service. This field identifies
	// the staff member across all merchants, services, and availability records.
	// It also needs to be stable over time to allow correlation with past
	// bookings.
	// This field must be present if staff_name is present.
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// Optional name of a staff member providing the service. This field will be
	// displayed to users making a booking, and should be human readable, as
	// opposed to an opaque identifier.
	// This field must be present if staff_id is present.
	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
	// An optional id for the room the service is located in. This field
	// identifies the room across all merchants, services, and availability
	// records. It also needs to be stable over time to allow correlation with
	// past bookings.
	// This field must be present if room_name is present.
	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// An optional name for the room the service is located in. This
	// field will be displayed to users making a booking, and should be human
	// readable, as opposed to an opaque identifier.
	// This field must be present if room_id is present.
	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
	// Applicable only for Dining: The party size which can be accommodated
	// during this time slot. A restaurant can be associated with multiple Slots
	// for the same time, each specifying a different party_size, if for instance
	// 2, 3, or 4 people can be seated with a reservation.
	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Resources) Reset()         { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage()    {}
func (*Resources) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{4}
}

func (m *Resources) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Resources.Unmarshal(m, b)
}
func (m *Resources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Resources.Marshal(b, m, deterministic)
}
func (m *Resources) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Resources.Merge(m, src)
}
func (m *Resources) XXX_Size() int {
	return xxx_messageInfo_Resources.Size(m)
}
func (m *Resources) XXX_DiscardUnknown() {
	xxx_messageInfo_Resources.DiscardUnknown(m)
}

var xxx_messageInfo_Resources proto.InternalMessageInfo

func (m *Resources) GetStaffId() string {
	if m != nil {
		return m.StaffId
	}
	return ""
}

func (m *Resources) GetStaffName() string {
	if m != nil {
		return m.StaffName
	}
	return ""
}

func (m *Resources) GetRoomId() string {
	if m != nil {
		return m.RoomId
	}
	return ""
}

func (m *Resources) GetRoomName() string {
	if m != nil {
		return m.RoomName
	}
	return ""
}

func (m *Resources) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

type TimeRange struct {
	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TimeRange) Reset()         { *m = TimeRange{} }
func (m *TimeRange) String() string { return proto.CompactTextString(m) }
func (*TimeRange) ProtoMessage()    {}
func (*TimeRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{5}
}

func (m *TimeRange) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TimeRange.Unmarshal(m, b)
}
func (m *TimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TimeRange.Marshal(b, m, deterministic)
}
func (m *TimeRange) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TimeRange.Merge(m, src)
}
func (m *TimeRange) XXX_Size() int {
	return xxx_messageInfo_TimeRange.Size(m)
}
func (m *TimeRange) XXX_DiscardUnknown() {
	xxx_messageInfo_TimeRange.DiscardUnknown(m)
}

var xxx_messageInfo_TimeRange proto.InternalMessageInfo

func (m *TimeRange) GetBeginSec() int64 {
	if m != nil {
		return m.BeginSec
	}
	return 0
}

func (m *TimeRange) GetEndSec() int64 {
	if m != nil {
		return m.EndSec
	}
	return 0
}

type ServiceFeed struct {
	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Service              []*Service    `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *ServiceFeed) Reset()         { *m = ServiceFeed{} }
func (m *ServiceFeed) String() string { return proto.CompactTextString(m) }
func (*ServiceFeed) ProtoMessage()    {}
func (*ServiceFeed) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{6}
}

func (m *ServiceFeed) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceFeed.Unmarshal(m, b)
}
func (m *ServiceFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceFeed.Marshal(b, m, deterministic)
}
func (m *ServiceFeed) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceFeed.Merge(m, src)
}
func (m *ServiceFeed) XXX_Size() int {
	return xxx_messageInfo_ServiceFeed.Size(m)
}
func (m *ServiceFeed) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceFeed.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo

func (m *ServiceFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *ServiceFeed) GetService() []*Service {
	if m != nil {
		return m.Service
	}
	return nil
}

// The definition of a service provided by a merchant.
type Service struct {
	// An opaque string from an aggregator partner which uniquely identifies a
	// merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from an aggregator partner which uniquely identifies the
	// service. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// The name of the service, suitable for display to users, e.g. "Men's
	// haircut". (required)
	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// The description of the service, suitable for display to users.
	//
	// This field now supports both plain text and HTML-like formatting rules to
	// display structural contents to end-users. Unlike plain text sections,
	// customized layouts can be created here using headings, paragraphs, lists
	// and some phrase tags. Please read the following instructions and notes
	// carefully to create better user-experience.
	//
	// Supported HTML-like formatting tags:
	//
	// Heading tags: <h1>, <h2>, <h3>, <h4>, <h5>, <h6>
	//   Heading tags can be used to display titles and sub-titles. For example,
	//   <h1>Itinerary</h1> will display the inline text as the most important
	//   heading of the section. Note that any inner HTML tags, styles or
	//   attributes will be ignored. For example, <h1 style=".."> will be treated
	//   the same as <h1>. Only pure text wil be preserved.
	//
	// Paragraph tag: <p>:
	//   Paragraph tag can be used to wrap detailed introduction or contents. Any
	//   inner tags, styles or attributes will be ignored with a few exceptions:
	//   <br>, <strong> and <em>. Please see the phrase tag section below for more
	//   details.
	//
	// List tags: <ul>, <ol>, <li>
	//   <ul> tag can be used with <li> tag to display unordered lists, and <ol>
	//   tag can be used with <li> to display ordered lists. This is a good tool
	//   to display checklists, highlights or any other lists that fit your
	//   use-cases.
	// Example: To show a list of features of a cruise trip:
	//  <ol>
	//    <li>Wonderful ocean view and chances to play with wildlife.</li>
	//    <li>Carefully designed travel arrangements and services.</li>
	//    <li>Gauranteed lowest price.</li>
	// </ol>
	// Note that only <li> children under <ul> or <ol> tags will be converted. All
	// other children will be dropped. Also any inner tags, attributes and styles
	// will be ignored, only pure text contents are preserved.
	//
	// Division tag: <div>
	//   All supported inner tags of the <div> tag will be parsed with the rules
	//   stated above. But <div> tag itself does not mean any grouping or
	//   indenting here. Also any inner attributes and styles will be ignored.
	//
	// Phrase tags: <br>, <strong>, <em>:
	//   Only the three tags mentioned above are supported. <br> can be used to
	//   break lines in paragraphs, and <strong>/<em> can be used to highlight
	//   important text. Any other phrase tags will be ignored.
	//
	// Unsupported tags:
	//   * <html>, <header> and <body> tags are not allowed.
	//   * Any URLs, anchors, links will be striped, and will never be displayed
	//   to end-users. If you want to use photos to create a rich user experience,
	//   please use the "related_media" field below to send your photo urls
	//   * Any other tags not mentioned above are not supported (for example
	//   <table>, <td> ...).
	//
	// Important notes:
	//   * Try not to use other tags except for the supported ones mentioned
	//   above, because contents within unsupported tags will be excluded from UI
	//   rendering and may lead to undesired user experience.
	//   * Try avoid deep nested structures like more than 3 different heading
	//   levels or nested lists. Keeping the structure flat, simple and
	//   straightforward helps to create a better user experience.
	//   * If the currently supported layouts are not enough for your use cases,
	//   please contact Google with your requests and we will find the best
	//   approach for you.
	//
	// (required)
	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	// The price of the service. (optional, overridden when payment options or
	// ticket types present)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Rules to book/cancel an appointment. (optional)
	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
	// Intake forms to customize the service. (optional)
	//
	// Deprecated. Please see intake_form and per_ticket_intake_form.
	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Deprecated: Do not use.
	// A form requesting additional information from the user when they book this
	// service. (optional)
	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm,proto3" json:"intake_form,omitempty"`
	// A form requesting additional information from the user when they book this
	// service. This form must be filled out once for each ticket the user is
	// booking. (optional)
	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm,proto3" json:"per_ticket_intake_form,omitempty"`
	// Whether a prepayment is required, optional or not supported. (optional)
	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
	// The service's tax rate. If present this field overrides any tax_rate set at
	// the merchant level. An empty message (i.e. tax_rate { }) will reset the
	// applied tax rate to zero. (optional)
	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"`
	// A list of ids referencing the payment options which can be used to pay
	// for this service. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants. (optional)
	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// Defines how a deposit may be charged to the user. Can be overridden at the
	// availability level. (optional)
	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Can be overridden
	// at the availability level. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// service.
	// This value can be overridden at the availability level. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// An action link related to this service.
	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"`
	// The predefined type of this service. Currently, only used with action_link.
	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
	// Types of tickets that can be booked/purchased for this service, if tickets
	// are supported. (optional)
	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	// Photos related to this service. Google will crawl these media to
	// ensure that they are displayed to end-users in the most efficient way.
	// (optional)
	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"`
	// Service attribute values that apply to this service (optional).
	// Each Service may have zero or more values for each service attribute
	// defined in the corresponding Merchant.
	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
	// Rules related to joining the waitlist. Should be populated if the service
	// and merchant support waitlist functionality. Should not be populated
	// otherwise.
	WaitlistRules        *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules,proto3" json:"waitlist_rules,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Service) Reset()         { *m = Service{} }
func (m *Service) String() string { return proto.CompactTextString(m) }
func (*Service) ProtoMessage()    {}
func (*Service) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7}
}

func (m *Service) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Service.Unmarshal(m, b)
}
func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
}
func (m *Service) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Service.Merge(m, src)
}
func (m *Service) XXX_Size() int {
	return xxx_messageInfo_Service.Size(m)
}
func (m *Service) XXX_DiscardUnknown() {
	xxx_messageInfo_Service.DiscardUnknown(m)
}

var xxx_messageInfo_Service proto.InternalMessageInfo

func (m *Service) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Service) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

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

func (m *Service) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Service) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *Service) GetRules() *SchedulingRules {
	if m != nil {
		return m.Rules
	}
	return nil
}

// Deprecated: Do not use.
func (m *Service) GetForm() []*ServiceIntakeForm {
	if m != nil {
		return m.Form
	}
	return nil
}

func (m *Service) GetIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.IntakeForm
	}
	return nil
}

func (m *Service) GetPerTicketIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.PerTicketIntakeForm
	}
	return nil
}

func (m *Service) GetPrepaymentType() Service_PrepaymentType {
	if m != nil {
		return m.PrepaymentType
	}
	return Service_PREPAYMENT_TYPE_UNSPECIFIED
}

func (m *Service) GetTaxRate() *TaxRate {
	if m != nil {
		return m.TaxRate
	}
	return nil
}

func (m *Service) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Service) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Service) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Service) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Service) GetActionLink() []*ActionLink {
	if m != nil {
		return m.ActionLink
	}
	return nil
}

func (m *Service) GetType() Service_ServiceType {
	if m != nil {
		return m.Type
	}
	return Service_SERVICE_TYPE_UNSPECIFIED
}

func (m *Service) GetTicketType() []*TicketType {
	if m != nil {
		return m.TicketType
	}
	return nil
}

func (m *Service) GetRelatedMedia() []*RelatedMedia {
	if m != nil {
		return m.RelatedMedia
	}
	return nil
}

func (m *Service) GetServiceAttributeValueId() []*ServiceAttributeValueId {
	if m != nil {
		return m.ServiceAttributeValueId
	}
	return nil
}

func (m *Service) GetWaitlistRules() *WaitlistRules {
	if m != nil {
		return m.WaitlistRules
	}
	return nil
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
	// (required)
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Price) Reset()         { *m = Price{} }
func (m *Price) String() string { return proto.CompactTextString(m) }
func (*Price) ProtoMessage()    {}
func (*Price) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{8}
}

func (m *Price) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Price.Unmarshal(m, b)
}
func (m *Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Price.Marshal(b, m, deterministic)
}
func (m *Price) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Price.Merge(m, src)
}
func (m *Price) XXX_Size() int {
	return xxx_messageInfo_Price.Size(m)
}
func (m *Price) XXX_DiscardUnknown() {
	xxx_messageInfo_Price.DiscardUnknown(m)
}

var xxx_messageInfo_Price proto.InternalMessageInfo

func (m *Price) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

func (m *Price) GetCurrencyCode() string {
	if m != nil {
		return m.CurrencyCode
	}
	return ""
}

func (m *Price) GetPricingOptionTag() string {
	if m != nil {
		return m.PricingOptionTag
	}
	return ""
}

// The scheduling rules for a service.
type SchedulingRules struct {
	// The minimum advance notice in seconds required to book an appointment.
	// (optional)
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3" json:"min_advance_booking,omitempty"`
	// The minimum advance notice in seconds required to cancel a booked
	// appointment online. (optional)
	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"`
	// The fee for canceling within the minimum advance notice period.
	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
	// The fee for no-show without canceling.
	NoshowFee            *Price   `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SchedulingRules) Reset()         { *m = SchedulingRules{} }
func (m *SchedulingRules) String() string { return proto.CompactTextString(m) }
func (*SchedulingRules) ProtoMessage()    {}
func (*SchedulingRules) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{9}
}

func (m *SchedulingRules) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SchedulingRules.Unmarshal(m, b)
}
func (m *SchedulingRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SchedulingRules.Marshal(b, m, deterministic)
}
func (m *SchedulingRules) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SchedulingRules.Merge(m, src)
}
func (m *SchedulingRules) XXX_Size() int {
	return xxx_messageInfo_SchedulingRules.Size(m)
}
func (m *SchedulingRules) XXX_DiscardUnknown() {
	xxx_messageInfo_SchedulingRules.DiscardUnknown(m)
}

var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo

func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
	if m != nil {
		return m.MinAdvanceBooking
	}
	return 0
}

func (m *SchedulingRules) GetMinAdvanceOnlineCanceling() int64 {
	if m != nil {
		return m.MinAdvanceOnlineCanceling
	}
	return 0
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetLateCancellationFee() *Price {
	if m != nil {
		return m.LateCancellationFee
	}
	return nil
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetNoshowFee() *Price {
	if m != nil {
		return m.NoshowFee
	}
	return nil
}

// A tax rate applied when charging the user for a service, and which can be set
// on either a per merchant, or per service basis.
type TaxRate struct {
	// A tax rate in millionths of one percent, effectively giving 6 decimals of
	// precision. For example, if the tax rate is 7.253%, this field should be set
	// to 7253000.
	//
	// If this field is left unset or set to 0, the total price charged to a user
	// for any service provided by this merchant is the exact price specified by
	// Service.price. The service price is assumed to be exempt from or already
	// inclusive of applicable taxes. Taxes will not be shown to the user as a
	// separate line item.
	//
	// If this field is set to any nonzero value, the total price charged to a
	// user for any service provided by this merchant will include the service
	// price plus the tax assessed using the tax rate provided here. Fractions of
	// the smallest currency unit (for example, fractions of one cent) will be
	// rounded using nearest even rounding. Taxes will be shown to the user as a
	// separate line item. (required)
	MicroPercent         int32    `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TaxRate) Reset()         { *m = TaxRate{} }
func (m *TaxRate) String() string { return proto.CompactTextString(m) }
func (*TaxRate) ProtoMessage()    {}
func (*TaxRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{10}
}

func (m *TaxRate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TaxRate.Unmarshal(m, b)
}
func (m *TaxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TaxRate.Marshal(b, m, deterministic)
}
func (m *TaxRate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TaxRate.Merge(m, src)
}
func (m *TaxRate) XXX_Size() int {
	return xxx_messageInfo_TaxRate.Size(m)
}
func (m *TaxRate) XXX_DiscardUnknown() {
	xxx_messageInfo_TaxRate.DiscardUnknown(m)
}

var xxx_messageInfo_TaxRate proto.InternalMessageInfo

func (m *TaxRate) GetMicroPercent() int32 {
	if m != nil {
		return m.MicroPercent
	}
	return 0
}

// Defines a field that is included in a ServiceIntakeForm.
type ServiceIntakeFormField struct {
	// A string from an aggregator partner which uniquely identifies a form field.
	// This id should be the same as the id in the corresponding form field
	// answer. (required)
	Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
	// The type of this field. (required)
	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
	// The text shown to the user for this field. (required)
	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
	// (optional)
	Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
	// Indicates whether an answer to this field is required by a user. (optional)
	IsRequired           bool     `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceIntakeFormField) Reset()         { *m = ServiceIntakeFormField{} }
func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) }
func (*ServiceIntakeFormField) ProtoMessage()    {}
func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{11}
}

func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b)
}
func (m *ServiceIntakeFormField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceIntakeFormField.Marshal(b, m, deterministic)
}
func (m *ServiceIntakeFormField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceIntakeFormField.Merge(m, src)
}
func (m *ServiceIntakeFormField) XXX_Size() int {
	return xxx_messageInfo_ServiceIntakeFormField.Size(m)
}
func (m *ServiceIntakeFormField) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceIntakeFormField.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo

func (m *ServiceIntakeFormField) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *ServiceIntakeFormField) GetType() ServiceIntakeFormField_FieldType {
	if m != nil {
		return m.Type
	}
	return ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED
}

func (m *ServiceIntakeFormField) GetLabel() string {
	if m != nil {
		return m.Label
	}
	return ""
}

func (m *ServiceIntakeFormField) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ServiceIntakeFormField) GetIsRequired() bool {
	if m != nil {
		return m.IsRequired
	}
	return false
}

// Defines an intake form that customizes the service provided by a merchant.
type ServiceIntakeForm struct {
	// Fields that will be displayed to the user. (required)
	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
	// If true, this form will be shown to first time customers.
	// Deprecated. This functionality is not supported for intake forms.
	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
	// If true, this form will be shown to repeat customers.
	// Deprecated. This functionality is not supported for intake forms.
	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceIntakeForm) Reset()         { *m = ServiceIntakeForm{} }
func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) }
func (*ServiceIntakeForm) ProtoMessage()    {}
func (*ServiceIntakeForm) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{12}
}

func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b)
}
func (m *ServiceIntakeForm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceIntakeForm.Marshal(b, m, deterministic)
}
func (m *ServiceIntakeForm) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceIntakeForm.Merge(m, src)
}
func (m *ServiceIntakeForm) XXX_Size() int {
	return xxx_messageInfo_ServiceIntakeForm.Size(m)
}
func (m *ServiceIntakeForm) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceIntakeForm.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo

func (m *ServiceIntakeForm) GetField() []*ServiceIntakeFormField {
	if m != nil {
		return m.Field
	}
	return nil
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
	if m != nil {
		return m.FirstTimeCustomers
	}
	return false
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetReturningCustomers() bool {
	if m != nil {
		return m.ReturningCustomers
	}
	return false
}

// A deposit that the user may be charged or have a hold on their credit card
// for.
type Deposit struct {
	// Deposit amount.
	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"`
	// Defines how the deposit is determined from the availability.
	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *Deposit) Reset()         { *m = Deposit{} }
func (m *Deposit) String() string { return proto.CompactTextString(m) }
func (*Deposit) ProtoMessage()    {}
func (*Deposit) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{13}
}

func (m *Deposit) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Deposit.Unmarshal(m, b)
}
func (m *Deposit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Deposit.Marshal(b, m, deterministic)
}
func (m *Deposit) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Deposit.Merge(m, src)
}
func (m *Deposit) XXX_Size() int {
	return xxx_messageInfo_Deposit.Size(m)
}
func (m *Deposit) XXX_DiscardUnknown() {
	xxx_messageInfo_Deposit.DiscardUnknown(m)
}

var xxx_messageInfo_Deposit proto.InternalMessageInfo

func (m *Deposit) GetDeposit() *Price {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
	if m != nil {
		return m.MinAdvanceCancellationSec
	}
	return 0
}

func (m *Deposit) GetDepositType() PriceType {
	if m != nil {
		return m.DepositType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// A fee that a user may be charged if they have made a booking but do not
// show up.
type NoShowFee struct {
	// The amount the user may be charged if they do not show up for their
	// reservation.
	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *NoShowFee) Reset()         { *m = NoShowFee{} }
func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
func (*NoShowFee) ProtoMessage()    {}
func (*NoShowFee) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{14}
}

func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
}
func (m *NoShowFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NoShowFee.Marshal(b, m, deterministic)
}
func (m *NoShowFee) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NoShowFee.Merge(m, src)
}
func (m *NoShowFee) XXX_Size() int {
	return xxx_messageInfo_NoShowFee.Size(m)
}
func (m *NoShowFee) XXX_DiscardUnknown() {
	xxx_messageInfo_NoShowFee.DiscardUnknown(m)
}

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

func (m *NoShowFee) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

func (m *NoShowFee) GetFeeType() PriceType {
	if m != nil {
		return m.FeeType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// An action URL with associated language, list of countries restricted to, and
// optional platform that indicates which platform this action should be
// performed on.
type ActionLink struct {
	// The entry point URL for this action link.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// The BCP-47 language tag identifying the language in which the content
	// from this URI is available.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"`
	// The platform that this action should be performed on. If this field is
	// unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
	Platform             ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *ActionLink) Reset()         { *m = ActionLink{} }
func (m *ActionLink) String() string { return proto.CompactTextString(m) }
func (*ActionLink) ProtoMessage()    {}
func (*ActionLink) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{15}
}

func (m *ActionLink) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ActionLink.Unmarshal(m, b)
}
func (m *ActionLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ActionLink.Marshal(b, m, deterministic)
}
func (m *ActionLink) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ActionLink.Merge(m, src)
}
func (m *ActionLink) XXX_Size() int {
	return xxx_messageInfo_ActionLink.Size(m)
}
func (m *ActionLink) XXX_DiscardUnknown() {
	xxx_messageInfo_ActionLink.DiscardUnknown(m)
}

var xxx_messageInfo_ActionLink proto.InternalMessageInfo

func (m *ActionLink) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ActionLink) GetLanguage() string {
	if m != nil {
		return m.Language
	}
	return ""
}

func (m *ActionLink) GetRestrictedCountry() []string {
	if m != nil {
		return m.RestrictedCountry
	}
	return nil
}

func (m *ActionLink) GetPlatform() ActionPlatform {
	if m != nil {
		return m.Platform
	}
	return ActionPlatform_ACTION_PLATFORM_UNSPECIFIED
}

// TicketType is used to differentiate among tickets (where a ticket can be a
// spot on a raft trip, an admission to a museum, etc.) with different prices
// and/or availabilities due to different user types or different service
// attributes.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price                *Price   `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TicketType) Reset()         { *m = TicketType{} }
func (m *TicketType) String() string { return proto.CompactTextString(m) }
func (*TicketType) ProtoMessage()    {}
func (*TicketType) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{16}
}

func (m *TicketType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TicketType.Unmarshal(m, b)
}
func (m *TicketType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TicketType.Marshal(b, m, deterministic)
}
func (m *TicketType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TicketType.Merge(m, src)
}
func (m *TicketType) XXX_Size() int {
	return xxx_messageInfo_TicketType.Size(m)
}
func (m *TicketType) XXX_DiscardUnknown() {
	xxx_messageInfo_TicketType.DiscardUnknown(m)
}

var xxx_messageInfo_TicketType proto.InternalMessageInfo

func (m *TicketType) GetTicketTypeId() string {
	if m != nil {
		return m.TicketTypeId
	}
	return ""
}

func (m *TicketType) GetShortDescription() string {
	if m != nil {
		return m.ShortDescription
	}
	return ""
}

func (m *TicketType) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

// Defines a media source. This field only contains the URL of this media source
// (only photos are supported for now). Google will crawl the media data to
// ensure that they are displayed to end-users in the most efficient way.
type RelatedMedia struct {
	// URL of this media source.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. (optional)
	Caption              string   `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RelatedMedia) Reset()         { *m = RelatedMedia{} }
func (m *RelatedMedia) String() string { return proto.CompactTextString(m) }
func (*RelatedMedia) ProtoMessage()    {}
func (*RelatedMedia) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{17}
}

func (m *RelatedMedia) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RelatedMedia.Unmarshal(m, b)
}
func (m *RelatedMedia) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RelatedMedia.Marshal(b, m, deterministic)
}
func (m *RelatedMedia) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RelatedMedia.Merge(m, src)
}
func (m *RelatedMedia) XXX_Size() int {
	return xxx_messageInfo_RelatedMedia.Size(m)
}
func (m *RelatedMedia) XXX_DiscardUnknown() {
	xxx_messageInfo_RelatedMedia.DiscardUnknown(m)
}

var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo

func (m *RelatedMedia) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *RelatedMedia) GetType() RelatedMedia_MediaType {
	if m != nil {
		return m.Type
	}
	return RelatedMedia_TYPE_UNSPECIFIED
}

func (m *RelatedMedia) GetCaption() string {
	if m != nil {
		return m.Caption
	}
	return ""
}

// Identifies a particular value of a service attribute to be applied to a
// Service.
type ServiceAttributeValueId struct {
	// ID of an attribute as defined in Merchant.service_attribute, e.g.
	// "service-type".
	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"`
	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
	// in the service attribute definition.
	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceAttributeValueId) Reset()         { *m = ServiceAttributeValueId{} }
func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) }
func (*ServiceAttributeValueId) ProtoMessage()    {}
func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{18}
}

func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b)
}
func (m *ServiceAttributeValueId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceAttributeValueId.Marshal(b, m, deterministic)
}
func (m *ServiceAttributeValueId) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceAttributeValueId.Merge(m, src)
}
func (m *ServiceAttributeValueId) XXX_Size() int {
	return xxx_messageInfo_ServiceAttributeValueId.Size(m)
}
func (m *ServiceAttributeValueId) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceAttributeValueId.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo

func (m *ServiceAttributeValueId) GetAttributeId() string {
	if m != nil {
		return m.AttributeId
	}
	return ""
}

func (m *ServiceAttributeValueId) GetValueId() string {
	if m != nil {
		return m.ValueId
	}
	return ""
}

// Rules related to joining the waitlist.
type WaitlistRules struct {
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize,proto3" json:"min_party_size,omitempty"`
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize,proto3" json:"max_party_size,omitempty"`
	// If true, the user will be able to send a free-form additional text request
	// when joining the waitlist for this service.
	SupportsAdditionalRequest bool     `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest,proto3" json:"supports_additional_request,omitempty"`
	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
	XXX_unrecognized          []byte   `json:"-"`
	XXX_sizecache             int32    `json:"-"`
}

func (m *WaitlistRules) Reset()         { *m = WaitlistRules{} }
func (m *WaitlistRules) String() string { return proto.CompactTextString(m) }
func (*WaitlistRules) ProtoMessage()    {}
func (*WaitlistRules) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{19}
}

func (m *WaitlistRules) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitlistRules.Unmarshal(m, b)
}
func (m *WaitlistRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitlistRules.Marshal(b, m, deterministic)
}
func (m *WaitlistRules) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitlistRules.Merge(m, src)
}
func (m *WaitlistRules) XXX_Size() int {
	return xxx_messageInfo_WaitlistRules.Size(m)
}
func (m *WaitlistRules) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitlistRules.DiscardUnknown(m)
}

var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo

func (m *WaitlistRules) GetMinPartySize() int32 {
	if m != nil {
		return m.MinPartySize
	}
	return 0
}

func (m *WaitlistRules) GetMaxPartySize() int32 {
	if m != nil {
		return m.MaxPartySize
	}
	return 0
}

func (m *WaitlistRules) GetSupportsAdditionalRequest() bool {
	if m != nil {
		return m.SupportsAdditionalRequest
	}
	return false
}

func init() {
	proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
	proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
	proto.RegisterType((*ServiceAvailability)(nil), "maps.booking.feeds.ServiceAvailability")
	proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
	proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
	proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
	proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
	proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
	proto.RegisterType((*ServiceFeed)(nil), "maps.booking.feeds.ServiceFeed")
	proto.RegisterType((*Service)(nil), "maps.booking.feeds.Service")
	proto.RegisterType((*Price)(nil), "maps.booking.feeds.Price")
	proto.RegisterType((*SchedulingRules)(nil), "maps.booking.feeds.SchedulingRules")
	proto.RegisterType((*TaxRate)(nil), "maps.booking.feeds.TaxRate")
	proto.RegisterType((*ServiceIntakeFormField)(nil), "maps.booking.feeds.ServiceIntakeFormField")
	proto.RegisterType((*ServiceIntakeForm)(nil), "maps.booking.feeds.ServiceIntakeForm")
	proto.RegisterType((*Deposit)(nil), "maps.booking.feeds.Deposit")
	proto.RegisterType((*NoShowFee)(nil), "maps.booking.feeds.NoShowFee")
	proto.RegisterType((*ActionLink)(nil), "maps.booking.feeds.ActionLink")
	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("maps.booking.feeds.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
	proto.RegisterEnum("maps.booking.feeds.ActionPlatform", ActionPlatform_name, ActionPlatform_value)
	proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
	proto.RegisterEnum("maps.booking.feeds.Service_PrepaymentType", Service_PrepaymentType_name, Service_PrepaymentType_value)
	proto.RegisterEnum("maps.booking.feeds.Service_ServiceType", Service_ServiceType_name, Service_ServiceType_value)
	proto.RegisterEnum("maps.booking.feeds.ServiceIntakeFormField_FieldType", ServiceIntakeFormField_FieldType_name, ServiceIntakeFormField_FieldType_value)
	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
}

func init() { proto.RegisterFile("feeds.proto", fileDescriptor_7aa923a38d4cd9d3) }

var fileDescriptor_7aa923a38d4cd9d3 = []byte{
	// 2434 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcf, 0x73, 0xdb, 0xc6,
	0xf5, 0x0f, 0x49, 0xd1, 0x24, 0x1f, 0x29, 0x09, 0x5a, 0xc9, 0x12, 0x6d, 0xc7, 0xb1, 0x82, 0x7c,
	0x33, 0x5f, 0xd7, 0x4e, 0xd5, 0xd6, 0x4e, 0x32, 0xe9, 0xe4, 0x27, 0x4d, 0x82, 0x31, 0xc6, 0x14,
	0x81, 0x2c, 0xa9, 0x28, 0xce, 0x65, 0x03, 0x01, 0x2b, 0x09, 0x63, 0x12, 0x60, 0x17, 0xa0, 0x6d,
	0x65, 0x26, 0x97, 0x9e, 0x7a, 0xec, 0x4c, 0x6f, 0xed, 0x4c, 0xcf, 0xed, 0x34, 0x7f, 0x41, 0x4f,
	0xed, 0xb5, 0xff, 0x4c, 0xff, 0x80, 0x5e, 0x3a, 0xfb, 0x16, 0x04, 0x40, 0x09, 0xb2, 0x9d, 0x26,
	0x17, 0x19, 0xfb, 0xde, 0xe7, 0xbd, 0xdd, 0x7d, 0xbb, 0xef, 0xf3, 0xde, 0xd2, 0xd0, 0x3c, 0xe6,
	0xdc, 0x8b, 0xf6, 0x66, 0x22, 0x8c, 0x43, 0x42, 0xa6, 0xce, 0x2c, 0xda, 0x3b, 0x0a, 0xc3, 0x27,
	0x7e, 0x70, 0xb2, 0x87, 0x1a, 0xfd, 0xdf, 0x65, 0x68, 0xf5, 0x39, 0xf7, 0xf6, 0x79, 0xec, 0x78,
	0x4e, 0xec, 0x90, 0x29, 0x6c, 0xcf, 0x44, 0xe8, 0xf2, 0x28, 0xf2, 0x83, 0x13, 0xe6, 0x07, 0x51,
	0x2c, 0xe6, 0x6e, 0xec, 0x87, 0x41, 0xbb, 0xb4, 0x5b, 0xba, 0xbd, 0x76, 0xef, 0xfd, 0xbd, 0x8b,
	0x5e, 0xf6, 0xf2, 0x1e, 0xf6, 0xec, 0xd4, 0xdc, 0xcc, 0xac, 0xe9, 0xd5, 0x59, 0x91, 0x98, 0xbc,
	0x09, 0xad, 0xe8, 0xd4, 0x11, 0x1e, 0x0b, 0xe6, 0xd3, 0x23, 0x2e, 0xda, 0xe5, 0xdd, 0xd2, 0xed,
	0x2a, 0x6d, 0xa2, 0x6c, 0x88, 0x22, 0x09, 0x89, 0xc3, 0xd8, 0x99, 0x30, 0x14, 0x46, 0xed, 0x8a,
	0x82, 0xa0, 0x6c, 0x84, 0x22, 0xb2, 0x05, 0xd5, 0x20, 0x0c, 0x5c, 0xde, 0xae, 0xee, 0x96, 0x6e,
	0xaf, 0x50, 0x35, 0x20, 0xbf, 0x82, 0xad, 0x13, 0x1e, 0x70, 0xe1, 0xc8, 0x99, 0x58, 0xec, 0x4f,
	0x79, 0x14, 0x3b, 0xd3, 0x59, 0x7b, 0x65, 0xb7, 0x74, 0xbb, 0x42, 0x37, 0x33, 0xdd, 0x78, 0xa1,
	0xd2, 0x1d, 0xb8, 0x5a, 0xb8, 0x7c, 0xb2, 0x09, 0xeb, 0x36, 0xb5, 0xba, 0xc6, 0x68, 0xc4, 0x0e,
	0x86, 0x8f, 0x86, 0xd6, 0xe1, 0x50, 0x7b, 0x8d, 0xec, 0xc0, 0xe6, 0x42, 0xd8, 0x19, 0xb1, 0xae,
	0xb5, 0x6f, 0x0f, 0x8c, 0xb1, 0xa1, 0x95, 0xc8, 0x75, 0xd8, 0xce, 0x29, 0xcc, 0x61, 0x97, 0x1a,
	0xfb, 0xc6, 0x70, 0xdc, 0x19, 0x68, 0x65, 0xfd, 0xfb, 0x12, 0x68, 0x9d, 0xa7, 0x8e, 0x3f, 0x71,
	0x8e, 0xfc, 0x89, 0x1f, 0x9f, 0xc9, 0xd8, 0x91, 0x8f, 0xa0, 0x3e, 0x4d, 0xe2, 0x87, 0x71, 0x6e,
	0xde, 0xdb, 0x7d, 0x59, 0x9c, 0x69, 0x6a, 0x41, 0xbe, 0x86, 0xad, 0x88, 0x8b, 0xa7, 0xbe, 0xcb,
	0x99, 0x93, 0xf3, 0xdc, 0x2e, 0xef, 0x56, 0x6e, 0x37, 0xef, 0xfd, 0x7f, 0x91, 0xa7, 0x91, 0xc2,
	0xe7, 0x17, 0x42, 0x37, 0xa3, 0x8b, 0x42, 0xfd, 0x3f, 0x65, 0xd8, 0x2c, 0x00, 0x93, 0x0f, 0xa0,
	0x1d, 0xc5, 0x8e, 0x88, 0xb3, 0xb8, 0x32, 0xc1, 0xa3, 0x58, 0xf8, 0x6e, 0x8c, 0x3b, 0xa8, 0xd0,
	0x6d, 0xd4, 0xa7, 0xb1, 0xa5, 0x89, 0x96, 0xbc, 0x0b, 0xdb, 0x3c, 0xf0, 0x8a, 0xec, 0xca, 0x68,
	0xb7, 0xc5, 0x03, 0xef, 0xa2, 0xd5, 0x2f, 0x61, 0x6b, 0xca, 0x85, 0x7b, 0xea, 0x04, 0x31, 0xf3,
	0xbd, 0xcc, 0x46, 0xde, 0x86, 0x06, 0x25, 0x0b, 0x9d, 0xe9, 0xa5, 0x16, 0x7b, 0xb0, 0xd8, 0xd0,
	0x92, 0xc1, 0x0a, 0x1a, 0x6c, 0x24, 0xaa, 0x1c, 0x7e, 0x00, 0x44, 0xf0, 0x28, 0x9c, 0x0b, 0x97,
	0x47, 0x19, 0xfc, 0x0a, 0x9e, 0xc6, 0xcd, 0xa2, 0x18, 0xd2, 0x05, 0x9a, 0x6e, 0xa4, 0x86, 0xa9,
	0xb7, 0x1e, 0xb4, 0x96, 0xce, 0xa2, 0x8a, 0x67, 0x51, 0x78, 0xaa, 0x4b, 0x87, 0xb0, 0x64, 0xa5,
	0xff, 0xbd, 0x06, 0xad, 0xa5, 0xb0, 0xdf, 0x82, 0x66, 0x2e, 0x0c, 0x18, 0xe9, 0x06, 0x85, 0x6c,
	0xf7, 0xe4, 0x26, 0x40, 0xb6, 0x6b, 0x8c, 0x68, 0x83, 0x36, 0xd2, 0xcd, 0x92, 0x1b, 0xd0, 0x50,
	0xc7, 0x16, 0x71, 0x17, 0x63, 0x57, 0xa1, 0x75, 0x14, 0x8c, 0xb8, 0x2b, 0x33, 0xcd, 0x9b, 0x27,
	0xe9, 0x22, 0xf5, 0x2a, 0x51, 0x9a, 0x0b, 0x99, 0x84, 0xdc, 0x82, 0x66, 0x34, 0x0b, 0xe3, 0x88,
	0x61, 0xfa, 0x61, 0xbe, 0x55, 0x28, 0xa0, 0x68, 0x2c, 0x25, 0x38, 0x3f, 0x02, 0xc2, 0x19, 0x0f,
	0x30, 0x7a, 0x15, 0xda, 0x40, 0x89, 0x35, 0xe3, 0x01, 0xf9, 0x19, 0x68, 0xf9, 0x0d, 0xb2, 0xd8,
	0x39, 0x69, 0xd7, 0x70, 0x91, 0xeb, 0x79, 0xf9, 0xd8, 0x39, 0x21, 0x1f, 0x42, 0x23, 0x0d, 0x6b,
	0xbb, 0xfe, 0x2a, 0xc7, 0x90, 0xe1, 0xc9, 0x1d, 0xd8, 0x98, 0x39, 0x67, 0x53, 0x1e, 0xc4, 0x2c,
	0x9c, 0xe1, 0x86, 0x7c, 0xaf, 0xdd, 0xd8, 0xad, 0xc8, 0x89, 0x12, 0x85, 0x85, 0x72, 0xd3, 0x23,
	0x8f, 0x00, 0x04, 0x77, 0xe7, 0x42, 0x70, 0x49, 0x21, 0x80, 0x33, 0xdd, 0x7d, 0xd9, 0x41, 0xed,
	0xd1, 0xd4, 0x84, 0xe6, 0xcc, 0x89, 0x03, 0x24, 0x72, 0x4f, 0xb9, 0x37, 0x9f, 0x70, 0xc6, 0x9f,
	0xbb, 0x1c, 0x27, 0x69, 0x37, 0xf1, 0xf4, 0xef, 0xbd, 0xd4, 0xe9, 0x28, 0x31, 0x35, 0x16, 0x96,
	0x74, 0x23, 0x3a, 0x2f, 0x22, 0xef, 0x41, 0xcd, 0xe3, 0xb3, 0x30, 0xf2, 0xe3, 0x76, 0x0b, 0x17,
	0x7b, 0xa3, 0xc8, 0x6f, 0x4f, 0x41, 0xe8, 0x02, 0x4b, 0x3e, 0x86, 0x66, 0x10, 0xb2, 0xe8, 0x34,
	0x7c, 0xc6, 0x8e, 0x39, 0x6f, 0xaf, 0x5e, 0x1e, 0xd1, 0x61, 0x38, 0x3a, 0x0d, 0x9f, 0xf5, 0x39,
	0xa7, 0x8d, 0x60, 0xf1, 0x49, 0x0e, 0x60, 0x53, 0xf0, 0xdf, 0xcc, 0x7d, 0xc1, 0x99, 0x2b, 0xb8,
	0xe7, 0xc7, 0xcc, 0x75, 0x84, 0xd7, 0x5e, 0xc3, 0xaa, 0xf0, 0x76, 0xf1, 0xc1, 0x20, 0xbc, 0x8b,
	0xe8, 0xae, 0x23, 0x3c, 0x99, 0x27, 0xe7, 0x44, 0xe4, 0xff, 0x60, 0x2d, 0xf6, 0xdd, 0x27, 0x3c,
	0x66, 0xf1, 0xd9, 0x0c, 0xef, 0xec, 0x3a, 0x9e, 0x52, 0x4b, 0x49, 0xc7, 0x67, 0x33, 0x6e, 0x7a,
	0xd7, 0xbf, 0x01, 0xc8, 0xe2, 0x4d, 0x6e, 0x83, 0x26, 0xf8, 0x8c, 0x3b, 0x31, 0x9b, 0x07, 0xb1,
	0x3f, 0xc1, 0xbb, 0xaa, 0x38, 0x67, 0x4d, 0xc9, 0x0f, 0xa4, 0x58, 0x5e, 0xd7, 0x0c, 0xc9, 0x9f,
	0x72, 0x71, 0x86, 0x48, 0x55, 0x62, 0x12, 0xa4, 0x21, 0xc5, 0x23, 0xee, 0x5e, 0xff, 0x02, 0x36,
	0x2e, 0x04, 0x9f, 0x7c, 0x04, 0x20, 0x69, 0x8a, 0x09, 0x27, 0x38, 0xe1, 0x09, 0x31, 0x17, 0x46,
	0x4c, 0xf2, 0x15, 0x95, 0x20, 0xda, 0x88, 0x17, 0x9f, 0xfa, 0x1f, 0x4b, 0xd0, 0x48, 0x2f, 0x27,
	0xb9, 0x06, 0x32, 0xd1, 0x8e, 0x8f, 0xb3, 0xb4, 0xad, 0xe1, 0x38, 0xc9, 0x59, 0x54, 0x05, 0xce,
	0x94, 0xa7, 0x39, 0x2b, 0x25, 0x43, 0x67, 0xca, 0xc9, 0x0e, 0xd4, 0x44, 0x18, 0x4e, 0xa5, 0xa1,
	0x62, 0xbb, 0x2b, 0x72, 0xa8, 0x92, 0x19, 0x15, 0x68, 0xa6, 0x78, 0xad, 0x2e, 0x05, 0x68, 0x75,
	0x13, 0x60, 0xe6, 0x88, 0xf8, 0x8c, 0x45, 0xfe, 0xb7, 0xaa, 0x30, 0x56, 0x69, 0x03, 0x25, 0x23,
	0xff, 0x5b, 0xae, 0x77, 0xa0, 0x91, 0x2e, 0x5a, 0x3a, 0x3a, 0xe2, 0x27, 0x7e, 0x90, 0x8b, 0x64,
	0x1d, 0x05, 0x32, 0x86, 0x3b, 0x50, 0x93, 0x7c, 0xbd, 0x08, 0x5d, 0x85, 0x5e, 0xe1, 0x81, 0x37,
	0xe2, 0xae, 0xfe, 0xdb, 0x12, 0x34, 0x93, 0xd2, 0xf0, 0x13, 0x14, 0xb1, 0xf7, 0xa0, 0x96, 0xd0,
	0x54, 0x52, 0xb7, 0x6e, 0xbc, 0xa0, 0x6e, 0xd1, 0x05, 0x56, 0xff, 0x73, 0x0b, 0x6a, 0x89, 0xf0,
	0x47, 0x93, 0x23, 0x81, 0x15, 0x0c, 0xa5, 0x8a, 0x32, 0x7e, 0x93, 0x5d, 0x68, 0x7a, 0x3c, 0x72,
	0x85, 0xaf, 0x12, 0x59, 0x45, 0x39, 0x2f, 0x22, 0xbf, 0x80, 0xea, 0x4c, 0xf8, 0x49, 0xf3, 0xd1,
	0xbc, 0x77, 0xad, 0x68, 0xd9, 0xb6, 0x04, 0x50, 0x85, 0x23, 0xbf, 0x86, 0xaa, 0x98, 0x4f, 0x78,
	0x94, 0xd4, 0x96, 0xb7, 0x0a, 0xf7, 0xa9, 0xee, 0xa2, 0x1f, 0x9c, 0x50, 0x09, 0xa5, 0xca, 0x82,
	0x7c, 0x0c, 0x2b, 0xc7, 0xa1, 0x98, 0xb6, 0x6b, 0x18, 0xa1, 0xb7, 0x5f, 0x10, 0x21, 0x33, 0x88,
	0x9d, 0x27, 0xbc, 0x1f, 0x8a, 0xe9, 0x83, 0x72, 0xbb, 0x44, 0xd1, 0x8c, 0xf4, 0xa1, 0xe9, 0xa3,
	0x9c, 0xa1, 0x97, 0x2d, 0x9c, 0xff, 0xd5, 0xbc, 0x50, 0xf0, 0xd3, 0x6f, 0xf2, 0x35, 0x6c, 0xcf,
	0xb8, 0x60, 0x49, 0xe2, 0xe6, 0x5d, 0x5e, 0xfd, 0x21, 0x2e, 0x37, 0x67, 0x5c, 0x8c, 0xd1, 0x47,
	0x26, 0x24, 0x23, 0x58, 0x9f, 0x09, 0xbe, 0x20, 0x6f, 0x49, 0x0a, 0x48, 0xfe, 0x6b, 0xf7, 0xee,
	0xbc, 0xc0, 0xe9, 0x9e, 0x9d, 0x9a, 0x48, 0xc6, 0xa0, 0x6b, 0xb3, 0xa5, 0x31, 0x79, 0x1f, 0xea,
	0xb1, 0xf3, 0x9c, 0x09, 0x27, 0xe6, 0xed, 0xc6, 0xe5, 0x9c, 0x39, 0x76, 0x9e, 0x53, 0x27, 0xe6,
	0xb4, 0x16, 0xab, 0x8f, 0xe2, 0x32, 0x02, 0xc5, 0x65, 0x24, 0x47, 0xcb, 0xcd, 0xff, 0x9d, 0x96,
	0x5b, 0x3f, 0x0d, 0x2d, 0xaf, 0xfe, 0x48, 0x5a, 0xfe, 0x14, 0x9a, 0x0e, 0x76, 0xbe, 0x6c, 0xe2,
	0x07, 0x4f, 0xda, 0x6b, 0x78, 0xdf, 0xde, 0x28, 0xac, 0x5f, 0x08, 0x1b, 0xf8, 0xc1, 0x13, 0x0a,
	0x4e, 0xfa, 0x4d, 0x3e, 0x84, 0x15, 0x3c, 0xbb, 0x75, 0x5c, 0xc8, 0x8b, 0x7a, 0xd0, 0xc5, 0xbf,
	0x78, 0x70, 0x68, 0x24, 0x67, 0xcf, 0x15, 0x85, 0xb6, 0x76, 0xf9, 0xec, 0xe3, 0xb4, 0x4a, 0x50,
	0xc8, 0x2a, 0x06, 0x31, 0x60, 0x55, 0xf0, 0x89, 0x13, 0x73, 0x8f, 0x4d, 0xb9, 0xe7, 0x3b, 0xed,
	0x8d, 0xcb, 0xdb, 0x2f, 0xaa, 0x80, 0xfb, 0x12, 0x47, 0x5b, 0x22, 0x37, 0x22, 0xa7, 0x70, 0x3d,
	0x6d, 0xac, 0xe3, 0x58, 0xf8, 0x47, 0xf3, 0x98, 0xb3, 0xa7, 0xce, 0x64, 0x8e, 0xfc, 0x41, 0xd0,
	0xe7, 0xdd, 0x17, 0xb5, 0xd7, 0x0b, 0xa3, 0x2f, 0xa5, 0x8d, 0xe9, 0xd1, 0x9d, 0xa8, 0x58, 0x41,
	0x1e, 0xc2, 0xda, 0x33, 0xc7, 0x8f, 0x27, 0x7e, 0x14, 0x33, 0x45, 0x0e, 0x9b, 0x78, 0x11, 0xde,
	0x2c, 0xf2, 0x7e, 0x98, 0x20, 0x15, 0x35, 0xac, 0x3e, 0xcb, 0x0f, 0xf5, 0x6f, 0x60, 0x6d, 0x39,
	0x19, 0xc8, 0x2d, 0xb8, 0x61, 0x53, 0xc3, 0xee, 0x3c, 0x96, 0x6f, 0x10, 0x36, 0x7e, 0x6c, 0x1b,
	0xec, 0x60, 0x38, 0xb2, 0x8d, 0xae, 0xd9, 0x37, 0x8d, 0x9e, 0xf6, 0x1a, 0x69, 0x41, 0x9d, 0x1a,
	0x5f, 0x1c, 0x98, 0xd4, 0xe8, 0x69, 0x25, 0x39, 0xb2, 0xec, 0xb1, 0x69, 0x0d, 0xe5, 0x73, 0x85,
	0x6c, 0xc0, 0xea, 0xd0, 0x1a, 0xb3, 0xd1, 0x81, 0x6d, 0x5b, 0x74, 0x6c, 0xf4, 0xb4, 0x8a, 0xfe,
	0xb7, 0x8c, 0xf7, 0xd1, 0xff, 0xeb, 0xd0, 0x1e, 0x19, 0xf4, 0x4b, 0xb3, 0x6b, 0x14, 0x39, 0x7f,
	0x0b, 0x6e, 0x2d, 0x69, 0x7b, 0xe6, 0xd0, 0x1c, 0x7e, 0xce, 0xa8, 0x21, 0xa5, 0x1d, 0x39, 0x8f,
	0x56, 0x22, 0x6f, 0xc0, 0xf5, 0x25, 0x50, 0xdf, 0xb2, 0x7a, 0xcc, 0xa2, 0x3d, 0x83, 0x9a, 0xc3,
	0xcf, 0xb5, 0x32, 0xb9, 0x09, 0xd7, 0x96, 0xf4, 0xc6, 0x97, 0xb8, 0x15, 0xb3, 0xfb, 0xc8, 0x18,
	0x6b, 0x15, 0xf9, 0xde, 0x5a, 0x52, 0x8f, 0xa9, 0x69, 0xb3, 0xb1, 0x75, 0x40, 0xb5, 0x15, 0xfd,
	0x3b, 0xa8, 0x22, 0xfb, 0xca, 0xee, 0x16, 0xf9, 0x97, 0x4d, 0x7d, 0x57, 0x84, 0x51, 0x52, 0xe7,
	0x9a, 0x28, 0xdb, 0x47, 0x11, 0x79, 0x0b, 0x56, 0x93, 0x26, 0xe3, 0x8c, 0xb9, 0xa1, 0xb7, 0xa8,
	0xc5, 0xad, 0x85, 0xb0, 0x1b, 0x7a, 0x9c, 0xbc, 0x03, 0x44, 0xda, 0xc8, 0xe7, 0x71, 0xc2, 0x09,
	0xb2, 0x89, 0x55, 0x35, 0x43, 0x4b, 0x34, 0x8a, 0x14, 0xc6, 0xce, 0x89, 0xfe, 0x87, 0x32, 0xac,
	0x9f, 0x23, 0x73, 0xf9, 0x32, 0x99, 0xfa, 0x01, 0x73, 0xbc, 0xa7, 0x4e, 0xe0, 0x72, 0x96, 0x1c,
	0x6e, 0xb2, 0xa0, 0x8d, 0xa9, 0x1f, 0x74, 0x94, 0xe6, 0x81, 0x52, 0x90, 0x4f, 0xe1, 0xf5, 0x3c,
	0x3e, 0x0c, 0x26, 0x7e, 0xc0, 0x99, 0x2b, 0x07, 0xd2, 0x69, 0x52, 0x96, 0xaf, 0x65, 0x86, 0x16,
	0x22, 0xba, 0x0b, 0x00, 0xf9, 0x02, 0xae, 0xca, 0x5b, 0x9d, 0x98, 0x4c, 0x54, 0x87, 0x2f, 0xd9,
	0xa6, 0xf2, 0x92, 0x92, 0x85, 0xb5, 0x63, 0x53, 0xda, 0x76, 0x73, 0xa6, 0x92, 0x77, 0x3e, 0x02,
	0x08, 0xc2, 0x94, 0xb5, 0x56, 0x5e, 0xc5, 0x4f, 0x43, 0x19, 0xf4, 0x39, 0xd7, 0xf7, 0xa0, 0x96,
	0x70, 0xad, 0x8c, 0x39, 0x1e, 0x08, 0x9b, 0x71, 0xe1, 0xf2, 0x40, 0xbd, 0x1e, 0xab, 0xb4, 0x85,
	0x42, 0x5b, 0xc9, 0xf4, 0x7f, 0x95, 0x61, 0xfb, 0x42, 0xfd, 0xe8, 0xfb, 0x7c, 0xe2, 0x91, 0x35,
	0x28, 0xfb, 0x1e, 0xd6, 0xde, 0x06, 0x2d, 0xfb, 0x32, 0x93, 0x14, 0xf1, 0xa8, 0x9f, 0x2b, 0xde,
	0x7d, 0xa5, 0x4a, 0x84, 0x9e, 0xf6, 0xf0, 0x6f, 0x8e, 0x85, 0xb6, 0xa0, 0x3a, 0x71, 0x8e, 0xf8,
	0x24, 0xb9, 0x05, 0x6a, 0x20, 0xa5, 0xc8, 0x00, 0xed, 0x0a, 0x96, 0x01, 0x35, 0x90, 0xad, 0x87,
	0x2f, 0x5f, 0x8d, 0xc8, 0xa3, 0x1e, 0xc6, 0xa3, 0x4e, 0xc1, 0x8f, 0x12, 0xb2, 0xf5, 0xf4, 0xdf,
	0x95, 0xa0, 0x91, 0x4e, 0x20, 0x2f, 0x6c, 0xdf, 0x34, 0x06, 0xbd, 0xa2, 0x84, 0xd1, 0xa0, 0x35,
	0x7a, 0x68, 0xd1, 0x31, 0xeb, 0x0c, 0x47, 0x87, 0x06, 0xd5, 0x4a, 0x64, 0x15, 0x1a, 0x76, 0x87,
	0x76, 0x3e, 0xa7, 0x1d, 0xfb, 0xa1, 0x56, 0x26, 0x9b, 0xb0, 0xbe, 0x7f, 0x30, 0x18, 0x9b, 0xf6,
	0xc0, 0x60, 0xdd, 0x87, 0x96, 0xd9, 0x35, 0xb4, 0x0a, 0x59, 0x03, 0xe8, 0x3e, 0x34, 0xba, 0x8f,
	0x1e, 0x58, 0x5f, 0x19, 0x23, 0x6d, 0x45, 0x66, 0x71, 0x8f, 0x5a, 0x76, 0xcf, 0x3a, 0x1c, 0x6a,
	0x55, 0xd2, 0x84, 0xda, 0x03, 0xcb, 0x1a, 0x18, 0x9d, 0xa1, 0x76, 0x45, 0xff, 0x47, 0x09, 0x36,
	0x2e, 0x84, 0x80, 0x7c, 0x06, 0xd5, 0x63, 0xb9, 0xbe, 0x76, 0x09, 0x69, 0xed, 0xce, 0xab, 0x07,
	0x8e, 0x2a, 0x43, 0xf2, 0x2e, 0x6c, 0x1d, 0xfb, 0x22, 0x52, 0x3f, 0x09, 0x30, 0x77, 0x1e, 0xc5,
	0xe1, 0x94, 0x8b, 0x08, 0xc3, 0x57, 0xc7, 0x1b, 0x40, 0x50, 0x2f, 0xfb, 0xce, 0xee, 0x42, 0x4b,
	0xee, 0xcb, 0x02, 0x16, 0xcf, 0x45, 0x20, 0x13, 0x2a, 0x33, 0xaa, 0x64, 0x46, 0xa9, 0x3a, 0x35,
	0xd2, 0xff, 0x59, 0x82, 0x5a, 0x52, 0x49, 0xc9, 0xfd, 0xac, 0xee, 0x96, 0x5e, 0xd6, 0x81, 0xa5,
	0x55, 0xf7, 0x5c, 0x4a, 0x2d, 0x25, 0x46, 0xd6, 0xe9, 0xe6, 0x52, 0x2a, 0x7f, 0xff, 0x65, 0x57,
	0xfc, 0x19, 0xb4, 0x12, 0x5f, 0xaa, 0x46, 0x55, 0xf0, 0xba, 0xdd, 0xbc, 0x74, 0x6a, 0xbc, 0x57,
	0xcd, 0xc4, 0x44, 0x0e, 0x74, 0x01, 0x8d, 0xb4, 0xa2, 0x93, 0xbb, 0x50, 0x91, 0x79, 0xf4, 0xd2,
	0x0d, 0x48, 0x14, 0xf9, 0x00, 0xea, 0xc7, 0x9c, 0xff, 0x80, 0x79, 0x6b, 0xc7, 0x1c, 0x3f, 0xf4,
	0xbf, 0x96, 0x00, 0xb2, 0x82, 0x4d, 0x34, 0xa8, 0xcc, 0xc5, 0x24, 0x69, 0x94, 0xe5, 0x27, 0xb9,
	0x0e, 0xf5, 0x89, 0x13, 0x9c, 0xcc, 0x9d, 0x93, 0x05, 0xf9, 0xa5, 0x63, 0xf2, 0x73, 0xfc, 0x81,
	0x04, 0x7f, 0xde, 0xe0, 0x1e, 0x73, 0xc3, 0x79, 0x10, 0x8b, 0xb3, 0x24, 0x0d, 0x36, 0x32, 0x4d,
	0x57, 0x29, 0xc8, 0x27, 0x50, 0x9f, 0x4d, 0x9c, 0x18, 0xdb, 0xc2, 0x15, 0x5c, 0xa5, 0x7e, 0x79,
	0xff, 0x60, 0x27, 0x48, 0x9a, 0xda, 0xe8, 0xbf, 0x2f, 0x01, 0x64, 0xe5, 0xbd, 0xe0, 0xa1, 0xa8,
	0x96, 0xbd, 0xf4, 0x50, 0x24, 0x77, 0x61, 0x23, 0x3a, 0x0d, 0x45, 0xcc, 0xf2, 0x4d, 0xbb, 0xda,
	0x88, 0x86, 0x8a, 0x5e, 0x51, 0xe7, 0x5e, 0x79, 0xb5, 0xce, 0x5d, 0xff, 0x4b, 0x09, 0x5a, 0xf9,
	0x76, 0xa1, 0x20, 0x80, 0x9f, 0x24, 0xf4, 0x53, 0xbe, 0xbc, 0x67, 0xcd, 0x7b, 0xd8, 0xc3, 0xbf,
	0x39, 0xd2, 0x69, 0x43, 0xcd, 0x75, 0xd4, 0xb2, 0x55, 0x49, 0x59, 0x0c, 0xf5, 0x77, 0xa0, 0x91,
	0x82, 0xc9, 0x16, 0x68, 0x05, 0xd4, 0xd1, 0x80, 0xaa, 0xfd, 0xd0, 0x1a, 0x5b, 0x5a, 0x49, 0x3f,
	0x84, 0x9d, 0x4b, 0x9a, 0x10, 0x59, 0x08, 0xb3, 0x6e, 0x26, 0x8d, 0x63, 0x33, 0x95, 0x99, 0x9e,
	0x7c, 0xac, 0xa6, 0x6d, 0x8e, 0x8a, 0x5e, 0xed, 0xa9, 0xb2, 0xd6, 0xff, 0x54, 0x82, 0xd5, 0xa5,
	0x06, 0x44, 0x9e, 0x8c, 0xcc, 0xa5, 0xdc, 0x6b, 0x33, 0xa5, 0xf0, 0xc0, 0x5e, 0x3c, 0x38, 0x11,
	0xe5, 0x3c, 0xcf, 0xa3, 0xca, 0x09, 0xca, 0x79, 0x9e, 0xa1, 0x3e, 0x81, 0x1b, 0xd1, 0x7c, 0x36,
	0x0b, 0x45, 0x1c, 0x31, 0xc7, 0xf3, 0x7c, 0xb9, 0x73, 0x67, 0x82, 0xc4, 0xca, 0x23, 0xf5, 0x6b,
	0x5f, 0x9d, 0x5e, 0x5b, 0x40, 0x3a, 0x29, 0x82, 0x2a, 0xc0, 0x9d, 0xfb, 0xd0, 0x48, 0xaf, 0x3d,
	0xd9, 0x06, 0xd2, 0x37, 0xbf, 0x32, 0x7a, 0x8c, 0x76, 0xc6, 0x06, 0xeb, 0x19, 0xfd, 0xce, 0xc1,
	0x60, 0xac, 0xbd, 0x26, 0xb9, 0xd2, 0x36, 0x28, 0xb3, 0x0d, 0x3a, 0x92, 0xdd, 0xc7, 0x9d, 0xef,
	0x60, 0xe3, 0x42, 0x53, 0x2c, 0xfb, 0x96, 0xa4, 0x29, 0x62, 0x5d, 0x6a, 0xf4, 0xcc, 0x31, 0xeb,
	0x76, 0x68, 0xef, 0x62, 0x73, 0x53, 0x04, 0xea, 0x5a, 0xc3, 0x9e, 0x99, 0xb4, 0x50, 0xd8, 0xdc,
	0x14, 0x81, 0x3a, 0x83, 0xc3, 0xce, 0xe3, 0x91, 0x56, 0xbe, 0xf3, 0x7d, 0x09, 0xd6, 0x96, 0xb3,
	0x40, 0xb6, 0x6c, 0x9d, 0xae, 0x74, 0xc0, 0xec, 0x41, 0x67, 0xdc, 0xb7, 0xe8, 0xfe, 0xc5, 0x89,
	0xcf, 0x03, 0x0e, 0x8d, 0x07, 0xac, 0x63, 0xdb, 0x03, 0xb3, 0x9b, 0xeb, 0xaa, 0xce, 0x83, 0xf6,
	0xad, 0x07, 0xe6, 0xc0, 0x90, 0x58, 0xad, 0x4c, 0x6e, 0xc0, 0xce, 0x79, 0x7d, 0x67, 0xd8, 0xa3,
	0x96, 0xd9, 0xd3, 0x2a, 0x64, 0x07, 0x36, 0xcf, 0x2b, 0x4d, 0x6b, 0xa4, 0xad, 0x1c, 0x5d, 0xc1,
	0xff, 0x4d, 0xb8, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x3f, 0x56, 0x84, 0x5c, 0x18,
	0x00, 0x00,
}
