Added support for ticket type ids at the availability level.
diff --git a/feeds/feeds.pb.go b/feeds/feeds.pb.go
index 9902bb9..e9fa181 100644
--- a/feeds/feeds.pb.go
+++ b/feeds/feeds.pb.go
@@ -77,7 +77,7 @@
 	return proto.EnumName(PriceType_name, int32(x))
 }
 func (PriceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0}
 }
 
 // Defines whether a credit card is required in order to book an appointment.
@@ -113,7 +113,7 @@
 	return proto.EnumName(RequireCreditCard_name, int32(x))
 }
 func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{1}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{1}
 }
 
 // The platform that the action is performed on. Web application is the general
@@ -154,7 +154,7 @@
 	return proto.EnumName(ActionPlatform_name, int32(x))
 }
 func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{2}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{2}
 }
 
 type FeedMetadata_ProcessingInstruction int32
@@ -186,7 +186,7 @@
 	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
 }
 func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0, 0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0, 0}
 }
 
 // Enum to indicate the prepayment type.
@@ -221,7 +221,7 @@
 	return proto.EnumName(Service_PrepaymentType_name, int32(x))
 }
 func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7, 0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 0}
 }
 
 type Service_ServiceType int32
@@ -253,7 +253,7 @@
 	return proto.EnumName(Service_ServiceType_name, int32(x))
 }
 func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7, 1}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 1}
 }
 
 // Enum to indicate the type of field.
@@ -299,7 +299,7 @@
 	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
 }
 func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{11, 0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{11, 0}
 }
 
 // Enum to indicate the type of this media source. Only photos are supported.
@@ -327,13 +327,13 @@
 	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
 }
 func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{17, 0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []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,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
+	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.
@@ -342,8 +342,8 @@
 	//
 	// 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" json:"shard_number,omitempty"`
-	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards" json:"total_shards,omitempty"`
+	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.
 	//
@@ -355,11 +355,11 @@
 	// total_shards).
 	//
 	// Feeds that span multiple shards must set this nonce to the same value.
-	Nonce uint64 `protobuf:"varint,5,opt,name=nonce" json:"nonce,omitempty"`
+	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" json:"generation_timestamp,omitempty"`
+	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:"-"`
@@ -369,7 +369,7 @@
 func (m *FeedMetadata) String() string { return proto.CompactTextString(m) }
 func (*FeedMetadata) ProtoMessage()    {}
 func (*FeedMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0}
 }
 func (m *FeedMetadata) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FeedMetadata.Unmarshal(m, b)
@@ -425,8 +425,8 @@
 }
 
 type AvailabilityFeed struct {
-	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"`
-	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability" json:"service_availability,omitempty"`
+	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:"-"`
@@ -436,7 +436,7 @@
 func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
 func (*AvailabilityFeed) ProtoMessage()    {}
 func (*AvailabilityFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{1}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{1}
 }
 func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b)
@@ -494,8 +494,8 @@
 	// 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" json:"start_timestamp_restrict,omitempty"`
-	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict" json:"end_timestamp_restrict,omitempty"`
+	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.
 	//
@@ -505,13 +505,13 @@
 	//
 	// 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" json:"merchant_id_restrict,omitempty"`
-	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict" json:"service_id_restrict,omitempty"`
+	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" json:"resources_restrict,omitempty"`
-	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability" json:"availability,omitempty"`
+	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:"-"`
@@ -521,7 +521,7 @@
 func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
 func (*ServiceAvailability) ProtoMessage()    {}
 func (*ServiceAvailability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{2}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{2}
 }
 func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b)
@@ -597,15 +597,17 @@
 //   availability {start_sec: 9am, duration: 180 minutes, ...}
 //
 type Availability struct {
-	// An opaque string from an aggregator to identify a merchant.
-	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
+	// 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.
-	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
-	// Start time of this availability, using epoch time in seconds.
-	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
+	// 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.
-	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
+	// (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 ...}
@@ -616,11 +618,13 @@
 	//       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.
-	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal" json:"spots_total,omitempty"`
-	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen" json:"spots_open,omitempty"`
+	// (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.
-	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"`
+	// (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.
@@ -630,8 +634,9 @@
 	//                 spots_total: 10 spots_open: 7 }
 	//  availability { resources { staff_id: "2" staff_name: "John" }
 	//                 spots_total: 5 spots_open: 2 }
-	Resources *Resources `protobuf:"bytes,8,opt,name=resources" json:"resources,omitempty"`
-	// A list of ids referencing the payment options which can be used to pay
+	// (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.
 	//
@@ -639,23 +644,72 @@
 	// 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.
-	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"`
+	// 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.
-	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence" json:"recurrence,omitempty"`
-	// When this service cannot be scheduled. To limit the number of
-	// schedule_exception messages consider joining adjacent exceptions.
-	ScheduleException    []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException" json:"schedule_exception,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
-	XXX_unrecognized     []byte                            `json:"-"`
-	XXX_sizecache        int32                             `json:"-"`
+	// (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_feeds_0b3f05d3b8d0e7eb, []int{3}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3}
 }
 func (m *Availability) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability.Unmarshal(m, b)
@@ -752,6 +806,34 @@
 	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.
@@ -768,14 +850,15 @@
 //      merchants/services with regularly scheduled classes.
 type Availability_Recurrence struct {
 	// The inclusive maximum UTC timestamp the availability repeats until.
-	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec" json:"repeat_until_sec,omitempty"`
+	// (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.
 	//
-	// E.g. An availability with a duration of 20 min, a repeat_every_sec of
+	// 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.
-	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec" json:"repeat_every_sec,omitempty"`
+	// 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:"-"`
@@ -785,7 +868,7 @@
 func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) }
 func (*Availability_Recurrence) ProtoMessage()    {}
 func (*Availability_Recurrence) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{3, 0}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 0}
 }
 func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b)
@@ -819,13 +902,24 @@
 	return 0
 }
 
-// ScheduleException messages are used to represent booked/unavailable time
-// ranges within the work day. As time slots are booked, the list of
-// exceptions should grow to reflect the newly unavailable time ranges.
-// The recurrence itself shouldn't be modified.
+// 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.
-	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange" json:"time_range,omitempty"`
+	// 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:"-"`
@@ -835,7 +929,7 @@
 func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
 func (*Availability_ScheduleException) ProtoMessage()    {}
 func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{3, 1}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 1}
 }
 func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b)
@@ -872,28 +966,28 @@
 	// 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" json:"staff_id,omitempty"`
+	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" json:"staff_name,omitempty"`
+	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" json:"room_id,omitempty"`
+	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" json:"room_name,omitempty"`
+	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" json:"party_size,omitempty"`
+	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:"-"`
@@ -903,7 +997,7 @@
 func (m *Resources) String() string { return proto.CompactTextString(m) }
 func (*Resources) ProtoMessage()    {}
 func (*Resources) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{4}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{4}
 }
 func (m *Resources) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Resources.Unmarshal(m, b)
@@ -959,8 +1053,8 @@
 }
 
 type TimeRange struct {
-	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec" json:"begin_sec,omitempty"`
-	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"`
+	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:"-"`
@@ -970,7 +1064,7 @@
 func (m *TimeRange) String() string { return proto.CompactTextString(m) }
 func (*TimeRange) ProtoMessage()    {}
 func (*TimeRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{5}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{5}
 }
 func (m *TimeRange) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TimeRange.Unmarshal(m, b)
@@ -1005,8 +1099,8 @@
 }
 
 type ServiceFeed struct {
-	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"`
-	Service              []*Service    `protobuf:"bytes,2,rep,name=service" json:"service,omitempty"`
+	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:"-"`
@@ -1016,7 +1110,7 @@
 func (m *ServiceFeed) String() string { return proto.CompactTextString(m) }
 func (*ServiceFeed) ProtoMessage()    {}
 func (*ServiceFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{6}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{6}
 }
 func (m *ServiceFeed) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceFeed.Unmarshal(m, b)
@@ -1054,13 +1148,13 @@
 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" json:"merchant_id,omitempty"`
+	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" json:"service_id,omitempty"`
+	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" json:"name,omitempty"`
+	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
@@ -1129,49 +1223,49 @@
 	//   approach for you.
 	//
 	// (required)
-	Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
+	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" json:"price,omitempty"`
+	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" json:"rules,omitempty"`
+	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
 	// Intake forms to customize the service. (optional)
-	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form" json:"form,omitempty"`
+	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"`
 	// Whether a prepayment is required, optional or not supported. (optional)
-	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
+	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" json:"tax_rate,omitempty"`
+	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" json:"payment_option_id,omitempty"`
+	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" json:"deposit,omitempty"`
+	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" json:"no_show_fee,omitempty"`
+	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,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
+	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" json:"action_link,omitempty"`
+	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,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
+	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" json:"ticket_type,omitempty"`
+	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" json:"related_media,omitempty"`
+	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" json:"service_attribute_value_id,omitempty"`
+	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
 	XXX_NoUnkeyedLiteral    struct{}                   `json:"-"`
 	XXX_unrecognized        []byte                     `json:"-"`
 	XXX_sizecache           int32                      `json:"-"`
@@ -1181,7 +1275,7 @@
 func (m *Service) String() string { return proto.CompactTextString(m) }
 func (*Service) ProtoMessage()    {}
 func (*Service) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7}
 }
 func (m *Service) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Service.Unmarshal(m, b)
@@ -1334,12 +1428,12 @@
 	// 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" json:"price_micros,omitempty"`
+	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" json:"currency_code,omitempty"`
+	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" json:"pricing_option_tag,omitempty"`
+	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:"-"`
@@ -1349,7 +1443,7 @@
 func (m *Price) String() string { return proto.CompactTextString(m) }
 func (*Price) ProtoMessage()    {}
 func (*Price) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{8}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{8}
 }
 func (m *Price) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Price.Unmarshal(m, b)
@@ -1394,14 +1488,14 @@
 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" json:"min_advance_booking,omitempty"`
+	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" json:"min_advance_online_canceling,omitempty"`
+	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" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
+	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" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
+	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:"-"`
@@ -1411,7 +1505,7 @@
 func (m *SchedulingRules) String() string { return proto.CompactTextString(m) }
 func (*SchedulingRules) ProtoMessage()    {}
 func (*SchedulingRules) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{9}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{9}
 }
 func (m *SchedulingRules) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SchedulingRules.Unmarshal(m, b)
@@ -1480,7 +1574,7 @@
 	// 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" json:"micro_percent,omitempty"`
