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

package lab

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

type ChromeOSDeviceID struct {
	// A unique ID for chromeos device, a randomly generated uuid or AssetTag.
	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 *ChromeOSDeviceID) Reset()         { *m = ChromeOSDeviceID{} }
func (m *ChromeOSDeviceID) String() string { return proto.CompactTextString(m) }
func (*ChromeOSDeviceID) ProtoMessage()    {}
func (*ChromeOSDeviceID) Descriptor() ([]byte, []int) {
	return fileDescriptor_e166ab8ecacc87c7, []int{0}
}

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

var xxx_messageInfo_ChromeOSDeviceID proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*ChromeOSDeviceID)(nil), "lab.ChromeOSDeviceID")
}

func init() { proto.RegisterFile("lab/chromeos_device_id.proto", fileDescriptor_e166ab8ecacc87c7) }

var fileDescriptor_e166ab8ecacc87c7 = []byte{
	// 132 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xc9, 0x49, 0x4c, 0xd2,
	0x4f, 0xce, 0x28, 0xca, 0xcf, 0x4d, 0xcd, 0x2f, 0x8e, 0x4f, 0x49, 0x2d, 0xcb, 0x4c, 0x4e, 0x8d,
	0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0xce, 0x49, 0x4c, 0x52, 0xd2, 0xe0,
	0x12, 0x70, 0x06, 0x2b, 0xf0, 0x0f, 0x76, 0x01, 0xcb, 0x7b, 0xba, 0x08, 0x89, 0x70, 0xb1, 0x96,
	0x25, 0xe6, 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x41, 0x38, 0x4e, 0xfa, 0x51,
	0xba, 0xe9, 0xf9, 0x7a, 0x60, 0xd3, 0x32, 0x4b, 0x73, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0x61, 0x9c,
	0xfc, 0x62, 0xfd, 0xcc, 0xbc, 0xb4, 0xa2, 0x44, 0x7d, 0xb0, 0xc1, 0xfa, 0xe9, 0xf9, 0xfa, 0x39,
	0x89, 0x49, 0x49, 0x6c, 0x60, 0x9e, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x63, 0x98, 0x97,
	0x86, 0x00, 0x00, 0x00,
}
