// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/custom_results/graphics/result_id.proto

package graphics

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

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

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

// Uniquely identifies a test result.
type ResultId struct {
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ResultId proto.InternalMessageInfo

func (m *ResultId) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func init() {
	proto.RegisterType((*ResultId)(nil), "test.custom_results.graphics.ResultId")
}

func init() {
	proto.RegisterFile("test/custom_results/graphics/result_id.proto", fileDescriptor_f87ee29742d669c3)
}

var fileDescriptor_f87ee29742d669c3 = []byte{
	// 147 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0x49, 0x2d, 0x2e,
	0xd1, 0x4f, 0x2e, 0x2d, 0x2e, 0xc9, 0xcf, 0x8d, 0x2f, 0x4a, 0x2d, 0x2e, 0xcd, 0x29, 0x29, 0xd6,
	0x4f, 0x2f, 0x4a, 0x2c, 0xc8, 0xc8, 0x4c, 0x2e, 0xd6, 0x87, 0x08, 0xc4, 0x67, 0xa6, 0xe8, 0x15,
	0x14, 0xe5, 0x97, 0xe4, 0x0b, 0xc9, 0x80, 0x54, 0xeb, 0xa1, 0xaa, 0xd6, 0x83, 0xa9, 0x56, 0x52,
	0xe0, 0xe2, 0x08, 0x02, 0x8b, 0x79, 0xa6, 0x08, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, 0x94, 0xa6,
	0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x1e, 0x51, 0x6e, 0xe9, 0xf9, 0x7a,
	0xc9, 0x19, 0x45, 0xf9, 0xb9, 0x99, 0xa5, 0xb9, 0x7a, 0xf9, 0x45, 0xe9, 0xfa, 0x30, 0x4e, 0x7e,
	0xb1, 0x7e, 0x66, 0x5e, 0x5a, 0x51, 0xa2, 0x3e, 0xd8, 0x26, 0xfd, 0xf4, 0x7c, 0x7d, 0x7c, 0x2e,
	0x4b, 0x62, 0x03, 0x2b, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe2, 0xbd, 0xa4, 0xfe, 0xc0,
	0x00, 0x00, 0x00,
}
