// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test/custom_results/graphics/software_overrides_config.proto

package graphics

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Next Tag: 2
type SoftwareOverridesConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Packages that were explicitly overridden from the normal system softare.
	Packages []*Package `protobuf:"bytes,1,rep,name=packages,proto3" json:"packages,omitempty"`
}

func (x *SoftwareOverridesConfig) Reset() {
	*x = SoftwareOverridesConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_custom_results_graphics_software_overrides_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SoftwareOverridesConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SoftwareOverridesConfig) ProtoMessage() {}

func (x *SoftwareOverridesConfig) ProtoReflect() protoreflect.Message {
	mi := &file_test_custom_results_graphics_software_overrides_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SoftwareOverridesConfig.ProtoReflect.Descriptor instead.
func (*SoftwareOverridesConfig) Descriptor() ([]byte, []int) {
	return file_test_custom_results_graphics_software_overrides_config_proto_rawDescGZIP(), []int{0}
}

func (x *SoftwareOverridesConfig) GetPackages() []*Package {
	if x != nil {
		return x.Packages
	}
	return nil
}

var File_test_custom_results_graphics_software_overrides_config_proto protoreflect.FileDescriptor

var file_test_custom_results_graphics_software_overrides_config_proto_rawDesc = []byte{
	0x0a, 0x3c, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2f, 0x73,
	0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65,
	0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x1a, 0x2a, 0x74, 0x65,
	0x73, 0x74, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x17, 0x53, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x63, 0x75, 0x73,
	0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x70,
	0x68, 0x69, 0x63, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x61,
	0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_custom_results_graphics_software_overrides_config_proto_rawDescOnce sync.Once
	file_test_custom_results_graphics_software_overrides_config_proto_rawDescData = file_test_custom_results_graphics_software_overrides_config_proto_rawDesc
)

func file_test_custom_results_graphics_software_overrides_config_proto_rawDescGZIP() []byte {
	file_test_custom_results_graphics_software_overrides_config_proto_rawDescOnce.Do(func() {
		file_test_custom_results_graphics_software_overrides_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_custom_results_graphics_software_overrides_config_proto_rawDescData)
	})
	return file_test_custom_results_graphics_software_overrides_config_proto_rawDescData
}

var file_test_custom_results_graphics_software_overrides_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_custom_results_graphics_software_overrides_config_proto_goTypes = []interface{}{
	(*SoftwareOverridesConfig)(nil), // 0: test.custom_results.graphics.SoftwareOverridesConfig
	(*Package)(nil),                 // 1: test.custom_results.graphics.Package
}
var file_test_custom_results_graphics_software_overrides_config_proto_depIdxs = []int32{
	1, // 0: test.custom_results.graphics.SoftwareOverridesConfig.packages:type_name -> test.custom_results.graphics.Package
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_test_custom_results_graphics_software_overrides_config_proto_init() }
func file_test_custom_results_graphics_software_overrides_config_proto_init() {
	if File_test_custom_results_graphics_software_overrides_config_proto != nil {
		return
	}
	file_test_custom_results_graphics_package_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_custom_results_graphics_software_overrides_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareOverridesConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_custom_results_graphics_software_overrides_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_custom_results_graphics_software_overrides_config_proto_goTypes,
		DependencyIndexes: file_test_custom_results_graphics_software_overrides_config_proto_depIdxs,
		MessageInfos:      file_test_custom_results_graphics_software_overrides_config_proto_msgTypes,
	}.Build()
	File_test_custom_results_graphics_software_overrides_config_proto = out.File
	file_test_custom_results_graphics_software_overrides_config_proto_rawDesc = nil
	file_test_custom_results_graphics_software_overrides_config_proto_goTypes = nil
	file_test_custom_results_graphics_software_overrides_config_proto_depIdxs = nil
}
