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

package cq

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
)

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

// This message describes a Commit Queue configuration.
//
// The config file commit-queue.cfg should be stored in the config directory of your
// project, alongside cr-buildbucket.cfg.
type Config struct {
	// Optional. If present, the CQ will refrain from processing any CLs,
	// on which CQ was triggered after the specified time.
	//
	// This is an UTC RFC3339 (stiptime(tm)) string representing the time.
	// For example, "2017-12-23T15:47:58Z" and Z is required.
	DrainingStartTime string `protobuf:"bytes,1,opt,name=draining_start_time,json=drainingStartTime,proto3" json:"draining_start_time,omitempty"`
	// Optional and deprecated.
	// URL of the CQ status app to push updates to.
	CqStatusHost string `protobuf:"bytes,2,opt,name=cq_status_host,json=cqStatusHost,proto3" json:"cq_status_host,omitempty"`
	// Optional options for how CLs should be submitted.
	SubmitOptions *SubmitOptions `protobuf:"bytes,3,opt,name=submit_options,json=submitOptions,proto3" json:"submit_options,omitempty"`
	// At least 1 ConfigGroup is required.
	ConfigGroups         []*ConfigGroup `protobuf:"bytes,4,rep,name=config_groups,json=configGroups,proto3" json:"config_groups,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetDrainingStartTime() string {
	if m != nil {
		return m.DrainingStartTime
	}
	return ""
}

func (m *Config) GetCqStatusHost() string {
	if m != nil {
		return m.CqStatusHost
	}
	return ""
}

func (m *Config) GetSubmitOptions() *SubmitOptions {
	if m != nil {
		return m.SubmitOptions
	}
	return nil
}

func (m *Config) GetConfigGroups() []*ConfigGroup {
	if m != nil {
		return m.ConfigGroups
	}
	return nil
}

// SubmitOptions control how CQ submits CLs.
type SubmitOptions struct {
	// Optional. Maximum number of successful CQ attempts completed by submitting
	// corresponding Gerrit CL(s) before waiting burst_delay.
	//
	// This feature today applies to all attempts processed by this CQ, across all
	// config_groups.
	//
	// Must be >0 to take effect. Requires burst_delay to be set, too.
	MaxBurst int32 `protobuf:"varint,1,opt,name=max_burst,json=maxBurst,proto3" json:"max_burst,omitempty"`
	// Optional. Delay between bursts of submissions of CQ attempts.
	// See max_burst for more info.
	//
	// Must be >0 to take effect. Requires max_burst to be set, too.
	BurstDelay           *duration.Duration `protobuf:"bytes,2,opt,name=burst_delay,json=burstDelay,proto3" json:"burst_delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_SubmitOptions proto.InternalMessageInfo

func (m *SubmitOptions) GetMaxBurst() int32 {
	if m != nil {
		return m.MaxBurst
	}
	return 0
}

func (m *SubmitOptions) GetBurstDelay() *duration.Duration {
	if m != nil {
		return m.BurstDelay
	}
	return nil
}

// ConfigGroup allows one to share single verifiers config across a set of
// Gerrit repositories, which may be in different Gerrit installations.
type ConfigGroup struct {
	// At least 1 Gerrit instance with repositories to work with is required.
	Gerrit []*ConfigGroup_Gerrit `protobuf:"bytes,1,rep,name=gerrit,proto3" json:"gerrit,omitempty"`
	// Defines how to verify a CL before submitting it. Required.
	Verifiers            *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup proto.InternalMessageInfo

func (m *ConfigGroup) GetGerrit() []*ConfigGroup_Gerrit {
	if m != nil {
		return m.Gerrit
	}
	return nil
}

func (m *ConfigGroup) GetVerifiers() *Verifiers {
	if m != nil {
		return m.Verifiers
	}
	return nil
}

// Enumerates repositories on a Gerrit instance for which CQ should work.
type ConfigGroup_Gerrit struct {
	// Gerrit URL, e.g., https://chromium-review.googlesource.com.
	// No trailing slashes allowed.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Gerrit projects of this Gerrit instance to work with.
	//
	// At least 1 required.
	Projects             []*ConfigGroup_Gerrit_Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup_Gerrit proto.InternalMessageInfo

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

func (m *ConfigGroup_Gerrit) GetProjects() []*ConfigGroup_Gerrit_Project {
	if m != nil {
		return m.Projects
	}
	return nil
}

type ConfigGroup_Gerrit_Project struct {
	// Repository name inside Gerrit host. Required.
	//
	// No leading or trailing slashes allowed, no '.git' at the end.
	// 'a/' prefix is also not allowed (it's used on *.googlesource.com for
	// forcing authentication).
	//
	// Examples on https://chromium-review.googlesource.com:
	//   catapult
	//   chromium/src
	//   chromium/tools/depot_tools
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Limit CLs in this repo to only these refs. Required.
	//
	// If not specified, defaults to "refs/heads/master".
	//
	// NOTE: your Gerrit admin must configure Gerrit ACLs such that CQ has
	// read access to these refs, otherwise your users will be waiting for CQ
	// to act on their CLs forever.
	//
	// Regular expression is validated by https://github.com/google/re2 library.
	//
	// NOTE: Git globs aren't supported. Convert them to a regular expression,
	// e.g., Git glob "refs/heads/*" should be "refs/heads/[^/]+".
	// However, users typically expect "refs/heads/.+", since expectation is
	// that every typical Git branch to be CQ-able, including
	// "refs/heads/experimental/foobar".
	RefRegexp            []string `protobuf:"bytes,2,rep,name=ref_regexp,json=refRegexp,proto3" json:"ref_regexp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup_Gerrit_Project proto.InternalMessageInfo

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

func (m *ConfigGroup_Gerrit_Project) GetRefRegexp() []string {
	if m != nil {
		return m.RefRegexp
	}
	return nil
}

// Verifiers are various types of checks that a Commit Queue performs on a CL.
// All verifiers must pass in order for a CL to be submitted. Configuration file
// describes types of verifiers that should be applied to each CL and their
// parameters.
type Verifiers struct {
	// Required. GerritCQAbility ensures that a user who triggered
	// this CQ attempt actually has rights to do so based on 3 factors:
	//  * membership of the user in committers & dryrunners group,
	//  * the state of CL/patchset on which CQ is triggered,
	//  * relationship of the user to the CL.
	GerritCqAbility *Verifiers_GerritCQAbility `protobuf:"bytes,1,opt,name=gerrit_cq_ability,json=gerritCqAbility,proto3" json:"gerrit_cq_ability,omitempty"`
	// This verifier is used to check tree status before committing a CL. If the
	// tree is closed, then the verifier will wait until it is reopened.
	TreeStatus *Verifiers_TreeStatus `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus,proto3" json:"tree_status,omitempty"`
	// This verifier triggers a set of builds through Buildbucket.
	//
	// CQ automatically retries failed tryjobs and only allows CL to land if each
	// builder has succeeded in the latest retry.
	// If a given tryjob result is too old (>1 day) it is ignored.
	//
	// Typically, builds from Buildbucket are executed on LUCI stack, however, CQ
	// is agnostic to how and where builds are executed.
	Tryjob *Verifiers_Tryjob `protobuf:"bytes,3,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
	// Deprecator is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Deprecator *Verifiers_Deprecator `protobuf:"bytes,4,opt,name=deprecator,proto3" json:"deprecator,omitempty"`
	// Fake is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Fake                 *Verifiers_Fake `protobuf:"bytes,5,opt,name=fake,proto3" json:"fake,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers proto.InternalMessageInfo

func (m *Verifiers) GetGerritCqAbility() *Verifiers_GerritCQAbility {
	if m != nil {
		return m.GerritCqAbility
	}
	return nil
}

func (m *Verifiers) GetTreeStatus() *Verifiers_TreeStatus {
	if m != nil {
		return m.TreeStatus
	}
	return nil
}

func (m *Verifiers) GetTryjob() *Verifiers_Tryjob {
	if m != nil {
		return m.Tryjob
	}
	return nil
}

func (m *Verifiers) GetDeprecator() *Verifiers_Deprecator {
	if m != nil {
		return m.Deprecator
	}
	return nil
}

func (m *Verifiers) GetFake() *Verifiers_Fake {
	if m != nil {
		return m.Fake
	}
	return nil
}

type Verifiers_GerritCQAbility struct {
	// Required. Name of the chrome-infra-auth group, which contains the list of
	// identities authorized to trigger CQ runs on any CLs in projects specified
	// in the config group.
	//
	// Typically, such groups are named "project-<name>-committers".
	CommitterList string `protobuf:"bytes,1,opt,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
	// Optional, but strongly recommended. Name of the chrome-infra-auth group,
	// which contains the list of identities authorized to trigger CQ dry run
	// on Gerrit CLs they own (not to be confused with OWNER files) even if CL
	// hasn't been approved.
	//
	// Typically, such groups are named "project-<name>-tryjob-access".
	DryRunAccessList string `protobuf:"bytes,2,opt,name=dry_run_access_list,json=dryRunAccessList,proto3" json:"dry_run_access_list,omitempty"`
	// Optional. allow_submit_with_open_deps controls how CQ full run behaves
	// when current Gerrit CL has open dependencies (not yet submitted CLs on
	// which *this* CL depends).
	//
	// If set to false (default), CQ will abort full run attempt immediately if
	// open dependencies are detected.
	//
	// If set to true, then CQ will not abort full run and upon passing all
	// other verifiers, CQ will attempt to submit the CL regardless of open
	// dependencies and whether CQ verified those open dependencies.
	// In turn, if Gerrit project config allows this, Gerrit will execute submit
	// of all dependent CLs first and then this CL.
	AllowSubmitWithOpenDeps bool     `protobuf:"varint,3,opt,name=allow_submit_with_open_deps,json=allowSubmitWithOpenDeps,proto3" json:"allow_submit_with_open_deps,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_GerritCQAbility proto.InternalMessageInfo

func (m *Verifiers_GerritCQAbility) GetCommitterList() string {
	if m != nil {
		return m.CommitterList
	}
	return ""
}

func (m *Verifiers_GerritCQAbility) GetDryRunAccessList() string {
	if m != nil {
		return m.DryRunAccessList
	}
	return ""
}

func (m *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
	if m != nil {
		return m.AllowSubmitWithOpenDeps
	}
	return false
}

type Verifiers_TreeStatus struct {
	// Required. URL of the project tree status app.
	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_TreeStatus proto.InternalMessageInfo

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

type Verifiers_Tryjob struct {
	// Builders on which tryjobs should be triggered.
	Builders []*Verifiers_Tryjob_Builder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
	// Optional, defaulting to no retries whatsoever.
	RetryConfig          *Verifiers_Tryjob_RetryConfig `protobuf:"bytes,2,opt,name=retry_config,json=retryConfig,proto3" json:"retry_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob proto.InternalMessageInfo

func (m *Verifiers_Tryjob) GetBuilders() []*Verifiers_Tryjob_Builder {
	if m != nil {
		return m.Builders
	}
	return nil
}

func (m *Verifiers_Tryjob) GetRetryConfig() *Verifiers_Tryjob_RetryConfig {
	if m != nil {
		return m.RetryConfig
	}
	return nil
}

type Verifiers_Tryjob_Builder struct {
	// Required. Name of the builder as <project>/<bucket>/<builder>
	//
	// Examples:
	//   "chromium/try/linux-tester"
	//   "other-project/try/shared-try-builder"
	//
	// For legacy buckets on buildbot, use * as project placeholder, e.g.,
	//   "*/master.tryserver.example/linux-tester"
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. If true, a fresh build will be required for each CQ attempt.
	//
	// Default is false, meaning CQ may re-use a successful build
	// triggered before current CQ attempt started.
	//
	// This option is typically used for builders which run depot_tools'
	// PRESUBMIT scripts, which are supposed to be quick to run and provide
	// additional OWNERS, lint, etc checks which are useful to run against
	// the latest revision of the CL's target branch.
	DisableReuse bool `protobuf:"varint,2,opt,name=disable_reuse,json=disableReuse,proto3" json:"disable_reuse,omitempty"`
	// Optional name of a builder (aka parent) which will trigger this builder
	// (aka child).
	//
	// If `triggered_by` is not specified (default), CQ will trigger this
	// builder directly.
	//
	// Else, CQ will wait for `triggered_by` (parent) builder to trigger
	// (possibly, indirectly) this (child) builder.
	// Conditions:
	//   * `triggered_by` (parent) builder must set a special property
	//     `triggered_build_ids` upon successful completion with value set
	//     to a list of triggered Buildbucket build IDs,
	//     corresponding to each triggered build. One or more of the IDs must
	//     correspond to this (child) builder, which will then be waited for
	//     by CQ.
	//   * parent->child relationship graph must be a forest (set of a trees).
	//     However, grandparent->parent->child triggering structure isn't well
	//     tested. Please, talk to CQ maintainers to discuss your use case if you
	//     actually need it.
	//
	// Failure/Retry semantics:
	//   * If `triggered_by` (parent) builder succeeds, but doesn't set
	//     the right `triggered_build_ids` s.t. CQ can't find this (child)
	//     builder among triggered builds, then CQ will wait till
	//     TRYJOB_PENDING_TIMEOUT is reached, currently hardcoded at 2 hours.
	//     TODO(tandrii,sergiyb): improve this.
	//   * If this (child) builder fails and CQ still has retry budget,
	//     CQ will retry a parent builder.
	//
	// For example, given config:
	//   builder { name:         "*/m/mac_compiler" }
	//   builder { name:         "*/m/mac_tester_10.12"
	//             triggered_by: "*/m/mac_compiler" }
	//   builder { name:         "*/m/mac_tester_10.13"
	//             triggered_by: "*/m/mac_compiler" }
	// CQ will trigger and wait for "mac_compiler" to succeed. Then, it'll
	// check its `triggered_build_ids` and find which ones correspond to
	// "mac_tester_10.12" and "mac_tester_10.13" and wait for each to
	// complete.  If say "mac_tester_10.12" fails, CQ will retry
	// "mac_compiler" and expect it to trigger new builds for
	// "mac_tester_10.12" and "mac_tester_10.13".
	TriggeredBy string `protobuf:"bytes,3,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"`
	// Optional. When this field is present, it marks given builder as
	// experimental. It is only triggered on a given percentage of the CLs and
	// the outcome does not affect the decicion whether a CL can land or not.
	// This is typically used to test new builders and estimate their capacity
	// requirements.
	ExperimentPercentage float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage,proto3" json:"experiment_percentage,omitempty"`
	// Optionally specified alternative builder for CQ to choose instead.
	// If provided, CQ will choose only one of the equivalent builders as
	// required based purely on given CL and CL's owner and **regardless** of
	// the possibly already completed try jobs.
	//
	// Note: none of the equivalent builders should be part of triggered_by
	// chain, although CQ may eventually relax this requirement.
	EquivalentTo *Verifiers_Tryjob_EquivalentBuilder `protobuf:"bytes,5,opt,name=equivalent_to,json=equivalentTo,proto3" json:"equivalent_to,omitempty"`
	// Optional. Require this builder only if location_regexp matches a file in
	// this CL.
	//
	// This means:
	//   * If specified and no file in a CL matches any of the location_regexp,
	//   then CQ will not care about this builder.
	//   * If a file in a CL matches any location_regexp_exclude, then this file
	//   won't be considered when matching location_regexp.
	//
	// If no location_regexp is not specified (default),
	// builder will be used on all CLs, even those which are not modifying any
	// file (just commit description changes).
	// TODO(tandrii): CQ shouldn't process such CLs https://crbug.com/892462,
	// which would allow to change default location_regexp to '.*', ie matching
	// any file in any Gerrit project.
	//
	// The location_regexp is matches are done against the following string:
	//   <gerrit_url>/<gerrit_project_name>/+/<cl_file_path>
	// File path must be relative to root of the repo, and it uses Unix /
	// directory separators.
	//
	// The comparison is a full match; the pattern is implicitly anchored with
	// "^" and "$", so there is no need add them.
	//
	// Touching a file means either adding, modifying or removing it.
	//
	// These options currently can not be combined with the following other options:
	//   * experiment_percentage
	//   * triggered_by
	//   * GerritCQAbility.allow_submit_with_open_deps
	// If you need to combine them, please talk to CQ owners.
	//
	// Examples:
	//
	//   location_regexp:
	//   "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/WebKit/.+"
	//     will enable builder for all CLs touching any file in
	//     third_party/WebKit directory of the chromium/src repo, but not
	//     directory itself.
	//
	//   location_regexp:         "https://example.com/repo/[+]/.+"
	//   location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
	//     will match a CL which touches at least one file other than
	//     'one.txt' inside all/ directory of the Gerrit project "repo".
	//
	//   location_regexp_exclude: "https://example.com/.+/[+]/one.txt"
	//     will match a CL which touches at least one file other than
	//     'one.txt' in any repository OR belongs to any other Gerrit server.
	//     Note, in this case location_regexp defaults to ".*".
	LocationRegexp        []string `protobuf:"bytes,6,rep,name=location_regexp,json=locationRegexp,proto3" json:"location_regexp,omitempty"`
	LocationRegexpExclude []string `protobuf:"bytes,7,rep,name=location_regexp_exclude,json=locationRegexpExclude,proto3" json:"location_regexp_exclude,omitempty"`
	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
	XXX_unrecognized      []byte   `json:"-"`
	XXX_sizecache         int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob_Builder proto.InternalMessageInfo

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

func (m *Verifiers_Tryjob_Builder) GetDisableReuse() bool {
	if m != nil {
		return m.DisableReuse
	}
	return false
}

func (m *Verifiers_Tryjob_Builder) GetTriggeredBy() string {
	if m != nil {
		return m.TriggeredBy
	}
	return ""
}

func (m *Verifiers_Tryjob_Builder) GetExperimentPercentage() float32 {
	if m != nil {
		return m.ExperimentPercentage
	}
	return 0
}

func (m *Verifiers_Tryjob_Builder) GetEquivalentTo() *Verifiers_Tryjob_EquivalentBuilder {
	if m != nil {
		return m.EquivalentTo
	}
	return nil
}

func (m *Verifiers_Tryjob_Builder) GetLocationRegexp() []string {
	if m != nil {
		return m.LocationRegexp
	}
	return nil
}

func (m *Verifiers_Tryjob_Builder) GetLocationRegexpExclude() []string {
	if m != nil {
		return m.LocationRegexpExclude
	}
	return nil
}

type Verifiers_Tryjob_EquivalentBuilder struct {
	// Required. Name of this builder.
	// Format is the same in the same format as Builder.name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Percentage expressing probability of CQ triggering this builder instead
	// of the builder to which this builder is equilvanet to.
	//
	// A choice itself is made deterministicly based on CL alone, hereby
	// all CQ attempts on all patchsets of a given CL will trigger the same
	// builder, assuming CQ config doesn't change in the mean time.
	//
	// Note that if `owner_whitelist_group` is also specified, the choice over
	// which of the two builders to trigger will be made only for CLs owned by
	// whitelisted group.
	//
	// If not specified, defaults to 0, meaning this builder is never
	// triggered by CQ, but an existing build of can be re-used by CQ.
	//
	// To illustrate, suppose percentage=10. Then,
	//   Without owner_whitelist_group,
	//      ~10% of all CQ attempts will trigger this builder.
	//   With owner_whitelist_group set and, suppose, 1/5 of CQ attempts are
	//      ran on CLs owned by this group, then only ~(1/10)*(1/5) or
	//      ~2% of all CQ attempts will trigger this builder.
	Percentage float32 `protobuf:"fixed32,2,opt,name=percentage,proto3" json:"percentage,omitempty"`
	// If specified, limits the builder to CL owners in this group.
	OwnerWhitelistGroup  string   `protobuf:"bytes,3,opt,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder proto.InternalMessageInfo

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

func (m *Verifiers_Tryjob_EquivalentBuilder) GetPercentage() float32 {
	if m != nil {
		return m.Percentage
	}
	return 0
}

func (m *Verifiers_Tryjob_EquivalentBuilder) GetOwnerWhitelistGroup() string {
	if m != nil {
		return m.OwnerWhitelistGroup
	}
	return ""
}

// Collection of parameters for deciding whether to retry a single build.
// If parameter is not specified, its value defaults to 0 (per proto3).
// Thus, omitting all parameters means no retries of any kind.
type Verifiers_Tryjob_RetryConfig struct {
	// Retry quota for a single tryjob.
	SingleQuota int32 `protobuf:"varint,1,opt,name=single_quota,json=singleQuota,proto3" json:"single_quota,omitempty"`
	// Retry quota for all tryjobs in a CL.
	GlobalQuota int32 `protobuf:"varint,2,opt,name=global_quota,json=globalQuota,proto3" json:"global_quota,omitempty"`
	// The weight assigned to each tryjob failure.
	FailureWeight int32 `protobuf:"varint,3,opt,name=failure_weight,json=failureWeight,proto3" json:"failure_weight,omitempty"`
	// The weight assigned to each transient failure.
	TransientFailureWeight int32 `protobuf:"varint,4,opt,name=transient_failure_weight,json=transientFailureWeight,proto3" json:"transient_failure_weight,omitempty"`
	// The weight assigned to tryjob timeouts.
	TimeoutWeight        int32    `protobuf:"varint,5,opt,name=timeout_weight,json=timeoutWeight,proto3" json:"timeout_weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob_RetryConfig proto.InternalMessageInfo

func (m *Verifiers_Tryjob_RetryConfig) GetSingleQuota() int32 {
	if m != nil {
		return m.SingleQuota
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetGlobalQuota() int32 {
	if m != nil {
		return m.GlobalQuota
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetFailureWeight() int32 {
	if m != nil {
		return m.FailureWeight
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetTransientFailureWeight() int32 {
	if m != nil {
		return m.TransientFailureWeight
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetTimeoutWeight() int32 {
	if m != nil {
		return m.TimeoutWeight
	}
	return 0
}

// Deprecator is for internal use in CQ.
type Verifiers_Deprecator struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Deprecator proto.InternalMessageInfo

// Fake is for internal use in CQ.
type Verifiers_Fake struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	EventualState        string   `protobuf:"bytes,2,opt,name=eventual_state,json=eventualState,proto3" json:"eventual_state,omitempty"`
	Delay                int32    `protobuf:"varint,3,opt,name=delay,proto3" json:"delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Fake proto.InternalMessageInfo

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

func (m *Verifiers_Fake) GetEventualState() string {
	if m != nil {
		return m.EventualState
	}
	return ""
}

func (m *Verifiers_Fake) GetDelay() int32 {
	if m != nil {
		return m.Delay
	}
	return 0
}

func init() {
	proto.RegisterType((*Config)(nil), "cq.config.Config")
	proto.RegisterType((*SubmitOptions)(nil), "cq.config.SubmitOptions")
	proto.RegisterType((*ConfigGroup)(nil), "cq.config.ConfigGroup")
	proto.RegisterType((*ConfigGroup_Gerrit)(nil), "cq.config.ConfigGroup.Gerrit")
	proto.RegisterType((*ConfigGroup_Gerrit_Project)(nil), "cq.config.ConfigGroup.Gerrit.Project")
	proto.RegisterType((*Verifiers)(nil), "cq.config.Verifiers")
	proto.RegisterType((*Verifiers_GerritCQAbility)(nil), "cq.config.Verifiers.GerritCQAbility")
	proto.RegisterType((*Verifiers_TreeStatus)(nil), "cq.config.Verifiers.TreeStatus")
	proto.RegisterType((*Verifiers_Tryjob)(nil), "cq.config.Verifiers.Tryjob")
	proto.RegisterType((*Verifiers_Tryjob_Builder)(nil), "cq.config.Verifiers.Tryjob.Builder")
	proto.RegisterType((*Verifiers_Tryjob_EquivalentBuilder)(nil), "cq.config.Verifiers.Tryjob.EquivalentBuilder")
	proto.RegisterType((*Verifiers_Tryjob_RetryConfig)(nil), "cq.config.Verifiers.Tryjob.RetryConfig")
	proto.RegisterType((*Verifiers_Deprecator)(nil), "cq.config.Verifiers.Deprecator")
	proto.RegisterType((*Verifiers_Fake)(nil), "cq.config.Verifiers.Fake")
}

func init() { proto.RegisterFile("cq.proto", fileDescriptor_dfc3c1383080898a) }

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