// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/logging/v2/log_entry.proto

package logging

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	any "github.com/golang/protobuf/ptypes/any"
	_struct "github.com/golang/protobuf/ptypes/struct"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	monitoredres "google.golang.org/genproto/googleapis/api/monitoredres"
	_type "google.golang.org/genproto/googleapis/logging/type"
	_ "google.golang.org/genproto/googleapis/rpc/status"
)

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

// An individual entry in a log.
//
//
type LogEntry struct {
	// Required. The resource name of the log to which this log entry belongs:
	//
	//     "projects/[PROJECT_ID]/logs/[LOG_ID]"
	//     "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]"
	//     "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]"
	//     "folders/[FOLDER_ID]/logs/[LOG_ID]"
	//
	// A project number may optionally be used in place of PROJECT_ID. The project
	// number is translated to its corresponding PROJECT_ID internally and the
	// `log_name` field will contain PROJECT_ID in queries and exports.
	//
	// `[LOG_ID]` must be URL-encoded within `log_name`. Example:
	// `"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity"`.
	// `[LOG_ID]` must be less than 512 characters long and can only include the
	// following characters: upper and lower case alphanumeric characters,
	// forward-slash, underscore, hyphen, and period.
	//
	// For backward compatibility, if `log_name` begins with a forward-slash, such
	// as `/projects/...`, then the log entry is ingested as usual but the
	// forward-slash is removed. Listing the log entry will not show the leading
	// slash and filtering for a log name with a leading slash will never return
	// any results.
	LogName string `protobuf:"bytes,12,opt,name=log_name,json=logName,proto3" json:"log_name,omitempty"`
	// Required. The monitored resource that produced this log entry.
	//
	// Example: a log entry that reports a database error would be associated with
	// the monitored resource designating the particular database that reported
	// the error.
	Resource *monitoredres.MonitoredResource `protobuf:"bytes,8,opt,name=resource,proto3" json:"resource,omitempty"`
	// Optional. The log entry payload, which can be one of multiple types.
	//
	// Types that are valid to be assigned to Payload:
	//	*LogEntry_ProtoPayload
	//	*LogEntry_TextPayload
	//	*LogEntry_JsonPayload
	Payload isLogEntry_Payload `protobuf_oneof:"payload"`
	// Optional. The time the event described by the log entry occurred.  This
	// time is used to compute the log entry's age and to enforce the logs
	// retention period. If this field is omitted in a new log entry, then Logging
	// assigns it the current time.  Timestamps have nanosecond accuracy, but
	// trailing zeros in the fractional seconds might be omitted when the
	// timestamp is displayed.
	//
	// Incoming log entries should have timestamps that are no more than the [logs
	// retention period](/logging/quotas) in the past, and no more than 24 hours
	// in the future. Log entries outside those time boundaries will not be
	// available when calling `entries.list`, but those log entries can still be
	// [exported with LogSinks](/logging/docs/api/tasks/exporting-logs).
	Timestamp *timestamp.Timestamp `protobuf:"bytes,9,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	// Output only. The time the log entry was received by Logging.
	ReceiveTimestamp *timestamp.Timestamp `protobuf:"bytes,24,opt,name=receive_timestamp,json=receiveTimestamp,proto3" json:"receive_timestamp,omitempty"`
	// Optional. The severity of the log entry. The default value is
	// `LogSeverity.DEFAULT`.
	Severity _type.LogSeverity `protobuf:"varint,10,opt,name=severity,proto3,enum=google.logging.type.LogSeverity" json:"severity,omitempty"`
	// Optional. A unique identifier for the log entry. If you provide a value,
	// then Logging considers other log entries in the same project, with the same
	// `timestamp`, and with the same `insert_id` to be duplicates which are
	// removed in a single query result. However, there are no guarantees of
	// de-duplication in the export of logs.
	//
	// If the `insert_id` is omitted when writing a log entry, the Logging API
	//  assigns its own unique identifier in this field.
	//
	// In queries, the `insert_id` is also used to order log entries that have
	// the same `log_name` and `timestamp` values.
	InsertId string `protobuf:"bytes,4,opt,name=insert_id,json=insertId,proto3" json:"insert_id,omitempty"`
	// Optional. Information about the HTTP request associated with this log
	// entry, if applicable.
	HttpRequest *_type.HttpRequest `protobuf:"bytes,7,opt,name=http_request,json=httpRequest,proto3" json:"http_request,omitempty"`
	// Optional. A set of user-defined (key, value) data that provides additional
	// information about the log entry.
	Labels map[string]string `protobuf:"bytes,11,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Deprecated. Output only. Additional metadata about the monitored resource.
	//
	// Only `k8s_container`, `k8s_pod`, and `k8s_node` MonitoredResources have
	// this field populated for GKE versions older than 1.12.6. For GKE versions
	// 1.12.6 and above, the `metadata` field has been deprecated. The Kubernetes
	// pod labels that used to be in `metadata.userLabels` will now be present in
	// the `labels` field with a key prefix of `k8s-pod/`. The Stackdriver system
	// labels that were present in the `metadata.systemLabels` field will no
	// longer be available in the LogEntry.
	Metadata *monitoredres.MonitoredResourceMetadata `protobuf:"bytes,25,opt,name=metadata,proto3" json:"metadata,omitempty"` // Deprecated: Do not use.
	// Optional. Information about an operation associated with the log entry, if
	// applicable.
	Operation *LogEntryOperation `protobuf:"bytes,15,opt,name=operation,proto3" json:"operation,omitempty"`
	// Optional. Resource name of the trace associated with the log entry, if any.
	// If it contains a relative resource name, the name is assumed to be relative
	// to `//tracing.googleapis.com`. Example:
	// `projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824`
	Trace string `protobuf:"bytes,22,opt,name=trace,proto3" json:"trace,omitempty"`
	// Optional. The span ID within the trace associated with the log entry.
	//
	// For Trace spans, this is the same format that the Trace API v2 uses: a
	// 16-character hexadecimal encoding of an 8-byte array, such as
	// <code>"000000000000004a"</code>.
	SpanId string `protobuf:"bytes,27,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"`
	// Optional. The sampling decision of the trace associated with the log entry.
	//
	// True means that the trace resource name in the `trace` field was sampled
	// for storage in a trace backend. False means that the trace was not sampled
	// for storage when this log entry was written, or the sampling decision was
	// unknown at the time. A non-sampled `trace` value is still useful as a
	// request correlation identifier. The default is False.
	TraceSampled bool `protobuf:"varint,30,opt,name=trace_sampled,json=traceSampled,proto3" json:"trace_sampled,omitempty"`
	// Optional. Source code location information associated with the log entry,
	// if any.
	SourceLocation       *LogEntrySourceLocation `protobuf:"bytes,23,opt,name=source_location,json=sourceLocation,proto3" json:"source_location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_LogEntry proto.InternalMessageInfo

func (m *LogEntry) GetLogName() string {
	if m != nil {
		return m.LogName
	}
	return ""
}

func (m *LogEntry) GetResource() *monitoredres.MonitoredResource {
	if m != nil {
		return m.Resource
	}
	return nil
}

type isLogEntry_Payload interface {
	isLogEntry_Payload()
}

type LogEntry_ProtoPayload struct {
	ProtoPayload *any.Any `protobuf:"bytes,2,opt,name=proto_payload,json=protoPayload,proto3,oneof"`
}

type LogEntry_TextPayload struct {
	TextPayload string `protobuf:"bytes,3,opt,name=text_payload,json=textPayload,proto3,oneof"`
}

type LogEntry_JsonPayload struct {
	JsonPayload *_struct.Struct `protobuf:"bytes,6,opt,name=json_payload,json=jsonPayload,proto3,oneof"`
}

func (*LogEntry_ProtoPayload) isLogEntry_Payload() {}

func (*LogEntry_TextPayload) isLogEntry_Payload() {}

func (*LogEntry_JsonPayload) isLogEntry_Payload() {}

func (m *LogEntry) GetPayload() isLogEntry_Payload {
	if m != nil {
		return m.Payload
	}
	return nil
}

func (m *LogEntry) GetProtoPayload() *any.Any {
	if x, ok := m.GetPayload().(*LogEntry_ProtoPayload); ok {
		return x.ProtoPayload
	}
	return nil
}

func (m *LogEntry) GetTextPayload() string {
	if x, ok := m.GetPayload().(*LogEntry_TextPayload); ok {
		return x.TextPayload
	}
	return ""
}

func (m *LogEntry) GetJsonPayload() *_struct.Struct {
	if x, ok := m.GetPayload().(*LogEntry_JsonPayload); ok {
		return x.JsonPayload
	}
	return nil
}

func (m *LogEntry) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

func (m *LogEntry) GetReceiveTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.ReceiveTimestamp
	}
	return nil
}

func (m *LogEntry) GetSeverity() _type.LogSeverity {
	if m != nil {
		return m.Severity
	}
	return _type.LogSeverity_DEFAULT
}

func (m *LogEntry) GetInsertId() string {
	if m != nil {
		return m.InsertId
	}
	return ""
}

func (m *LogEntry) GetHttpRequest() *_type.HttpRequest {
	if m != nil {
		return m.HttpRequest
	}
	return nil
}

func (m *LogEntry) GetLabels() map[string]string {
	if m != nil {
		return m.Labels
	}
	return nil
}

// Deprecated: Do not use.
func (m *LogEntry) GetMetadata() *monitoredres.MonitoredResourceMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *LogEntry) GetOperation() *LogEntryOperation {
	if m != nil {
		return m.Operation
	}
	return nil
}

func (m *LogEntry) GetTrace() string {
	if m != nil {
		return m.Trace
	}
	return ""
}

func (m *LogEntry) GetSpanId() string {
	if m != nil {
		return m.SpanId
	}
	return ""
}

func (m *LogEntry) GetTraceSampled() bool {
	if m != nil {
		return m.TraceSampled
	}
	return false
}

func (m *LogEntry) GetSourceLocation() *LogEntrySourceLocation {
	if m != nil {
		return m.SourceLocation
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*LogEntry) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*LogEntry_ProtoPayload)(nil),
		(*LogEntry_TextPayload)(nil),
		(*LogEntry_JsonPayload)(nil),
	}
}

// Additional information about a potentially long-running operation with which
// a log entry is associated.
type LogEntryOperation struct {
	// Optional. An arbitrary operation identifier. Log entries with the same
	// identifier are assumed to be part of the same operation.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Optional. An arbitrary producer identifier. The combination of `id` and
	// `producer` must be globally unique. Examples for `producer`:
	// `"MyDivision.MyBigCompany.com"`, `"github.com/MyProject/MyApplication"`.
	Producer string `protobuf:"bytes,2,opt,name=producer,proto3" json:"producer,omitempty"`
	// Optional. Set this to True if this is the first log entry in the operation.
	First bool `protobuf:"varint,3,opt,name=first,proto3" json:"first,omitempty"`
	// Optional. Set this to True if this is the last log entry in the operation.
	Last                 bool     `protobuf:"varint,4,opt,name=last,proto3" json:"last,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LogEntryOperation proto.InternalMessageInfo

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

func (m *LogEntryOperation) GetProducer() string {
	if m != nil {
		return m.Producer
	}
	return ""
}

func (m *LogEntryOperation) GetFirst() bool {
	if m != nil {
		return m.First
	}
	return false
}

func (m *LogEntryOperation) GetLast() bool {
	if m != nil {
		return m.Last
	}
	return false
}

// Additional information about the source code location that produced the log
// entry.
type LogEntrySourceLocation struct {
	// Optional. Source file name. Depending on the runtime environment, this
	// might be a simple name or a fully-qualified name.
	File string `protobuf:"bytes,1,opt,name=file,proto3" json:"file,omitempty"`
	// Optional. Line within the source file. 1-based; 0 indicates no line number
	// available.
	Line int64 `protobuf:"varint,2,opt,name=line,proto3" json:"line,omitempty"`
	// Optional. Human-readable name of the function or method being invoked, with
	// optional context such as the class or package name. This information may be
	// used in contexts such as the logs viewer, where a file and line number are
	// less meaningful. The format can vary by language. For example:
	// `qual.if.ied.Class.method` (Java), `dir/package.func` (Go), `function`
	// (Python).
	Function             string   `protobuf:"bytes,3,opt,name=function,proto3" json:"function,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LogEntrySourceLocation proto.InternalMessageInfo

func (m *LogEntrySourceLocation) GetFile() string {
	if m != nil {
		return m.File
	}
	return ""
}

func (m *LogEntrySourceLocation) GetLine() int64 {
	if m != nil {
		return m.Line
	}
	return 0
}

func (m *LogEntrySourceLocation) GetFunction() string {
	if m != nil {
		return m.Function
	}
	return ""
}

func init() {
	proto.RegisterType((*LogEntry)(nil), "google.logging.v2.LogEntry")
	proto.RegisterMapType((map[string]string)(nil), "google.logging.v2.LogEntry.LabelsEntry")
	proto.RegisterType((*LogEntryOperation)(nil), "google.logging.v2.LogEntryOperation")
	proto.RegisterType((*LogEntrySourceLocation)(nil), "google.logging.v2.LogEntrySourceLocation")
}

func init() { proto.RegisterFile("google/logging/v2/log_entry.proto", fileDescriptor_8ba2017251165146) }

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