+	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:"-"`
@@ -1490,7 +1584,7 @@
 func (m *TaxRate) String() string { return proto.CompactTextString(m) }
 func (*TaxRate) ProtoMessage()    {}
 func (*TaxRate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{10}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{10}
 }
 func (m *TaxRate) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TaxRate.Unmarshal(m, b)
@@ -1520,14 +1614,14 @@
 // Defines a field that is included in a ServiceIntakeForm.
 type ServiceIntakeFormField struct {
 	// The type of this field. (required)
-	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
+	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" json:"label,omitempty"`
+	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" json:"value,omitempty"`
+	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" json:"is_required,omitempty"`
+	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:"-"`
@@ -1537,7 +1631,7 @@
 func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) }
 func (*ServiceIntakeFormField) ProtoMessage()    {}
 func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{11}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{11}
 }
 func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b)
@@ -1588,13 +1682,13 @@
 // 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" json:"field,omitempty"`
+	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
 	// If true, this form will be shown to first time customers.
 	// (one of first_time_customers or returning_customers required)
-	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers" json:"first_time_customers,omitempty"`
+	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"`
 	// If true, this form will be shown to repeat customers.
 	// (one of first_time_customers or returning_customers required)
-	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers" json:"returning_customers,omitempty"`
+	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1604,7 +1698,7 @@
 func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) }
 func (*ServiceIntakeForm) ProtoMessage()    {}
 func (*ServiceIntakeForm) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{12}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{12}
 }
 func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b)
