// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/dm/api/service/v1/ensure_graph_data.proto

package dm

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	templateproto "go.chromium.org/luci/common/data/text/templateproto"
	math "math"
)

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

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

type TemplateInstantiation struct {
	// project is the luci-config project which defines the template.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// ref is the git ref of the project that defined this template. If omitted,
	// this will use the template definition from the project-wide configuration
	// and not the configuration located on a particular ref (like
	// 'refs/heads/master').
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// specifier specifies the actual template name, as well as any substitution
	// parameters which that template might require.
	Specifier            *templateproto.Specifier `protobuf:"bytes,4,opt,name=specifier,proto3" json:"specifier,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_TemplateInstantiation proto.InternalMessageInfo

func (m *TemplateInstantiation) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *TemplateInstantiation) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *TemplateInstantiation) GetSpecifier() *templateproto.Specifier {
	if m != nil {
		return m.Specifier
	}
	return nil
}

// EnsureGraphDataReq allows you to assert the existence of Attempts in DM's
// graph, and allows you to declare dependencies from one Attempt to another.
//
// You can declare Attempts by any combination of:
//   * Providing a quest description plus a list of Attempt numbers for that
//     quest.
//   * Providing a template instantiation (for a project-declared quest
//     template) plus a list of Attempt numbers for that quest.
//   * Providing a raw set of quest_id -> attempt numbers for quests that you
//     already know that DM has a definition for.
//
// In response, DM will tell you what the IDs of all supplied Quests/Attempts
// are.
//
// To create a dependencies, call this method while running as part of an
// execution by filling the for_execution field. All attempts named as described
// above will become dependencies for the indicated execution. It is only
// possible for a currently-running execution to create dependencies for its own
// Attempt. In particular, it is not possible to create dependencies as
// a non-execution user (e.g. a human), nor is it possible for an execution to
// create attempts on behalf of some other execution.
//
// If the attempts were being created as dependencies, and were already in the
// Finished state, this request can also opt to include the AttemptResults
// directly.
type EnsureGraphDataReq struct {
	// Quest is a list of quest descriptors. DM will ensure that the
	// corresponding Quests exist. If they don't, they'll be created.
	Quest []*Quest_Desc `protobuf:"bytes,1,rep,name=quest,proto3" json:"quest,omitempty"`
	// QuestAttempt allows the addition of attempts which are derived from
	// the quest bodies provided above.
	// Each entry here maps 1:1 with the equivalent quest.
	QuestAttempt []*AttemptList_Nums `protobuf:"bytes,2,rep,name=quest_attempt,json=questAttempt,proto3" json:"quest_attempt,omitempty"`
	// TemplateQuest allows the addition of quests which are derived from
	// Templates, as defined on a per-project basis.
	TemplateQuest []*TemplateInstantiation `protobuf:"bytes,3,rep,name=template_quest,json=templateQuest,proto3" json:"template_quest,omitempty"`
	// TemplateAttempt allows the addition of attempts which are derived from
	// Templates. This must be equal in length to template_quest.
	// Each entry here maps 1:1 with the equivalent quest in template_quest.
	TemplateAttempt []*AttemptList_Nums `protobuf:"bytes,4,rep,name=template_attempt,json=templateAttempt,proto3" json:"template_attempt,omitempty"`
	// RawAttempts is a list that asserts that the following attempts should
	// exist. The quest ids in this list must be already-known to DM, NOT
	// included in the quest field above. This is useful when you know the ID of
	// the Quest, but not the actual definition of the quest.
	RawAttempts *AttemptList `protobuf:"bytes,5,opt,name=raw_attempts,json=rawAttempts,proto3" json:"raw_attempts,omitempty"`
	// ForExecution is an authentication pair (Execution_ID, Token).
	//
	// If this is provided then it will serve as authorization for the creation of
	// any `quests` included, and any `attempts` indicated will be set as
	// dependencies for the execution.
	//
	// If this omitted, then the request requires some user/bot authentication,
	// and any quests/attempts provided will be made standalone (e.g. nothing will
	// depend on them).
	ForExecution         *Execution_Auth             `protobuf:"bytes,6,opt,name=for_execution,json=forExecution,proto3" json:"for_execution,omitempty"`
	Limit                *EnsureGraphDataReq_Limit   `protobuf:"bytes,7,opt,name=limit,proto3" json:"limit,omitempty"`
	Include              *EnsureGraphDataReq_Include `protobuf:"bytes,8,opt,name=include,proto3" json:"include,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_EnsureGraphDataReq proto.InternalMessageInfo

func (m *EnsureGraphDataReq) GetQuest() []*Quest_Desc {
	if m != nil {
		return m.Quest
	}
	return nil
}

func (m *EnsureGraphDataReq) GetQuestAttempt() []*AttemptList_Nums {
	if m != nil {
		return m.QuestAttempt
	}
	return nil
}

func (m *EnsureGraphDataReq) GetTemplateQuest() []*TemplateInstantiation {
	if m != nil {
		return m.TemplateQuest
	}
	return nil
}

func (m *EnsureGraphDataReq) GetTemplateAttempt() []*AttemptList_Nums {
	if m != nil {
		return m.TemplateAttempt
	}
	return nil
}

func (m *EnsureGraphDataReq) GetRawAttempts() *AttemptList {
	if m != nil {
		return m.RawAttempts
	}
	return nil
}

func (m *EnsureGraphDataReq) GetForExecution() *Execution_Auth {
	if m != nil {
		return m.ForExecution
	}
	return nil
}

func (m *EnsureGraphDataReq) GetLimit() *EnsureGraphDataReq_Limit {
	if m != nil {
		return m.Limit
	}
	return nil
}

func (m *EnsureGraphDataReq) GetInclude() *EnsureGraphDataReq_Include {
	if m != nil {
		return m.Include
	}
	return nil
}

type EnsureGraphDataReq_Limit struct {
	// MaxDataSize sets the maximum amount of 'Data' (in bytes) that can be
	// returned, if include.attempt_result is set. If this limit is hit, then
	// the appropriate 'partial' value will be set for that object, but the base
	// object would still be included in the result.
	//
	// If this limit is 0, a default limit of 16MB will be used. If this limit
	// exceeds 30MB, it will be reduced to 30MB.
	MaxDataSize          uint32   `protobuf:"varint,3,opt,name=max_data_size,json=maxDataSize,proto3" json:"max_data_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnsureGraphDataReq_Limit proto.InternalMessageInfo

func (m *EnsureGraphDataReq_Limit) GetMaxDataSize() uint32 {
	if m != nil {
		return m.MaxDataSize
	}
	return 0
}

type EnsureGraphDataReq_Include struct {
	Attempt              *EnsureGraphDataReq_Include_Options `protobuf:"bytes,4,opt,name=attempt,proto3" json:"attempt,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

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

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

var xxx_messageInfo_EnsureGraphDataReq_Include proto.InternalMessageInfo

func (m *EnsureGraphDataReq_Include) GetAttempt() *EnsureGraphDataReq_Include_Options {
	if m != nil {
		return m.Attempt
	}
	return nil
}

type EnsureGraphDataReq_Include_Options struct {
	// Instructs finished objects to include the Result field.
	Result               bool     `protobuf:"varint,3,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnsureGraphDataReq_Include_Options proto.InternalMessageInfo

func (m *EnsureGraphDataReq_Include_Options) GetResult() bool {
	if m != nil {
		return m.Result
	}
	return false
}

type EnsureGraphDataRsp struct {
	// accepted is true when all new graph data was journaled successfully. This
	// means that `quests`, `attempts`, `template_quest`, `template_attempt` were
	// all well-formed and are scheduled to be added. They will 'eventually' be
	// readable via other APIs (like WalkGraph), but when they are, they'll have
	// the IDs reflected in this response.
	//
	// If `attempts` referrs to quests that don't exist and weren't provided in
	// `quests`, those quests will be listed in `result` with the DNE flag set.
	//
	// If `template_quest` had errors (missing template, bad params, etc.), the
	// errors will be located in `template_error`. If all of the templates parsed
	// successfully, the quest ids for those rendered `template_quest` will be in
	// `template_ids`.
	Accepted bool `protobuf:"varint,1,opt,name=accepted,proto3" json:"accepted,omitempty"`
	// quest_ids will be populated with the Quest.IDs of any quests defined
	// by quest in the initial request. Its length is guaranteed to match
	// the length of quest, if there were no errors.
	QuestIds []*Quest_ID `protobuf:"bytes,2,rep,name=quest_ids,json=questIds,proto3" json:"quest_ids,omitempty"`
	// template_ids will be populated with the Quest.IDs of any templates defined
	// by template_quest in the initial request. Its length is guaranteed to match
	// the length of template_quest, if there were no errors.
	TemplateIds []*Quest_ID `protobuf:"bytes,3,rep,name=template_ids,json=templateIds,proto3" json:"template_ids,omitempty"`
	// template_error is either empty if there were no template errors, or the
	// length of template_quest. Non-empty strings are errors.
	TemplateError []string `protobuf:"bytes,4,rep,name=template_error,json=templateError,proto3" json:"template_error,omitempty"`
	// result holds the graph data pertaining to the request, containing any
	// graph state that already existed at the time of the call. Any new data
	// that was added to the graph state (accepted==true) will appear with
	// `DNE==true`.
	//
	// Quest data will always be returned for any Quests which exist.
	//
	// If accepted==false, you can inspect this to determine why:
	//   * Quests (without data) mentioned by the `attempts` field that do not
	//     exist will have `DNE==true`.
	//
	// This also can be used to make adding dependencies a stateless
	// single-request action:
	//   * Attempts requested (assuming the corresponding Quest exists) will
	//     contain their current state. If Include.AttemptResult was true, the
	//     results will be populated (with the size limit mentioned in the request
	//     documentation).
	Result *GraphData `protobuf:"bytes,5,opt,name=result,proto3" json:"result,omitempty"`
	// (if `for_execution` was specified) ShouldHalt indicates that the request
	// was accepted by DM, and the execution should halt (DM will re-execute the
	// Attempt when it becomes unblocked). If this is true, then the execution's
	// auth Token is also revoked and will no longer work for futher API calls.
	//
	// If `for_execution` was provided in the request and this is false, it means
	// that the execution may continue executing.
	ShouldHalt           bool     `protobuf:"varint,6,opt,name=should_halt,json=shouldHalt,proto3" json:"should_halt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnsureGraphDataRsp proto.InternalMessageInfo

func (m *EnsureGraphDataRsp) GetAccepted() bool {
	if m != nil {
		return m.Accepted
	}
	return false
}

func (m *EnsureGraphDataRsp) GetQuestIds() []*Quest_ID {
	if m != nil {
		return m.QuestIds
	}
	return nil
}

func (m *EnsureGraphDataRsp) GetTemplateIds() []*Quest_ID {
	if m != nil {
		return m.TemplateIds
	}
	return nil
}

func (m *EnsureGraphDataRsp) GetTemplateError() []string {
	if m != nil {
		return m.TemplateError
	}
	return nil
}

func (m *EnsureGraphDataRsp) GetResult() *GraphData {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *EnsureGraphDataRsp) GetShouldHalt() bool {
	if m != nil {
		return m.ShouldHalt
	}
	return false
}

func init() {
	proto.RegisterType((*TemplateInstantiation)(nil), "dm.TemplateInstantiation")
	proto.RegisterType((*EnsureGraphDataReq)(nil), "dm.EnsureGraphDataReq")
	proto.RegisterType((*EnsureGraphDataReq_Limit)(nil), "dm.EnsureGraphDataReq.Limit")
	proto.RegisterType((*EnsureGraphDataReq_Include)(nil), "dm.EnsureGraphDataReq.Include")
	proto.RegisterType((*EnsureGraphDataReq_Include_Options)(nil), "dm.EnsureGraphDataReq.Include.Options")
	proto.RegisterType((*EnsureGraphDataRsp)(nil), "dm.EnsureGraphDataRsp")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/dm/api/service/v1/ensure_graph_data.proto", fileDescriptor_d2be8364c35d3177)
}

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