@@ -1649,11 +1743,11 @@
 // for.
 type Deposit struct {
 	// Deposit amount.
-	Deposit *Price `protobuf:"bytes,1,opt,name=deposit" json:"deposit,omitempty"`
+	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" json:"min_advance_cancellation_sec,omitempty"`
+	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,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
+	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:"-"`
@@ -1663,7 +1757,7 @@
 func (m *Deposit) String() string { return proto.CompactTextString(m) }
 func (*Deposit) ProtoMessage()    {}
 func (*Deposit) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{13}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{13}
 }
 func (m *Deposit) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Deposit.Unmarshal(m, b)
@@ -1709,9 +1803,9 @@
 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" json:"fee,omitempty"`
+	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,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
+	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:"-"`
@@ -1721,7 +1815,7 @@
 func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
 func (*NoShowFee) ProtoMessage()    {}
 func (*NoShowFee) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{14}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{14}
 }
 func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
@@ -1760,15 +1854,15 @@
 // performed on.
 type ActionLink struct {
 	// The entry point URL for this action link.
-	Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
+	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" json:"language,omitempty"`
+	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" json:"restricted_country,omitempty"`
+	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,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
+	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:"-"`
@@ -1778,7 +1872,7 @@
 func (m *ActionLink) String() string { return proto.CompactTextString(m) }
 func (*ActionLink) ProtoMessage()    {}
 func (*ActionLink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{15}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{15}
 }
 func (m *ActionLink) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ActionLink.Unmarshal(m, b)
@@ -1833,12 +1927,12 @@
 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" json:"ticket_type_id,omitempty"`
+	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" json:"short_description,omitempty"`
+	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" json:"price,omitempty"`
+	Price                *Price   `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1848,7 +1942,7 @@
 func (m *TicketType) String() string { return proto.CompactTextString(m) }
 func (*TicketType) ProtoMessage()    {}
 func (*TicketType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{16}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{16}
 }
 func (m *TicketType) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TicketType.Unmarshal(m, b)
@@ -1894,11 +1988,11 @@
 // 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" json:"url,omitempty"`
+	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,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
+	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" json:"caption,omitempty"`
+	Caption              string   `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1908,7 +2002,7 @@
 func (m *RelatedMedia) String() string { return proto.CompactTextString(m) }
 func (*RelatedMedia) ProtoMessage()    {}
 func (*RelatedMedia) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{17}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{17}
 }
 func (m *RelatedMedia) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RelatedMedia.Unmarshal(m, b)
@@ -1954,10 +2048,10 @@
 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" json:"attribute_id,omitempty"`
+	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" json:"value_id,omitempty"`
+	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:"-"`
@@ -1967,7 +2061,7 @@
 func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) }
 func (*ServiceAttributeValueId) ProtoMessage()    {}
 func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{18}
+	return fileDescriptor_feeds_fc30b4ddff65807e, []int{18}
 }
 func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b)
@@ -2033,149 +2127,151 @@
 	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
 }
 
-func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_0b3f05d3b8d0e7eb) }
+func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_fc30b4ddff65807e) }
 
-var fileDescriptor_feeds_0b3f05d3b8d0e7eb = []byte{
-	// 2250 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x4f, 0x73, 0xdb, 0xc6,
-	0x15, 0x0f, 0x48, 0xd1, 0x24, 0x1f, 0x69, 0x19, 0x5c, 0xc9, 0x12, 0x2c, 0xc7, 0xb1, 0x0a, 0x37,
-	0x53, 0x55, 0x4e, 0x99, 0x56, 0x4e, 0x32, 0xc9, 0xc4, 0x4d, 0x42, 0x81, 0x90, 0x85, 0x31, 0x45,
-	0xc0, 0x4b, 0xc8, 0x8e, 0x7b, 0xd9, 0x40, 0xc0, 0x4a, 0xc2, 0x98, 0x04, 0xd8, 0x05, 0xa8, 0x58,
-	0x99, 0xc9, 0xa5, 0xa7, 0x1e, 0x3b, 0xd3, 0x5b, 0x3f, 0x41, 0x3b, 0xf5, 0x07, 0xe8, 0xf4, 0xd6,
-	0x53, 0x3f, 0x4e, 0x3f, 0x40, 0x2f, 0x9d, 0x5d, 0x80, 0x00, 0x28, 0x41, 0x96, 0x3b, 0xed, 0x85,
-	0xc2, 0xbe, 0xf7, 0x7e, 0xfb, 0xe7, 0xbd, 0x7d, 0xbf, 0xf7, 0x56, 0xd0, 0x3a, 0xa6, 0xd4, 0x8b,
-	0xba, 0x53, 0x16, 0xc6, 0x21, 0x42, 0x13, 0x67, 0x1a, 0x75, 0x8f, 0xc2, 0xf0, 0x95, 0x1f, 0x9c,
-	0x74, 0x85, 0x46, 0xfd, 0x57, 0x05, 0xda, 0x7b, 0x94, 0x7a, 0x07, 0x34, 0x76, 0x3c, 0x27, 0x76,
-	0xd0, 0x04, 0xd6, 0xa6, 0x2c, 0x74, 0x69, 0x14, 0xf9, 0xc1, 0x09, 0xf1, 0x83, 0x28, 0x66, 0x33,
-	0x37, 0xf6, 0xc3, 0x40, 0x91, 0x36, 0xa5, 0xad, 0xe5, 0x9d, 0xcf, 0xba, 0x97, 0x67, 0xe9, 0x16,
-	0x67, 0xe8, 0x5a, 0x19, 0xdc, 0xc8, 0xd1, 0xf8, 0xf6, 0xb4, 0x4c, 0x8c, 0x7e, 0x02, 0xed, 0xe8,
-	0xd4, 0x61, 0x1e, 0x09, 0x66, 0x93, 0x23, 0xca, 0x94, 0xca, 0xa6, 0xb4, 0x55, 0xc3, 0x2d, 0x21,
-	0x1b, 0x0a, 0x11, 0x37, 0x89, 0xc3, 0xd8, 0x19, 0x13, 0x21, 0x8c, 0x94, 0x6a, 0x62, 0x22, 0x64,
-	0x23, 0x21, 0x42, 0xab, 0x50, 0x0b, 0xc2, 0xc0, 0xa5, 0x4a, 0x6d, 0x53, 0xda, 0x5a, 0xc2, 0xc9,
-	0x00, 0xfd, 0x0a, 0x56, 0x4f, 0x68, 0x40, 0x99, 0xc3, 0x57, 0x22, 0xb1, 0x3f, 0xa1, 0x51, 0xec,
-	0x4c, 0xa6, 0xca, 0xd2, 0xa6, 0xb4, 0x55, 0xc5, 0x2b, 0xb9, 0xce, 0x9e, 0xab, 0x54, 0x07, 0x6e,
-	0x97, 0x6e, 0x1f, 0xad, 0xc0, 0x2d, 0x0b, 0x9b, 0x9a, 0x3e, 0x1a, 0x91, 0xc3, 0xe1, 0xd3, 0xa1,
-	0xf9, 0x62, 0x28, 0xbf, 0x87, 0xd6, 0x61, 0x65, 0x2e, 0xec, 0x8d, 0x88, 0x66, 0x1e, 0x58, 0x03,
-	0xdd, 0xd6, 0x65, 0x09, 0x6d, 0xc0, 0x5a, 0x41, 0x61, 0x0c, 0x35, 0xac, 0x1f, 0xe8, 0x43, 0xbb,
-	0x37, 0x90, 0x2b, 0xea, 0x1b, 0x09, 0xe4, 0xde, 0x99, 0xe3, 0x8f, 0x9d, 0x23, 0x7f, 0xec, 0xc7,
-	0xe7, 0xdc, 0x77, 0xe8, 0x31, 0x34, 0x26, 0xa9, 0xff, 0x84, 0x9f, 0x5b, 0x3b, 0x9b, 0xd7, 0xf9,
-	0x19, 0x67, 0x08, 0xf4, 0x1b, 0x58, 0x8d, 0x28, 0x3b, 0xf3, 0x5d, 0x4a, 0x9c, 0xc2, 0xcc, 0x4a,
-	0x65, 0xb3, 0xba, 0xd5, 0xda, 0xf9, 0x59, 0xd9, 0x4c, 0xa3, 0xc4, 0xbe, 0xb8, 0x11, 0xbc, 0x12,
-	0x5d, 0x16, 0xaa, 0xff, 0xae, 0xc0, 0x4a, 0x89, 0x31, 0xfa, 0x1c, 0x94, 0x28, 0x76, 0x58, 0x9c,
-	0xfb, 0x95, 0x30, 0x1a, 0xc5, 0xcc, 0x77, 0x63, 0x71, 0x82, 0x2a, 0x5e, 0x13, 0xfa, 0xcc, 0xb7,
-	0x38, 0xd5, 0xa2, 0x4f, 0x60, 0x8d, 0x06, 0x5e, 0x19, 0xae, 0x22, 0x70, 0xab, 0x34, 0xf0, 0x2e,
-	0xa3, 0x7e, 0x09, 0xab, 0x13, 0xca, 0xdc, 0x53, 0x27, 0x88, 0x89, 0xef, 0xe5, 0x18, 0x7e, 0x1b,
-	0x9a, 0x18, 0xcd, 0x75, 0x86, 0x97, 0x21, 0xba, 0x30, 0x3f, 0xd0, 0x02, 0x60, 0x49, 0x00, 0x3a,
-	0xa9, 0xaa, 0x60, 0x3f, 0x00, 0xc4, 0x68, 0x14, 0xce, 0x98, 0x4b, 0xa3, 0xdc, 0xfc, 0x86, 0x88,
-	0xc6, 0xbd, 0x32, 0x1f, 0xe2, 0xb9, 0x35, 0xee, 0x64, 0xc0, 0x6c, 0xb6, 0x3e, 0xb4, 0x17, 0x62,
-	0x51, 0x13, 0xb1, 0x28, 0x8d, 0xea, 0x42, 0x10, 0x16, 0x50, 0xea, 0x3f, 0x6b, 0xd0, 0x5e, 0x70,
-	0xfb, 0x7d, 0x68, 0x15, 0xdc, 0x20, 0x3c, 0xdd, 0xc4, 0x90, 0x9f, 0x1e, 0xdd, 0x03, 0xc8, 0x4f,
-	0x2d, 0x3c, 0xda, 0xc4, 0xcd, 0xec, 0xb0, 0xe8, 0x2e, 0x34, 0x93, 0xb0, 0x45, 0xd4, 0x15, 0xbe,
-	0xab, 0xe2, 0x86, 0x10, 0x8c, 0xa8, 0xcb, 0x33, 0xcd, 0x9b, 0xa5, 0xe9, 0xc2, 0xf5, 0x49, 0xa2,
-	0xb4, 0xe6, 0x32, 0x6e, 0x72, 0x1f, 0x5a, 0xd1, 0x34, 0x8c, 0x23, 0x22, 0xd2, 0x4f, 0xe4, 0x5b,
-	0x15, 0x83, 0x10, 0xd9, 0x5c, 0x22, 0xd6, 0x17, 0x06, 0xe1, 0x94, 0x06, 0xc2, 0x7b, 0x55, 0xdc,
-	0x14, 0x12, 0x73, 0x4a, 0x03, 0xf4, 0x73, 0x90, 0x8b, 0x07, 0x24, 0xb1, 0x73, 0xa2, 0xd4, 0xc5,
-	0x26, 0x6f, 0x15, 0xe5, 0xb6, 0x73, 0x82, 0xbe, 0x84, 0x66, 0xe6, 0x56, 0xa5, 0xf1, 0x2e, 0x61,
-	0xc8, 0xed, 0xd1, 0x36, 0x74, 0xa6, 0xce, 0xf9, 0x84, 0x06, 0x31, 0x09, 0xa7, 0xe2, 0x40, 0xbe,
-	0xa7, 0x34, 0x37, 0xab, 0x7c, 0xa1, 0x54, 0x61, 0x0a, 0xb9, 0xe1, 0xa1, 0xa7, 0x00, 0x8c, 0xba,
-	0x33, 0xc6, 0x28, 0xa7, 0x10, 0x10, 0x2b, 0x3d, 0xbc, 0x2e, 0x50, 0x5d, 0x9c, 0x41, 0x70, 0x01,
-	0x8e, 0x1c, 0x40, 0x91, 0x7b, 0x4a, 0xbd, 0xd9, 0x98, 0x12, 0xfa, 0xda, 0xa5, 0x62, 0x11, 0xa5,
-	0x25, 0xa2, 0xbf, 0x73, 0xed, 0xa4, 0xa3, 0x14, 0xaa, 0xcf, 0x91, 0xb8, 0x13, 0x5d, 0x14, 0x6d,
-	0x7c, 0x07, 0x90, 0x2f, 0x8e, 0xb6, 0x40, 0x66, 0x74, 0x4a, 0x9d, 0x98, 0xcc, 0x82, 0xd8, 0x1f,
-	0x8b, 0xc0, 0x25, 0x09, 0xb8, 0x9c, 0xc8, 0x0f, 0xb9, 0x98, 0xc7, 0x2e, 0xb7, 0xa4, 0x67, 0x94,
-	0x9d, 0x0b, 0xcb, 0x84, 0x6f, 0x53, 0x4b, 0x9d, 0x8b, 0x47, 0xd4, 0xdd, 0x78, 0x06, 0x9d, 0x4b,
-	0x3b, 0x41, 0x8f, 0x01, 0x78, 0xce, 0x12, 0xe6, 0x04, 0x27, 0x34, 0x65, 0xa9, 0xd2, 0x80, 0xf0,
-	0xe4, 0xc5, 0xdc, 0x08, 0x37, 0xe3, 0xf9, 0xa7, 0xfa, 0x27, 0x09, 0x9a, 0x59, 0xa4, 0xd0, 0x1d,
-	0xe0, 0xb7, 0xee, 0xf8, 0x38, 0xbf, 0xc3, 0x75, 0x31, 0x4e, 0x2f, 0xb0, 0x50, 0x05, 0xce, 0x84,
-	0x66, 0x17, 0x98, 0x4b, 0x86, 0xce, 0x84, 0xa2, 0x75, 0xa8, 0xb3, 0x30, 0x9c, 0x70, 0x60, 0x92,
-	0xfa, 0x37, 0xf8, 0x30, 0xb9, 0xd9, 0x42, 0x21, 0x60, 0x49, 0x92, 0x37, 0xb8, 0x40, 0xa0, 0xee,
-	0x01, 0x4c, 0x1d, 0x16, 0x9f, 0x93, 0xc8, 0xff, 0x21, 0xa9, 0x12, 0x35, 0xdc, 0x14, 0x92, 0x91,
-	0xff, 0x03, 0x55, 0x7b, 0xd0, 0xcc, 0x36, 0xcd, 0x27, 0x3a, 0xa2, 0x27, 0x7e, 0x50, 0xf0, 0x64,
-	0x43, 0x08, 0xb8, 0x0f, 0xd7, 0xa1, 0xce, 0xc9, 0x6b, 0xee, 0xba, 0x2a, 0xbe, 0x41, 0x03, 0x6f,
-	0x44, 0x5d, 0xf5, 0x77, 0x12, 0xb4, 0x52, 0x9e, 0xfc, 0x3f, 0x30, 0xfa, 0xa7, 0x50, 0x4f, 0x73,
-	0x36, 0x25, 0xf1, 0xbb, 0x6f, 0x21, 0x71, 0x3c, 0xb7, 0x55, 0xdf, 0x00, 0xd4, 0x53, 0xe1, 0xff,
-	0xcc, 0x14, 0x08, 0x96, 0x84, 0x2b, 0x13, 0x2f, 0x8b, 0x6f, 0xb4, 0x09, 0x2d, 0x8f, 0x46, 0x2e,
-	0xf3, 0x93, 0x5b, 0x9d, 0x78, 0xb9, 0x28, 0x42, 0x1f, 0x43, 0x6d, 0xca, 0xfc, 0xb4, 0x12, 0xb7,
-	0x76, 0xee, 0x94, 0x6d, 0xdb, 0xe2, 0x06, 0x38, 0xb1, 0x43, 0x5f, 0x40, 0x8d, 0xcd, 0xc6, 0x34,
-	0x4a, 0x89, 0xf6, 0x41, 0xe9, 0x39, 0x93, 0xbb, 0xe8, 0x07, 0x27, 0x98, 0x9b, 0xe2, 0x04, 0x81,
-	0xbe, 0x80, 0xa5, 0xe3, 0x90, 0x4d, 0x94, 0xba, 0xf0, 0xd0, 0x87, 0x6f, 0xf1, 0x90, 0x11, 0xc4,
-	0xce, 0x2b, 0xba, 0x17, 0xb2, 0x09, 0x16, 0x10, 0x34, 0x82, 0x5b, 0x53, 0x46, 0xe7, 0x0c, 0x11,
-	0x9f, 0x4f, 0xa9, 0x60, 0x98, 0xe5, 0x9d, 0xed, 0xb7, 0xcc, 0xd2, 0xb5, 0x32, 0x88, 0x7d, 0x3e,
-	0xa5, 0x78, 0x79, 0xba, 0x30, 0x46, 0x9f, 0x41, 0x23, 0x76, 0x5e, 0x13, 0xe6, 0xc4, 0x54, 0x69,
-	0x8a, 0xd3, 0x94, 0x46, 0xcd, 0x76, 0x5e, 0x63, 0x27, 0xa6, 0xb8, 0x1e, 0x27, 0x1f, 0xe5, 0x5c,
-	0x05, 0xe5, 0x5c, 0xf5, 0x29, 0xd4, 0x3d, 0x3a, 0x0d, 0x23, 0x3f, 0x56, 0x5a, 0x57, 0x2f, 0xd1,
-	0x4f, 0x4c, 0xf0, 0xdc, 0x16, 0xfd, 0x1a, 0x5a, 0x41, 0x48, 0xa2, 0xd3, 0xf0, 0x7b, 0x72, 0x4c,
-	0xa9, 0xd2, 0xbe, 0x3a, 0x79, 0x87, 0xe1, 0xe8, 0x34, 0xfc, 0x7e, 0x8f, 0x52, 0xdc, 0x0c, 0xe6,
-	0x9f, 0xe8, 0x10, 0x56, 0x18, 0xfd, 0xed, 0xcc, 0x67, 0x94, 0xb8, 0x8c, 0x7a, 0x7e, 0x4c, 0x5c,
-	0x87, 0x79, 0xca, 0x4d, 0xe1, 0xb2, 0x0f, 0xcb, 0x49, 0x59, 0x98, 0x6b, 0xc2, 0x5a, 0x73, 0x98,
-	0xc7, 0x6b, 0xe4, 0x05, 0x11, 0xfa, 0x1a, 0x5a, 0x8e, 0x68, 0xaf, 0xc8, 0xd8, 0x0f, 0x5e, 0x29,
-	0xcb, 0x22, 0x8e, 0x1f, 0x94, 0x92, 0xa4, 0x30, 0x1b, 0xf8, 0xc1, 0x2b, 0x0c, 0x4e, 0xf6, 0x8d,
-	0xbe, 0x84, 0x25, 0x11, 0xbb, 0x5b, 0x62, 0x23, 0x6f, 0x6b, 0x74, 0xe6, 0x7f, 0x45, 0xe0, 0x04,
-	0x88, 0xaf, 0x1e, 0xfb, 0xee, 0x2b, 0x9a, 0xc6, 0x5f, 0xbe, 0x7a, 0x75, 0x5b, 0x98, 0x09, 0x28,
-	0xc4, 0xd9, 0x37, 0xd2, 0xe1, 0x26, 0xa3, 0x63, 0x27, 0xa6, 0x1e, 0x99, 0x50, 0xcf, 0x77, 0x94,
-	0xce, 0xd5, 0x35, 0x1e, 0x27, 0x86, 0x07, 0xdc, 0x0e, 0xb7, 0x59, 0x61, 0x84, 0x4e, 0x61, 0x23,
-	0xeb, 0xde, 0xe2, 0x98, 0xf9, 0x47, 0xb3, 0x98, 0x92, 0x33, 0x67, 0x3c, 0x13, 0x79, 0x89, 0xc4,
-	0x9c, 0x0f, 0xdf, 0xd6, 0xc3, 0xcd, 0x41, 0xcf, 0x39, 0xc6, 0xf0, 0xf0, 0x7a, 0x54, 0xae, 0x50,
-	0xbf, 0x83, 0xe5, 0xc5, 0x2b, 0x8c, 0xee, 0xc3, 0x5d, 0x0b, 0xeb, 0x56, 0xef, 0x25, 0x6f, 0x4f,
-	0x89, 0xfd, 0xd2, 0xd2, 0xc9, 0xe1, 0x70, 0x64, 0xe9, 0x9a, 0xb1, 0x67, 0xe8, 0x7d, 0xf9, 0x3d,
-	0xd4, 0x86, 0x06, 0xd6, 0x9f, 0x1d, 0x1a, 0x58, 0xef, 0xcb, 0x12, 0x1f, 0x99, 0x96, 0x6d, 0x98,
-	0x43, 0xde, 0xc9, 0xa2, 0x0e, 0xdc, 0x1c, 0x9a, 0x36, 0x19, 0x1d, 0x5a, 0x96, 0x89, 0x6d, 0xbd,
-	0x2f, 0x57, 0xd5, 0xbf, 0xe6, 0x2c, 0x28, 0xe6, 0x7f, 0x1f, 0x94, 0x91, 0x8e, 0x9f, 0x1b, 0x9a,
-	0x5e, 0x36, 0xf9, 0x03, 0xb8, 0xbf, 0xa0, 0xed, 0x1b, 0x43, 0x63, 0xf8, 0x84, 0x60, 0x9d, 0x4b,
-	0x7b, 0x7c, 0x1d, 0x59, 0x42, 0x1f, 0xc0, 0xc6, 0x82, 0xd1, 0x9e, 0x69, 0xf6, 0x89, 0x89, 0xfb,
-	0x3a, 0x36, 0x86, 0x4f, 0xe4, 0x0a, 0xba, 0x07, 0x77, 0x16, 0xf4, 0xfa, 0x73, 0x71, 0x14, 0x43,
-	0x7b, 0xaa, 0xdb, 0x72, 0x95, 0xb7, 0xe2, 0x0b, 0x6a, 0x1b, 0x1b, 0x16, 0xb1, 0xcd, 0x43, 0x2c,
-	0x2f, 0xa9, 0x3f, 0x42, 0x4d, 0x70, 0x11, 0x6f, 0x7c, 0x04, 0x1b, 0x91, 0x89, 0xef, 0xb2, 0x30,
-	0x4a, 0x59, 0xbf, 0x25, 0x64, 0x07, 0x42, 0x84, 0x1e, 0xc0, 0xcd, 0xb4, 0xe4, 0x9e, 0x13, 0x37,
-	0xf4, 0xe6, 0x95, 0xa9, 0x3d, 0x17, 0x6a, 0xa1, 0x47, 0xd1, 0x47, 0x80, 0x38, 0x86, 0xbf, 0x9c,
-	0xd2, 0x4c, 0xe6, 0xfd, 0x4d, 0xc2, 0xa0, 0x72, 0xaa, 0x49, 0x52, 0xd9, 0x76, 0x4e, 0xd4, 0x3f,
-	0x56, 0xe0, 0xd6, 0x05, 0x6a, 0xe3, 0x4d, 0xeb, 0xc4, 0x0f, 0x88, 0xe3, 0x9d, 0x39, 0x81, 0x4b,
-	0x49, 0x1a, 0xf0, 0x74, 0x43, 0x9d, 0x89, 0x1f, 0xf4, 0x12, 0xcd, 0x6e, 0xa2, 0x40, 0x5f, 0xc3,
-	0xfb, 0x45, 0xfb, 0x30, 0x18, 0xfb, 0x01, 0x25, 0x2e, 0x1f, 0xf0, 0x49, 0xd3, 0x22, 0x75, 0x27,
-	0x07, 0x9a, 0xc2, 0x42, 0x9b, 0x1b, 0xa0, 0x67, 0x70, 0x9b, 0xdf, 0xc5, 0x14, 0x32, 0x4e, 0x9a,
-	0x3f, 0xce, 0x11, 0xd5, 0x6b, 0x08, 0x7c, 0xb7, 0xa2, 0x48, 0x78, 0x85, 0x63, 0xb5, 0x02, 0x94,
-	0xb3, 0xc5, 0x63, 0x80, 0x20, 0xcc, 0xb8, 0x66, 0xe9, 0x5d, 0xe6, 0x69, 0x26, 0x80, 0x3d, 0x4a,
-	0xd5, 0x2e, 0xd4, 0x53, 0x86, 0xe4, 0x3e, 0x17, 0x01, 0x21, 0x53, 0xca, 0x5c, 0x1a, 0x24, 0x0f,
-	0x8b, 0x1a, 0x6e, 0x0b, 0xa1, 0x95, 0xc8, 0xd4, 0xbf, 0x57, 0x60, 0xed, 0x12, 0xcd, 0xef, 0xf9,
-	0x74, 0xec, 0xa1, 0xfd, 0x94, 0x1e, 0x92, 0x97, 0xeb, 0x27, 0xef, 0x54, 0x20, 0x04, 0xb2, 0x2b,
-	0x7e, 0x0b, 0x5c, 0xb1, 0x0a, 0xb5, 0xb1, 0x73, 0x44, 0xc7, 0x69, 0xd4, 0x93, 0x01, 0x97, 0x8a,
-	0x3c, 0x55, 0xaa, 0x82, 0xac, 0x93, 0x01, 0x2f, 0xbc, 0x3e, 0x7f, 0x40, 0x08, 0xb6, 0xf3, 0xc4,
-	0xf9, 0x1b, 0x18, 0xfc, 0x28, 0xa5, 0x44, 0x4f, 0xfd, 0xbd, 0x04, 0xcd, 0x6c, 0x01, 0x7e, 0x41,
-	0xf7, 0x0c, 0x7d, 0xd0, 0x2f, 0x4b, 0x10, 0x19, 0xda, 0xa3, 0x7d, 0x13, 0xdb, 0xa4, 0x37, 0x1c,
-	0xbd, 0xd0, 0xb1, 0x2c, 0xa1, 0x9b, 0xd0, 0xb4, 0x7a, 0xb8, 0xf7, 0x04, 0xf7, 0xac, 0x7d, 0xb9,
-	0xc2, 0x9f, 0xa5, 0x07, 0x87, 0x03, 0xdb, 0xb0, 0x06, 0x3a, 0xd1, 0xf6, 0x4d, 0x43, 0xd3, 0xe5,
-	0x2a, 0x5a, 0x06, 0xd0, 0xf6, 0x75, 0xed, 0xe9, 0xae, 0xf9, 0xad, 0x3e, 0x92, 0x97, 0x78, 0xd6,
-	0xf6, 0xb1, 0x69, 0xf5, 0xf9, 0xa3, 0xb5, 0x86, 0x5a, 0x50, 0xdf, 0x35, 0xcd, 0x81, 0xde, 0x1b,
-	0xca, 0x37, 0xd4, 0xbf, 0x49, 0xd0, 0xb9, 0xe4, 0x02, 0xf4, 0x0d, 0xd4, 0x8e, 0xf9, 0xfe, 0x14,
-	0x49, 0x90, 0xcf, 0xf6, 0xbb, 0x3b, 0x0e, 0x27, 0x40, 0xfe, 0x5a, 0x3b, 0xf6, 0x59, 0x94, 0xbc,
-	0x0e, 0x89, 0x3b, 0x8b, 0xe2, 0x70, 0x42, 0x59, 0x24, 0xdc, 0xd7, 0xc0, 0x48, 0xe8, 0x78, 0xc7,
-	0xa5, 0xcd, 0x35, 0xe8, 0x63, 0x5e, 0x62, 0xe2, 0x19, 0x0b, 0x78, 0xf2, 0xe4, 0x80, 0x6a, 0x02,
-	0xc8, 0x54, 0x19, 0x40, 0xfd, 0x87, 0x04, 0xf5, 0xb4, 0xce, 0xa1, 0x47, 0x79, 0x55, 0x94, 0xae,
-	0xeb, 0x3b, 0xb2, 0x9a, 0x78, 0x21, 0x75, 0x16, 0x12, 0x20, 0xef, 0xef, 0x0a, 0xa9, 0x53, 0xbc,
-	0xe7, 0xbc, 0x17, 0xfc, 0x06, 0xda, 0xe9, 0x5c, 0x49, 0x05, 0xa9, 0x8a, 0x6b, 0x76, 0xef, 0xca,
-	0xa5, 0xc5, 0x7d, 0x6a, 0xa5, 0x10, 0x3e, 0x50, 0x19, 0x34, 0xb3, 0x7a, 0x8b, 0x1e, 0x42, 0x95,
-	0xe7, 0xcb, 0xb5, 0x07, 0xe0, 0x56, 0xe8, 0x73, 0x68, 0x1c, 0x53, 0xfa, 0x5f, 0xac, 0x5b, 0x3f,
-	0xa6, 0xe2, 0x43, 0xfd, 0x8b, 0x04, 0x90, 0x97, 0x53, 0x24, 0x43, 0x75, 0xc6, 0xc6, 0x69, 0x7b,
-	0xc8, 0x3f, 0xd1, 0x06, 0x34, 0xc6, 0x4e, 0x70, 0x32, 0x73, 0x4e, 0xe6, 0x24, 0x97, 0x8d, 0xd1,
-	0x2f, 0xc4, 0x1b, 0x59, 0xbc, 0x70, 0xa9, 0x47, 0xdc, 0x70, 0x16, 0xc4, 0xec, 0x3c, 0xbd, 0xfe,
-	0x9d, 0x5c, 0xa3, 0x25, 0x0a, 0xf4, 0x15, 0x34, 0xa6, 0x63, 0x27, 0x16, 0x5d, 0xda, 0x92, 0xd8,
-	0xa5, 0x7a, 0x75, 0x75, 0xb7, 0x52, 0x4b, 0x9c, 0x61, 0xd4, 0x3f, 0x48, 0x00, 0x79, 0xf1, 0x45,
-	0x3f, 0x85, 0xe5, 0x42, 0xc5, 0xce, 0xbb, 0xda, 0x76, 0x5e, 0x94, 0x0d, 0x0f, 0x3d, 0x84, 0x4e,
-	0x74, 0x1a, 0xb2, 0x98, 0x14, 0x5b, 0xd5, 0xe4, 0x20, 0xb2, 0x50, 0xf4, 0xcb, 0xfa, 0xd5, 0xea,
-	0xbb, 0xf5, 0xab, 0xea, 0x9f, 0x25, 0x68, 0x17, 0x8b, 0x79, 0x89, 0x03, 0xbf, 0x4a, 0x69, 0xa7,
-	0x72, 0x75, 0x47, 0x59, 0x9c, 0xa1, 0x2b, 0x7e, 0x0b, 0x64, 0xa3, 0x40, 0xdd, 0x75, 0x92, 0x6d,
-	0x27, 0xa5, 0x63, 0x3e, 0x54, 0x3f, 0x82, 0x66, 0x66, 0x8c, 0x56, 0x41, 0x2e, 0xa1, 0x8c, 0x26,
-	0xd4, 0xac, 0x7d, 0xd3, 0x36, 0x65, 0x49, 0x7d, 0x01, 0xeb, 0x57, 0xb4, 0x08, 0xbc, 0xe0, 0xe5,
-	0xbd, 0x46, 0xe6, 0xc7, 0x56, 0x26, 0x33, 0x3c, 0xfe, 0x44, 0xcb, 0x9a, 0x90, 0xc4, 0x7b, 0xf5,
-	0xb3, 0x04, 0xbd, 0xfd, 0x08, 0x9a, 0xd9, 0xc5, 0x42, 0x6b, 0x80, 0xf6, 0x8c, 0x6f, 0xf5, 0x3e,
-	0xc1, 0x3d, 0x5b, 0x27, 0x7d, 0x7d, 0xaf, 0x77, 0x38, 0xb0, 0xe5, 0xf7, 0x38, 0x0b, 0x59, 0x3a,
-	0x26, 0x96, 0x8e, 0x47, 0xbc, 0x8e, 0x6f, 0xff, 0x08, 0x9d, 0x4b, 0x4d, 0x21, 0xef, 0x00, 0xd2,
-	0xf6, 0x82, 0x68, 0x58, 0xef, 0x1b, 0x36, 0xd1, 0x7a, 0xb8, 0x7f, 0xb9, 0x4d, 0x28, 0x33, 0xd2,
-	0xcc, 0x61, 0xdf, 0x48, 0x9b, 0x11, 0xd1, 0x26, 0x94, 0x19, 0xf5, 0x06, 0x2f, 0x7a, 0x2f, 0x47,
-	0x72, 0x65, 0xfb, 0x8d, 0x04, 0xcb, 0x8b, 0xf7, 0x8c, 0x37, 0x3f, 0x3d, 0x8d, 0x4f, 0x40, 0xac,
-	0x41, 0xcf, 0xde, 0x33, 0xf1, 0xc1, 0xe5, 0x85, 0x2f, 0x1a, 0xbc, 0xd0, 0x77, 0x49, 0xcf, 0xb2,
-	0x06, 0x86, 0x56, 0xe8, 0x4f, 0x2e, 0x1a, 0x1d, 0x98, 0xbb, 0xc6, 0x40, 0xe7, 0xb6, 0x72, 0x05,
-	0xdd, 0x85, 0xf5, 0x8b, 0xfa, 0xde, 0xb0, 0x8f, 0x4d, 0xa3, 0x2f, 0x57, 0xd1, 0x3a, 0xac, 0x5c,
-	0x54, 0x1a, 0xe6, 0x48, 0x5e, 0x3a, 0xba, 0x21, 0xfe, 0x65, 0xfb, 0xe8, 0x3f, 0x01, 0x00, 0x00,
-	0xff, 0xff, 0xcc, 0x96, 0x13, 0xc4, 0xc1, 0x15, 0x00, 0x00,
+var fileDescriptor_feeds_fc30b4ddff65807e = []byte{
+	// 2281 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdf, 0x72, 0xdb, 0xc6,
+	0xd5, 0x0f, 0x48, 0xd1, 0x24, 0x0f, 0x29, 0x09, 0x5c, 0x29, 0x12, 0x2c, 0xc7, 0xb1, 0x3e, 0xf8,
+	0xcb, 0x54, 0x95, 0x53, 0xa6, 0x95, 0x93, 0x4c, 0x32, 0x71, 0x93, 0x50, 0x20, 0x64, 0x61, 0x4c,
+	0x11, 0xf0, 0x12, 0xb2, 0xe3, 0xde, 0x6c, 0x20, 0x60, 0x45, 0x61, 0x4c, 0x02, 0xec, 0x02, 0x54,
+	0xac, 0xcc, 0xe4, 0xa6, 0x57, 0xbd, 0xec, 0x4c, 0xef, 0xfa, 0x04, 0xed, 0xd4, 0x0f, 0xd0, 0xc9,
+	0x5d, 0x9f, 0xa8, 0x0f, 0xd0, 0x9b, 0xce, 0x2e, 0x40, 0x10, 0x94, 0x20, 0xcb, 0x6d, 0x72, 0x23,
+	0x61, 0xcf, 0x39, 0xbf, 0xfd, 0x73, 0xce, 0x9e, 0xdf, 0x39, 0x4b, 0x68, 0x9c, 0x52, 0xea, 0x45,
+	0xed, 0x09, 0x0b, 0xe3, 0x10, 0xa1, 0xb1, 0x33, 0x89, 0xda, 0x27, 0x61, 0xf8, 0xd2, 0x0f, 0x86,
+	0x6d, 0xa1, 0x51, 0xff, 0x55, 0x82, 0xe6, 0x01, 0xa5, 0xde, 0x11, 0x8d, 0x1d, 0xcf, 0x89, 0x1d,
+	0x34, 0x86, 0x8d, 0x09, 0x0b, 0x5d, 0x1a, 0x45, 0x7e, 0x30, 0x24, 0x7e, 0x10, 0xc5, 0x6c, 0xea,
+	0xc6, 0x7e, 0x18, 0x28, 0xd2, 0xb6, 0xb4, 0xb3, 0xb2, 0xf7, 0x69, 0xfb, 0xea, 0x2c, 0xed, 0xfc,
+	0x0c, 0x6d, 0x2b, 0x83, 0x1b, 0x73, 0x34, 0x7e, 0x77, 0x52, 0x24, 0x46, 0xff, 0x07, 0xcd, 0xe8,
+	0xcc, 0x61, 0x1e, 0x09, 0xa6, 0xe3, 0x13, 0xca, 0x94, 0xd2, 0xb6, 0xb4, 0x53, 0xc1, 0x0d, 0x21,
+	0xeb, 0x0b, 0x11, 0x37, 0x89, 0xc3, 0xd8, 0x19, 0x11, 0x21, 0x8c, 0x94, 0x72, 0x62, 0x22, 0x64,
+	0x03, 0x21, 0x42, 0xeb, 0x50, 0x09, 0xc2, 0xc0, 0xa5, 0x4a, 0x65, 0x5b, 0xda, 0x59, 0xc2, 0xc9,
+	0x00, 0xfd, 0x06, 0xd6, 0x87, 0x34, 0xa0, 0xcc, 0xe1, 0x2b, 0x91, 0xd8, 0x1f, 0xd3, 0x28, 0x76,
+	0xc6, 0x13, 0x65, 0x69, 0x5b, 0xda, 0x29, 0xe3, 0xb5, 0xb9, 0xce, 0x9e, 0xa9, 0x54, 0x07, 0xde,
+	0x2d, 0xdc, 0x3e, 0x5a, 0x83, 0x55, 0x0b, 0x9b, 0x9a, 0x3e, 0x18, 0x90, 0xe3, 0xfe, 0x93, 0xbe,
+	0xf9, 0xbc, 0x2f, 0xbf, 0x83, 0x36, 0x61, 0x6d, 0x26, 0xec, 0x0c, 0x88, 0x66, 0x1e, 0x59, 0x3d,
+	0xdd, 0xd6, 0x65, 0x09, 0x6d, 0xc1, 0x46, 0x4e, 0x61, 0xf4, 0x35, 0xac, 0x1f, 0xe9, 0x7d, 0xbb,
+	0xd3, 0x93, 0x4b, 0xea, 0x6b, 0x09, 0xe4, 0xce, 0xb9, 0xe3, 0x8f, 0x9c, 0x13, 0x7f, 0xe4, 0xc7,
+	0x17, 0xdc, 0x77, 0xe8, 0x11, 0xd4, 0xc6, 0xa9, 0xff, 0x84, 0x9f, 0x1b, 0x7b, 0xdb, 0x37, 0xf9,
+	0x19, 0x67, 0x08, 0xf4, 0x3b, 0x58, 0x8f, 0x28, 0x3b, 0xf7, 0x5d, 0x4a, 0x9c, 0xdc, 0xcc, 0x4a,
+	0x69, 0xbb, 0xbc, 0xd3, 0xd8, 0xfb, 0x45, 0xd1, 0x4c, 0x83, 0xc4, 0x3e, 0xbf, 0x11, 0xbc, 0x16,
+	0x5d, 0x15, 0xaa, 0xff, 0x2e, 0xc1, 0x5a, 0x81, 0x31, 0xfa, 0x0c, 0x94, 0x28, 0x76, 0x58, 0x3c,
+	0xf7, 0x2b, 0x61, 0x34, 0x8a, 0x99, 0xef, 0xc6, 0xe2, 0x04, 0x65, 0xbc, 0x21, 0xf4, 0x99, 0x6f,
+	0x71, 0xaa, 0x45, 0x1f, 0xc3, 0x06, 0x0d, 0xbc, 0x22, 0x5c, 0x49, 0xe0, 0xd6, 0x69, 0xe0, 0x5d,
+	0x45, 0xfd, 0x1a, 0xd6, 0xc7, 0x94, 0xb9, 0x67, 0x4e, 0x10, 0x13, 0xdf, 0x9b, 0x63, 0xf8, 0x6d,
+	0xa8, 0x63, 0x34, 0xd3, 0x19, 0x5e, 0x86, 0x68, 0xc3, 0xec, 0x40, 0x0b, 0x80, 0x25, 0x01, 0x68,
+	0xa5, 0xaa, 0x9c, 0x7d, 0x0f, 0x10, 0xa3, 0x51, 0x38, 0x65, 0x2e, 0x8d, 0xe6, 0xe6, 0xb7, 0x44,
+	0x34, 0xee, 0x16, 0xf9, 0x10, 0xcf, 0xac, 0x71, 0x2b, 0x03, 0x66, 0xb3, 0x75, 0xa1, 0xb9, 0x10,
+	0x8b, 0x8a, 0x88, 0x45, 0x61, 0x54, 0x17, 0x82, 0xb0, 0x80, 0x52, 0x7f, 0xac, 0x42, 0x73, 0xc1,
+	0xed, 0xf7, 0xa0, 0x91, 0x73, 0x83, 0xf0, 0x74, 0x1d, 0xc3, 0xfc, 0xf4, 0xe8, 0x2e, 0xc0, 0xfc,
+	0xd4, 0xc2, 0xa3, 0x75, 0x5c, 0xcf, 0x0e, 0x8b, 0xee, 0x40, 0x3d, 0x09, 0x5b, 0x44, 0x5d, 0xe1,
+	0xbb, 0x32, 0xae, 0x09, 0xc1, 0x80, 0xba, 0x3c, 0xd3, 0xbc, 0x69, 0x9a, 0x2e, 0x5c, 0x9f, 0x24,
+	0x4a, 0x63, 0x26, 0xe3, 0x26, 0xf7, 0xa0, 0x11, 0x4d, 0xc2, 0x38, 0x22, 0x22, 0xfd, 0x44, 0xbe,
+	0x95, 0x31, 0x08, 0x91, 0xcd, 0x25, 0x62, 0x7d, 0x61, 0x10, 0x4e, 0x68, 0x20, 0xbc, 0x57, 0xc6,
+	0x75, 0x21, 0x31, 0x27, 0x34, 0x40, 0xbf, 0x04, 0x39, 0x7f, 0x40, 0x12, 0x3b, 0x43, 0xa5, 0x2a,
+	0x36, 0xb9, 0x9a, 0x97, 0xdb, 0xce, 0x10, 0x7d, 0x01, 0xf5, 0xcc, 0xad, 0x4a, 0xed, 0x6d, 0xc2,
+	0x30, 0xb7, 0x47, 0xbb, 0xd0, 0x9a, 0x38, 0x17, 0x63, 0x1a, 0xc4, 0x24, 0x9c, 0x88, 0x03, 0xf9,
+	0x9e, 0x52, 0xdf, 0x2e, 0xf3, 0x85, 0x52, 0x85, 0x29, 0xe4, 0x86, 0x87, 0x9e, 0x00, 0x30, 0xea,
+	0x4e, 0x19, 0xa3, 0x9c, 0x42, 0x40, 0xac, 0xf4, 0xe0, 0xa6, 0x40, 0xb5, 0x71, 0x06, 0xc1, 0x39,
+	0x38, 0x72, 0x00, 0x45, 0xee, 0x19, 0xf5, 0xa6, 0x23, 0x4a, 0xe8, 0x2b, 0x97, 0x8a, 0x45, 0x94,
+	0x86, 0x88, 0xfe, 0xde, 0x8d, 0x93, 0x0e, 0x52, 0xa8, 0x3e, 0x43, 0xe2, 0x56, 0x74, 0x59, 0x84,
+	0x3e, 0x81, 0xaa, 0x47, 0x27, 0x61, 0xe4, 0xc7, 0x4a, 0x53, 0x6c, 0xf6, 0x4e, 0xd1, 0xbc, 0xdd,
+	0xc4, 0x04, 0xcf, 0x6c, 0xd1, 0x6f, 0xa1, 0x11, 0x84, 0x24, 0x3a, 0x0b, 0xbf, 0x23, 0xa7, 0x94,
+	0x2a, 0xcb, 0xd7, 0x7b, 0xb4, 0x1f, 0x0e, 0xce, 0xc2, 0xef, 0x0e, 0x28, 0xc5, 0xf5, 0x60, 0xf6,
+	0x89, 0x8e, 0x61, 0x8d, 0xd1, 0xdf, 0x4f, 0x7d, 0x46, 0x89, 0xcb, 0xa8, 0xe7, 0xc7, 0xc4, 0x75,
+	0x98, 0xa7, 0xac, 0x88, 0xaa, 0xf0, 0x41, 0x71, 0x60, 0x84, 0xb9, 0x26, 0xac, 0x35, 0x87, 0x79,
+	0x3c, 0x4f, 0x2e, 0x89, 0xd0, 0xff, 0xc3, 0x4a, 0xec, 0xbb, 0x2f, 0x69, 0x4c, 0xe2, 0x8b, 0x89,
+	0xb8, 0xb3, 0xab, 0x22, 0x4a, 0xcd, 0x44, 0x6a, 0x5f, 0x4c, 0xa8, 0xe1, 0x6d, 0x7d, 0x0b, 0x30,
+	0xf7, 0x37, 0xda, 0x01, 0x99, 0xd1, 0x09, 0x75, 0x62, 0x32, 0x0d, 0x62, 0x7f, 0x24, 0xee, 0x6a,
+	0xc2, 0x39, 0x2b, 0x89, 0xfc, 0x98, 0x8b, 0xf9, 0x75, 0x9d, 0x5b, 0xd2, 0x73, 0xca, 0x2e, 0x84,
+	0x65, 0x52, 0x62, 0x52, 0x4b, 0x9d, 0x8b, 0x07, 0xd4, 0xdd, 0x7a, 0x0a, 0xad, 0x2b, 0xce, 0x47,
+	0x8f, 0x00, 0x38, 0x4d, 0x11, 0xe6, 0x04, 0x43, 0x9a, 0x12, 0x73, 0xa1, 0xc7, 0x38, 0x5f, 0x61,
+	0x6e, 0x84, 0xeb, 0xf1, 0xec, 0x53, 0xfd, 0x8b, 0x04, 0xf5, 0xec, 0x72, 0xa2, 0xdb, 0xc0, 0x13,
+	0xed, 0xf4, 0x74, 0x9e, 0xb6, 0x55, 0x31, 0x4e, 0x73, 0x56, 0xa8, 0x02, 0x67, 0x4c, 0xb3, 0x9c,
+	0xe5, 0x92, 0xbe, 0x33, 0xa6, 0x68, 0x13, 0xaa, 0x2c, 0x0c, 0xc7, 0x1c, 0x98, 0xb0, 0xdd, 0x2d,
+	0x3e, 0x4c, 0x92, 0x59, 0x28, 0x04, 0x2c, 0xe1, 0xb5, 0x1a, 0x17, 0x08, 0xd4, 0x5d, 0x80, 0x89,
+	0xc3, 0xe2, 0x0b, 0x12, 0xf9, 0xdf, 0x27, 0x85, 0xb1, 0x82, 0xeb, 0x42, 0x32, 0xf0, 0xbf, 0xa7,
+	0x6a, 0x07, 0xea, 0xd9, 0xa6, 0xf9, 0x44, 0x27, 0x74, 0xe8, 0x07, 0x39, 0x4f, 0xd6, 0x84, 0x80,
+	0xfb, 0x70, 0x13, 0xaa, 0x9c, 0xaf, 0x67, 0xae, 0x2b, 0xe3, 0x5b, 0x34, 0xf0, 0x06, 0xd4, 0x55,
+	0xff, 0x20, 0x41, 0x23, 0x2d, 0x0d, 0x3f, 0x43, 0x11, 0xfb, 0x04, 0xaa, 0x29, 0x4d, 0xa5, 0x75,
+	0xeb, 0xce, 0x1b, 0xea, 0x16, 0x9e, 0xd9, 0xaa, 0xaf, 0x01, 0xaa, 0xa9, 0xf0, 0x27, 0x93, 0x23,
+	0x82, 0x25, 0xe1, 0xca, 0xc4, 0xcb, 0xe2, 0x1b, 0x6d, 0x43, 0xc3, 0xa3, 0x91, 0xcb, 0xfc, 0x24,
+	0x91, 0x13, 0x2f, 0xe7, 0x45, 0xe8, 0x23, 0xa8, 0x4c, 0x98, 0x9f, 0x36, 0x1f, 0x8d, 0xbd, 0xdb,
+	0x45, 0xdb, 0xb6, 0xb8, 0x01, 0x4e, 0xec, 0xd0, 0xe7, 0x50, 0x61, 0xd3, 0x11, 0x8d, 0xd2, 0xda,
+	0x72, 0xbf, 0xf0, 0x9c, 0xc9, 0x5d, 0xf4, 0x83, 0x21, 0xe6, 0xa6, 0x38, 0x41, 0xa0, 0xcf, 0x61,
+	0xe9, 0x34, 0x64, 0x63, 0xa5, 0x2a, 0x3c, 0xf4, 0xc1, 0x1b, 0x3c, 0x64, 0x04, 0xb1, 0xf3, 0x92,
+	0x1e, 0x84, 0x6c, 0x8c, 0x05, 0x04, 0x0d, 0x60, 0x75, 0xc2, 0xe8, 0x8c, 0x14, 0x79, 0xb2, 0x09,
+	0x52, 0x5d, 0xd9, 0xdb, 0x7d, 0xc3, 0x2c, 0x6d, 0x2b, 0x83, 0xf0, 0x4c, 0xc4, 0x2b, 0x93, 0x85,
+	0x31, 0xfa, 0x14, 0x6a, 0xb1, 0xf3, 0x8a, 0x30, 0x27, 0xa6, 0x4a, 0xfd, 0x7a, 0x2e, 0xb2, 0x9d,
+	0x57, 0xd8, 0x89, 0x29, 0xae, 0xc6, 0xc9, 0x47, 0x31, 0x3d, 0x43, 0x31, 0x3d, 0xe7, 0xe8, 0xae,
+	0xf1, 0xbf, 0xd3, 0x5d, 0xf3, 0xe7, 0xa1, 0xbb, 0xe5, 0x9f, 0x48, 0x77, 0x5f, 0x41, 0xc3, 0x11,
+	0x1d, 0x25, 0x19, 0xf9, 0xc1, 0x4b, 0x65, 0x45, 0xc4, 0xf1, 0xfd, 0xc2, 0xba, 0x20, 0xcc, 0x7a,
+	0x7e, 0xf0, 0x12, 0x83, 0x93, 0x7d, 0xa3, 0x2f, 0x60, 0x49, 0xc4, 0x6e, 0x55, 0x6c, 0xe4, 0x4d,
+	0xbd, 0xdd, 0xec, 0xbf, 0x08, 0x9c, 0x00, 0xf1, 0xd5, 0x73, 0x64, 0xab, 0xc8, 0xd7, 0xaf, 0x6e,
+	0x67, 0xec, 0x8b, 0x61, 0xce, 0xc4, 0x48, 0x87, 0x65, 0x46, 0x47, 0x4e, 0x4c, 0x3d, 0x32, 0xa6,
+	0x9e, 0xef, 0x28, 0xad, 0xeb, 0xdb, 0x1a, 0x9c, 0x18, 0x1e, 0x71, 0x3b, 0xdc, 0x64, 0xb9, 0x11,
+	0x3a, 0x83, 0xad, 0xac, 0x61, 0x8d, 0x63, 0xe6, 0x9f, 0x4c, 0x63, 0x4a, 0xce, 0x9d, 0xd1, 0x54,
+	0xe4, 0x25, 0x12, 0x73, 0x3e, 0x78, 0x53, 0xdb, 0x3a, 0x03, 0x3d, 0xe3, 0x18, 0xc3, 0xc3, 0x9b,
+	0x51, 0xb1, 0x42, 0xfd, 0x16, 0x56, 0x16, 0xaf, 0x30, 0xba, 0x07, 0x77, 0x2c, 0xac, 0x5b, 0x9d,
+	0x17, 0xbc, 0x23, 0x27, 0xf6, 0x0b, 0x4b, 0x27, 0xc7, 0xfd, 0x81, 0xa5, 0x6b, 0xc6, 0x81, 0xa1,
+	0x77, 0xe5, 0x77, 0x50, 0x13, 0x6a, 0x58, 0x7f, 0x7a, 0x6c, 0x60, 0xbd, 0x2b, 0x4b, 0x7c, 0x64,
+	0x5a, 0xb6, 0x61, 0xf6, 0x79, 0xf3, 0x8e, 0x5a, 0xb0, 0xdc, 0x37, 0x6d, 0x32, 0x38, 0xb6, 0x2c,
+	0x13, 0xdb, 0x7a, 0x57, 0x2e, 0xab, 0x7f, 0x9f, 0xb3, 0xa0, 0x98, 0xff, 0x3d, 0x50, 0x06, 0x3a,
+	0x7e, 0x66, 0x68, 0x7a, 0xd1, 0xe4, 0xf7, 0xe1, 0xde, 0x82, 0xb6, 0x6b, 0xf4, 0x8d, 0xfe, 0x63,
+	0x82, 0x75, 0x2e, 0xed, 0xf0, 0x75, 0x64, 0x09, 0xbd, 0x0f, 0x5b, 0x0b, 0x46, 0x07, 0xa6, 0xd9,
+	0x25, 0x26, 0xee, 0xea, 0xd8, 0xe8, 0x3f, 0x96, 0x4b, 0xe8, 0x2e, 0xdc, 0x5e, 0xd0, 0xeb, 0xcf,
+	0xc4, 0x51, 0x0c, 0xed, 0x89, 0x6e, 0xcb, 0x65, 0xfe, 0xfa, 0x58, 0x50, 0xdb, 0xd8, 0xb0, 0x88,
+	0x6d, 0x1e, 0x63, 0x79, 0x49, 0xfd, 0x01, 0x2a, 0x82, 0x8b, 0x78, 0xaf, 0x27, 0xd8, 0x88, 0x8c,
+	0x7d, 0x97, 0x85, 0x51, 0xca, 0xfa, 0x0d, 0x21, 0x3b, 0x12, 0x22, 0x74, 0x1f, 0x96, 0xd3, 0x92,
+	0x7b, 0x41, 0xdc, 0xd0, 0x9b, 0x55, 0xa6, 0xe6, 0x4c, 0xa8, 0x85, 0x1e, 0x45, 0x1f, 0x02, 0xe2,
+	0x18, 0xfe, 0x58, 0x4c, 0x33, 0x99, 0xb7, 0x74, 0x09, 0x83, 0xca, 0xa9, 0x26, 0x49, 0x65, 0xdb,
+	0x19, 0xaa, 0x7f, 0x2e, 0xc1, 0xea, 0x25, 0x6a, 0xe3, 0x7d, 0xfa, 0xd8, 0x0f, 0x88, 0xe3, 0x9d,
+	0x3b, 0x81, 0x4b, 0x49, 0x1a, 0xf0, 0x74, 0x43, 0xad, 0xb1, 0x1f, 0x74, 0x12, 0xcd, 0x7e, 0xa2,
+	0x40, 0x5f, 0xc1, 0x7b, 0x79, 0xfb, 0x30, 0x18, 0xf9, 0x01, 0x25, 0x2e, 0x1f, 0xf0, 0x49, 0xd3,
+	0x22, 0x75, 0x7b, 0x0e, 0x34, 0x85, 0x85, 0x36, 0x33, 0x40, 0x4f, 0xe1, 0x5d, 0x7e, 0x17, 0x53,
+	0xc8, 0x28, 0xe9, 0x77, 0x39, 0x47, 0x94, 0x6f, 0x20, 0xf0, 0xfd, 0x92, 0x22, 0xe1, 0x35, 0x8e,
+	0xd5, 0x72, 0x50, 0xce, 0x16, 0x8f, 0x00, 0x82, 0x30, 0xe3, 0x9a, 0xa5, 0xb7, 0x99, 0xa7, 0x9e,
+	0x00, 0x0e, 0x28, 0x55, 0xdb, 0x50, 0x4d, 0x19, 0x92, 0xfb, 0x5c, 0x04, 0x84, 0x4c, 0x28, 0x73,
+	0x69, 0x90, 0xbc, 0xa5, 0x2a, 0xb8, 0x29, 0x84, 0x56, 0x22, 0x53, 0x7f, 0x2c, 0xc1, 0xc6, 0x15,
+	0x9a, 0x3f, 0xf0, 0xe9, 0xc8, 0x43, 0x87, 0x29, 0x3d, 0x24, 0x8f, 0xf5, 0x8f, 0xdf, 0xaa, 0x40,
+	0x08, 0x64, 0x5b, 0xfc, 0xcd, 0x71, 0xc5, 0x3a, 0x54, 0x46, 0xce, 0x09, 0x1d, 0xa5, 0x51, 0x4f,
+	0x06, 0x5c, 0x2a, 0xf2, 0x54, 0x29, 0x0b, 0xb2, 0x4e, 0x06, 0xbc, 0xf0, 0xfa, 0xfc, 0xcd, 0x24,
+	0xd8, 0xce, 0x13, 0xe7, 0xaf, 0x61, 0xf0, 0xa3, 0x94, 0x12, 0x3d, 0xf5, 0x8f, 0x12, 0xd4, 0xb3,
+	0x05, 0xf8, 0x05, 0x3d, 0x30, 0xf4, 0x5e, 0xb7, 0x28, 0x41, 0x64, 0x68, 0x0e, 0x0e, 0x4d, 0x6c,
+	0x93, 0x4e, 0x7f, 0xf0, 0x5c, 0xc7, 0xb2, 0x84, 0x96, 0xa1, 0x6e, 0x75, 0x70, 0xe7, 0x31, 0xee,
+	0x58, 0x87, 0x72, 0x89, 0xbf, 0xc4, 0x8f, 0x8e, 0x7b, 0xb6, 0x61, 0xf5, 0x74, 0xa2, 0x1d, 0x9a,
+	0x86, 0xa6, 0xcb, 0x65, 0xb4, 0x02, 0xa0, 0x1d, 0xea, 0xda, 0x93, 0x7d, 0xf3, 0x1b, 0x7d, 0x20,
+	0x2f, 0xf1, 0xac, 0xed, 0x62, 0xd3, 0xea, 0xf2, 0x77, 0x7a, 0x05, 0x35, 0xa0, 0xba, 0x6f, 0x9a,
+	0x3d, 0xbd, 0xd3, 0x97, 0x6f, 0xa9, 0xff, 0x90, 0xa0, 0x75, 0xc5, 0x05, 0xe8, 0x6b, 0xa8, 0x9c,
+	0xf2, 0xfd, 0x29, 0x92, 0x20, 0x9f, 0xdd, 0xb7, 0x77, 0x1c, 0x4e, 0x80, 0xfc, 0x81, 0x7a, 0xea,
+	0xb3, 0x28, 0x79, 0x10, 0x13, 0x77, 0x1a, 0xc5, 0xe1, 0x98, 0xb2, 0x48, 0xb8, 0xaf, 0x86, 0x91,
+	0xd0, 0xf1, 0x8e, 0x4b, 0x9b, 0x69, 0xd0, 0x47, 0xbc, 0xc4, 0xc4, 0x53, 0x16, 0xf0, 0xe4, 0x99,
+	0x03, 0xca, 0x09, 0x20, 0x53, 0x65, 0x00, 0xf5, 0x9f, 0x12, 0x54, 0xd3, 0x3a, 0x87, 0x1e, 0xce,
+	0xab, 0xa2, 0x74, 0x53, 0xdf, 0x91, 0xd5, 0xc4, 0x4b, 0xa9, 0xb3, 0x90, 0x00, 0xf3, 0xfe, 0x2e,
+	0x97, 0x3a, 0xf9, 0x7b, 0xce, 0x7b, 0xc1, 0xaf, 0xa1, 0x99, 0xce, 0x95, 0x54, 0x90, 0xb2, 0xb8,
+	0x66, 0x77, 0xaf, 0x5d, 0x5a, 0xdc, 0xa7, 0x46, 0x0a, 0xe1, 0x03, 0x95, 0x41, 0x3d, 0xab, 0xb7,
+	0xe8, 0x01, 0x94, 0x79, 0xbe, 0xdc, 0x78, 0x00, 0x6e, 0x85, 0x3e, 0x83, 0xda, 0x29, 0xa5, 0xff,
+	0xc5, 0xba, 0xd5, 0x53, 0x2a, 0x3e, 0xd4, 0xbf, 0x49, 0x00, 0xf3, 0x72, 0x8a, 0x64, 0x28, 0x4f,
+	0xd9, 0x28, 0x6d, 0x0f, 0xf9, 0x27, 0xda, 0x82, 0xda, 0xc8, 0x09, 0x86, 0x53, 0x67, 0x38, 0x23,
+	0xb9, 0x6c, 0x8c, 0x7e, 0x25, 0x7e, 0x16, 0x10, 0x8f, 0x7a, 0xea, 0x11, 0x37, 0x9c, 0x06, 0x31,
+	0xbb, 0x48, 0xaf, 0x7f, 0x6b, 0xae, 0xd1, 0x12, 0x05, 0xfa, 0x12, 0x6a, 0x93, 0x91, 0x13, 0x8b,
+	0x2e, 0x6d, 0x49, 0xec, 0x52, 0xbd, 0xbe, 0xba, 0x5b, 0xa9, 0x25, 0xce, 0x30, 0xea, 0x9f, 0x24,
+	0x80, 0x79, 0xf1, 0x2d, 0x78, 0x1e, 0x25, 0xdb, 0x5e, 0x78, 0x1e, 0xa1, 0x07, 0xd0, 0x8a, 0xce,
+	0x42, 0x16, 0x93, 0x7c, 0xab, 0x9a, 0x1c, 0x44, 0x16, 0x8a, 0x6e, 0x51, 0xbf, 0x5a, 0x7e, 0xbb,
+	0x7e, 0x55, 0xfd, 0xab, 0x04, 0xcd, 0x7c, 0x31, 0x2f, 0x70, 0xe0, 0x97, 0x29, 0xed, 0x94, 0xae,
+	0xef, 0x28, 0xf3, 0x33, 0xb4, 0xc5, 0xdf, 0x1c, 0xd9, 0x28, 0x50, 0x75, 0x9d, 0x64, 0xdb, 0x49,
+	0xe9, 0x98, 0x0d, 0xd5, 0x0f, 0xa1, 0x9e, 0x19, 0xa3, 0x75, 0x90, 0x0b, 0x28, 0xa3, 0x0e, 0x15,
+	0xeb, 0xd0, 0xb4, 0x4d, 0x59, 0x52, 0x9f, 0xc3, 0xe6, 0x35, 0x2d, 0x02, 0x2f, 0x78, 0xf3, 0x5e,
+	0x23, 0xf3, 0x63, 0x23, 0x93, 0x19, 0x1e, 0x7f, 0xa2, 0x65, 0x4d, 0x48, 0xe2, 0xbd, 0xea, 0x79,
+	0x82, 0xde, 0x7d, 0x08, 0xf5, 0xec, 0x62, 0xa1, 0x0d, 0x40, 0x07, 0xc6, 0x37, 0x7a, 0x97, 0xe0,
+	0x8e, 0xad, 0x93, 0xae, 0x7e, 0xd0, 0x39, 0xee, 0xd9, 0xf2, 0x3b, 0x9c, 0x85, 0x2c, 0x1d, 0x13,
+	0x4b, 0xc7, 0x03, 0x5e, 0xc7, 0x77, 0x7f, 0x80, 0xd6, 0x95, 0xa6, 0x90, 0x77, 0x00, 0x69, 0x7b,
+	0x41, 0x34, 0xac, 0x77, 0x0d, 0x9b, 0x68, 0x1d, 0xdc, 0xbd, 0xda, 0x26, 0x14, 0x19, 0x69, 0x66,
+	0xbf, 0x6b, 0xa4, 0xcd, 0x88, 0x68, 0x13, 0x8a, 0x8c, 0x3a, 0xbd, 0xe7, 0x9d, 0x17, 0x03, 0xb9,
+	0xb4, 0xfb, 0x5a, 0x82, 0x95, 0xc5, 0x7b, 0xc6, 0x9b, 0x9f, 0x8e, 0xc6, 0x27, 0x20, 0x56, 0xaf,
+	0x63, 0x1f, 0x98, 0xf8, 0xe8, 0xea, 0xc2, 0x97, 0x0d, 0x9e, 0xeb, 0xfb, 0xa4, 0x63, 0x59, 0x3d,
+	0x43, 0xcb, 0xf5, 0x27, 0x97, 0x8d, 0x8e, 0xcc, 0x7d, 0xa3, 0xa7, 0x73, 0x5b, 0xb9, 0x84, 0xee,
+	0xc0, 0xe6, 0x65, 0x7d, 0xa7, 0xdf, 0xc5, 0xa6, 0xd1, 0x95, 0xcb, 0x68, 0x13, 0xd6, 0x2e, 0x2b,
+	0x0d, 0x73, 0x20, 0x2f, 0x9d, 0xdc, 0x12, 0xbf, 0x52, 0x3f, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x1b, 0x9f, 0x88, 0x50, 0xb4, 0x16, 0x00, 0x00,
 }
diff --git a/feeds/feeds.proto b/feeds/feeds.proto
index 55e946e..d714f46 100644
--- a/feeds/feeds.proto
+++ b/feeds/feeds.proto
@@ -117,14 +117,16 @@
 //   availability {start_sec: 9am, duration: 180 minutes, ...}
 //
 message Availability {
-  // An opaque string from an aggregator to identify a merchant.
+  // An opaque string from an aggregator to identify a merchant. (required)
   string merchant_id = 1;
   // An opaque string from aggregator to identify a service of the
-  // merchant.
+  // merchant. (required)
   string service_id = 2;
-  // Start time of this availability, using epoch time in seconds.
+  // Start time of this availability, using epoch time in seconds in UTC.
+  //(required)
   int64 start_sec = 3;
   // Duration of the service in seconds, e.g. 30 minutes for a chair massage.
+  // (required)
   int64 duration_sec = 4;
   // Number of total spots and open spots of this availability.
   // E.g. a Yoga class of 10 spots with 3 booked.
@@ -136,10 +138,12 @@
   //       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)
   int64 spots_total = 5;
   int64 spots_open = 6;
   // An optional opaque string to identify this availability slot. If set, it
   // will be included in the requests that book/update/cancel appointments.
+  // (optional)
   string availability_tag = 7;
 
   // Optional resources used to disambiguate this availability slot from
@@ -151,9 +155,10 @@
   //                 spots_total: 10 spots_open: 7 }
   //  availability { resources { staff_id: "2" staff_name: "John" }
   //                 spots_total: 5 spots_open: 2 }
+  // (optional)
   Resources resources = 8;
 
-  // A list of ids referencing the payment options which can be used to pay
+  // 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.
   //
@@ -161,6 +166,10 @@
   // 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)
   repeated string payment_option_id = 9;
 
   // Recurrence messages are optional, but allow for a more compact
@@ -179,30 +188,91 @@
   //      merchants/services with regularly scheduled classes.
   message Recurrence {
     // The inclusive maximum UTC timestamp the availability repeats until.
+    // (required)
     int64 repeat_until_sec = 1;
     // Defines the time between successive availability slots.
     //
-    // E.g. An availability with a duration of 20 min, a repeat_every_sec of
+    // 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.
+    // 11-11:20am. (required)
     int32 repeat_every_sec = 2;
   }
   // The recurrence information for the availability, representing more than one
   // start time. A recurrence should contain appointments for one working day.
+  // (optional)
   Recurrence recurrence = 10;
 
-  // ScheduleException messages are used to represent booked/unavailable time
-  // ranges within the work day. As time slots are booked, the list of
-  // exceptions should grow to reflect the newly unavailable time ranges.
-  // The recurrence itself shouldn't be modified.
+  // 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.
   message ScheduleException {
-    // The time range of the exception.
+    // 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 time_range = 1;
   }
-  // When this service cannot be scheduled. To limit the number of
-  // schedule_exception messages consider joining adjacent exceptions.
+  // Times when this service cannot be scheduled. To limit the number of
+  // schedule_exception messages, consider joining adjacent exceptions.
+  // (optional)
   repeated ScheduleException schedule_exception = 11;
+
+  // 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 = 12;
+
+  // 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 no_show_fee = 13;
+
+  // 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 require_credit_card = 14;
+
+  // 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)
+  repeated string ticket_type_id = 15;
 }
 
 // A resource is used to disambiguate availability slots from one another when
diff --git a/utils/utils.go b/utils/utils.go
index 6e4d65d..c95e198 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -77,30 +77,57 @@
 }
 
 func buildLineItem(availability *fpb.Availability, tickets []*fpb.TicketType) *mpb.LineItem {
+	// If no ticket types return nil as there is nothing to build.
+	if len(tickets) == 0 {
+		return nil
+	}
+
+	// Treated as a set.
+	ticketMap := make(map[string]*fpb.TicketType)
+	for _, ticketType := range tickets {
+		if _, ok := ticketMap[ticketType.GetTicketTypeId()]; !ok {
+			// Ticket type ids should be unique to a merchant service pair.
+			// If they're not unique they will get dropped silently here.
+			// We enforce minimal feed validation in the test client so it's
+			// up to you to ensure UIDs.
+			ticketMap[ticketType.GetTicketTypeId()] = ticketType
+		}
+	}
+
+	filteredTickets := tickets
+	if len(availability.GetTicketTypeId()) != 0 {
+		// Clear slice but preserve allocated memory.
+		filteredTickets = filteredTickets[:0]
+		for _, ticketTypeID := range availability.GetTicketTypeId() {
+			if ticketType, ok := ticketMap[ticketTypeID]; ok {
+				filteredTickets = append(filteredTickets, ticketType)
+			}
+		}
+	}
+
+	// If no ticket types return nil as there is nothing to build.
+	if len(filteredTickets) == 0 {
+		return nil
+	}
+
 	lineItem := &mpb.LineItem{
 		ServiceId:   availability.GetServiceId(),
 		StartSec:    availability.GetStartSec(),
 		DurationSec: availability.GetDurationSec(),
 		Price:       &mpb.Price{},
 	}
-
-	// If not ticket types return nil as there is nothing to build.
-	if len(tickets) == 0 {
-		return nil
-	}
-
 	for i := 0; i < int(availability.GetSpotsOpen()); i++ {
 		// This is deterministic which is fine given that we just want to get a mix of ticket types.
-		ticketTypeIndex := rand.Intn(len(tickets))
+		ticketTypeIndex := rand.Intn(len(filteredTickets))
 		// Calculate price of line item.
-		if lineItem.GetPrice().GetCurrencyCode() == "" && tickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" {
-			lineItem.Price.CurrencyCode = tickets[ticketTypeIndex].GetPrice().GetCurrencyCode()
+		if lineItem.GetPrice().GetCurrencyCode() == "" && filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" {
+			lineItem.Price.CurrencyCode = filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode()
 		}
-		lineItem.Price.PriceMicros += tickets[ticketTypeIndex].GetPrice().GetPriceMicros()
+		lineItem.Price.PriceMicros += filteredTickets[ticketTypeIndex].GetPrice().GetPriceMicros()
 
 		// Add ticket to line item.
 		lineItem.Tickets = append(lineItem.Tickets, &mpb.LineItem_OrderedTickets{
-			TicketId: tickets[ticketTypeIndex].GetTicketTypeId(),
+			TicketId: filteredTickets[ticketTypeIndex].GetTicketTypeId(),
 			Count:    1,
 		})
 	}