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

package dlp

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	empty "github.com/golang/protobuf/ptypes/empty"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	status "google.golang.org/genproto/googleapis/rpc/status"
	date "google.golang.org/genproto/googleapis/type/date"
	dayofweek "google.golang.org/genproto/googleapis/type/dayofweek"
	timeofday "google.golang.org/genproto/googleapis/type/timeofday"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status1 "google.golang.org/grpc/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

// Options describing which parts of the provided content should be scanned.
type ContentOption int32

const (
	// Includes entire content of a file or a data stream.
	ContentOption_CONTENT_UNSPECIFIED ContentOption = 0
	// Text content within the data, excluding any metadata.
	ContentOption_CONTENT_TEXT ContentOption = 1
	// Images found in the data.
	ContentOption_CONTENT_IMAGE ContentOption = 2
)

var ContentOption_name = map[int32]string{
	0: "CONTENT_UNSPECIFIED",
	1: "CONTENT_TEXT",
	2: "CONTENT_IMAGE",
}

var ContentOption_value = map[string]int32{
	"CONTENT_UNSPECIFIED": 0,
	"CONTENT_TEXT":        1,
	"CONTENT_IMAGE":       2,
}

func (x ContentOption) String() string {
	return proto.EnumName(ContentOption_name, int32(x))
}

func (ContentOption) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{0}
}

// Type of the match which can be applied to different ways of matching, like
// Dictionary, regular expression and intersecting with findings of another
// info type.
type MatchingType int32

const (
	// Invalid.
	MatchingType_MATCHING_TYPE_UNSPECIFIED MatchingType = 0
	// Full match.
	//
	// - Dictionary: join of Dictionary results matched complete finding quote
	// - Regex: all regex matches fill a finding quote start to end
	// - Exclude info type: completely inside affecting info types findings
	MatchingType_MATCHING_TYPE_FULL_MATCH MatchingType = 1
	// Partial match.
	//
	// - Dictionary: at least one of the tokens in the finding matches
	// - Regex: substring of the finding matches
	// - Exclude info type: intersects with affecting info types findings
	MatchingType_MATCHING_TYPE_PARTIAL_MATCH MatchingType = 2
	// Inverse match.
	//
	// - Dictionary: no tokens in the finding match the dictionary
	// - Regex: finding doesn't match the regex
	// - Exclude info type: no intersection with affecting info types findings
	MatchingType_MATCHING_TYPE_INVERSE_MATCH MatchingType = 3
)

var MatchingType_name = map[int32]string{
	0: "MATCHING_TYPE_UNSPECIFIED",
	1: "MATCHING_TYPE_FULL_MATCH",
	2: "MATCHING_TYPE_PARTIAL_MATCH",
	3: "MATCHING_TYPE_INVERSE_MATCH",
}

var MatchingType_value = map[string]int32{
	"MATCHING_TYPE_UNSPECIFIED":   0,
	"MATCHING_TYPE_FULL_MATCH":    1,
	"MATCHING_TYPE_PARTIAL_MATCH": 2,
	"MATCHING_TYPE_INVERSE_MATCH": 3,
}

func (x MatchingType) String() string {
	return proto.EnumName(MatchingType_name, int32(x))
}

func (MatchingType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{1}
}

// Parts of the APIs which use certain infoTypes.
type InfoTypeSupportedBy int32

const (
	InfoTypeSupportedBy_ENUM_TYPE_UNSPECIFIED InfoTypeSupportedBy = 0
	// Supported by the inspect operations.
	InfoTypeSupportedBy_INSPECT InfoTypeSupportedBy = 1
	// Supported by the risk analysis operations.
	InfoTypeSupportedBy_RISK_ANALYSIS InfoTypeSupportedBy = 2
)

var InfoTypeSupportedBy_name = map[int32]string{
	0: "ENUM_TYPE_UNSPECIFIED",
	1: "INSPECT",
	2: "RISK_ANALYSIS",
}

var InfoTypeSupportedBy_value = map[string]int32{
	"ENUM_TYPE_UNSPECIFIED": 0,
	"INSPECT":               1,
	"RISK_ANALYSIS":         2,
}

func (x InfoTypeSupportedBy) String() string {
	return proto.EnumName(InfoTypeSupportedBy_name, int32(x))
}

func (InfoTypeSupportedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{2}
}

// Operators available for comparing the value of fields.
type RelationalOperator int32

const (
	RelationalOperator_RELATIONAL_OPERATOR_UNSPECIFIED RelationalOperator = 0
	// Equal. Attempts to match even with incompatible types.
	RelationalOperator_EQUAL_TO RelationalOperator = 1
	// Not equal to. Attempts to match even with incompatible types.
	RelationalOperator_NOT_EQUAL_TO RelationalOperator = 2
	// Greater than.
	RelationalOperator_GREATER_THAN RelationalOperator = 3
	// Less than.
	RelationalOperator_LESS_THAN RelationalOperator = 4
	// Greater than or equals.
	RelationalOperator_GREATER_THAN_OR_EQUALS RelationalOperator = 5
	// Less than or equals.
	RelationalOperator_LESS_THAN_OR_EQUALS RelationalOperator = 6
	// Exists
	RelationalOperator_EXISTS RelationalOperator = 7
)

var RelationalOperator_name = map[int32]string{
	0: "RELATIONAL_OPERATOR_UNSPECIFIED",
	1: "EQUAL_TO",
	2: "NOT_EQUAL_TO",
	3: "GREATER_THAN",
	4: "LESS_THAN",
	5: "GREATER_THAN_OR_EQUALS",
	6: "LESS_THAN_OR_EQUALS",
	7: "EXISTS",
}

var RelationalOperator_value = map[string]int32{
	"RELATIONAL_OPERATOR_UNSPECIFIED": 0,
	"EQUAL_TO":                        1,
	"NOT_EQUAL_TO":                    2,
	"GREATER_THAN":                    3,
	"LESS_THAN":                       4,
	"GREATER_THAN_OR_EQUALS":          5,
	"LESS_THAN_OR_EQUALS":             6,
	"EXISTS":                          7,
}

func (x RelationalOperator) String() string {
	return proto.EnumName(RelationalOperator_name, int32(x))
}

func (RelationalOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{3}
}

// An enum to represent the various type of DLP jobs.
type DlpJobType int32

const (
	DlpJobType_DLP_JOB_TYPE_UNSPECIFIED DlpJobType = 0
	// The job inspected Google Cloud for sensitive data.
	DlpJobType_INSPECT_JOB DlpJobType = 1
	// The job executed a Risk Analysis computation.
	DlpJobType_RISK_ANALYSIS_JOB DlpJobType = 2
)

var DlpJobType_name = map[int32]string{
	0: "DLP_JOB_TYPE_UNSPECIFIED",
	1: "INSPECT_JOB",
	2: "RISK_ANALYSIS_JOB",
}

var DlpJobType_value = map[string]int32{
	"DLP_JOB_TYPE_UNSPECIFIED": 0,
	"INSPECT_JOB":              1,
	"RISK_ANALYSIS_JOB":        2,
}

func (x DlpJobType) String() string {
	return proto.EnumName(DlpJobType_name, int32(x))
}

func (DlpJobType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{4}
}

// State of a StoredInfoType version.
type StoredInfoTypeState int32

const (
	StoredInfoTypeState_STORED_INFO_TYPE_STATE_UNSPECIFIED StoredInfoTypeState = 0
	// StoredInfoType version is being created.
	StoredInfoTypeState_PENDING StoredInfoTypeState = 1
	// StoredInfoType version is ready for use.
	StoredInfoTypeState_READY StoredInfoTypeState = 2
	// StoredInfoType creation failed. All relevant error messages are returned in
	// the `StoredInfoTypeVersion` message.
	StoredInfoTypeState_FAILED StoredInfoTypeState = 3
	// StoredInfoType is no longer valid because artifacts stored in
	// user-controlled storage were modified. To fix an invalid StoredInfoType,
	// use the `UpdateStoredInfoType` method to create a new version.
	StoredInfoTypeState_INVALID StoredInfoTypeState = 4
)

var StoredInfoTypeState_name = map[int32]string{
	0: "STORED_INFO_TYPE_STATE_UNSPECIFIED",
	1: "PENDING",
	2: "READY",
	3: "FAILED",
	4: "INVALID",
}

var StoredInfoTypeState_value = map[string]int32{
	"STORED_INFO_TYPE_STATE_UNSPECIFIED": 0,
	"PENDING":                            1,
	"READY":                              2,
	"FAILED":                             3,
	"INVALID":                            4,
}

func (x StoredInfoTypeState) String() string {
	return proto.EnumName(StoredInfoTypeState_name, int32(x))
}

func (StoredInfoTypeState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{5}
}

type ByteContentItem_BytesType int32

const (
	ByteContentItem_BYTES_TYPE_UNSPECIFIED ByteContentItem_BytesType = 0
	ByteContentItem_IMAGE                  ByteContentItem_BytesType = 6
	ByteContentItem_IMAGE_JPEG             ByteContentItem_BytesType = 1
	ByteContentItem_IMAGE_BMP              ByteContentItem_BytesType = 2
	ByteContentItem_IMAGE_PNG              ByteContentItem_BytesType = 3
	ByteContentItem_IMAGE_SVG              ByteContentItem_BytesType = 4
	ByteContentItem_TEXT_UTF8              ByteContentItem_BytesType = 5
	ByteContentItem_AVRO                   ByteContentItem_BytesType = 11
)

var ByteContentItem_BytesType_name = map[int32]string{
	0:  "BYTES_TYPE_UNSPECIFIED",
	6:  "IMAGE",
	1:  "IMAGE_JPEG",
	2:  "IMAGE_BMP",
	3:  "IMAGE_PNG",
	4:  "IMAGE_SVG",
	5:  "TEXT_UTF8",
	11: "AVRO",
}

var ByteContentItem_BytesType_value = map[string]int32{
	"BYTES_TYPE_UNSPECIFIED": 0,
	"IMAGE":                  6,
	"IMAGE_JPEG":             1,
	"IMAGE_BMP":              2,
	"IMAGE_PNG":              3,
	"IMAGE_SVG":              4,
	"TEXT_UTF8":              5,
	"AVRO":                   11,
}

func (x ByteContentItem_BytesType) String() string {
	return proto.EnumName(ByteContentItem_BytesType_name, int32(x))
}

func (ByteContentItem_BytesType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{5, 0}
}

// Predefined schemas for storing findings.
type OutputStorageConfig_OutputSchema int32

const (
	OutputStorageConfig_OUTPUT_SCHEMA_UNSPECIFIED OutputStorageConfig_OutputSchema = 0
	// Basic schema including only `info_type`, `quote`, `certainty`, and
	// `timestamp`.
	OutputStorageConfig_BASIC_COLUMNS OutputStorageConfig_OutputSchema = 1
	// Schema tailored to findings from scanning Google Cloud Storage.
	OutputStorageConfig_GCS_COLUMNS OutputStorageConfig_OutputSchema = 2
	// Schema tailored to findings from scanning Google Datastore.
	OutputStorageConfig_DATASTORE_COLUMNS OutputStorageConfig_OutputSchema = 3
	// Schema tailored to findings from scanning Google BigQuery.
	OutputStorageConfig_BIG_QUERY_COLUMNS OutputStorageConfig_OutputSchema = 4
	// Schema containing all columns.
	OutputStorageConfig_ALL_COLUMNS OutputStorageConfig_OutputSchema = 5
)

var OutputStorageConfig_OutputSchema_name = map[int32]string{
	0: "OUTPUT_SCHEMA_UNSPECIFIED",
	1: "BASIC_COLUMNS",
	2: "GCS_COLUMNS",
	3: "DATASTORE_COLUMNS",
	4: "BIG_QUERY_COLUMNS",
	5: "ALL_COLUMNS",
}

var OutputStorageConfig_OutputSchema_value = map[string]int32{
	"OUTPUT_SCHEMA_UNSPECIFIED": 0,
	"BASIC_COLUMNS":             1,
	"GCS_COLUMNS":               2,
	"DATASTORE_COLUMNS":         3,
	"BIG_QUERY_COLUMNS":         4,
	"ALL_COLUMNS":               5,
}

func (x OutputStorageConfig_OutputSchema) String() string {
	return proto.EnumName(OutputStorageConfig_OutputSchema_name, int32(x))
}

func (OutputStorageConfig_OutputSchema) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{27, 0}
}

type TimePartConfig_TimePart int32

const (
	TimePartConfig_TIME_PART_UNSPECIFIED TimePartConfig_TimePart = 0
	// [0-9999]
	TimePartConfig_YEAR TimePartConfig_TimePart = 1
	// [1-12]
	TimePartConfig_MONTH TimePartConfig_TimePart = 2
	// [1-31]
	TimePartConfig_DAY_OF_MONTH TimePartConfig_TimePart = 3
	// [1-7]
	TimePartConfig_DAY_OF_WEEK TimePartConfig_TimePart = 4
	// [1-52]
	TimePartConfig_WEEK_OF_YEAR TimePartConfig_TimePart = 5
	// [0-23]
	TimePartConfig_HOUR_OF_DAY TimePartConfig_TimePart = 6
)

var TimePartConfig_TimePart_name = map[int32]string{
	0: "TIME_PART_UNSPECIFIED",
	1: "YEAR",
	2: "MONTH",
	3: "DAY_OF_MONTH",
	4: "DAY_OF_WEEK",
	5: "WEEK_OF_YEAR",
	6: "HOUR_OF_DAY",
}

var TimePartConfig_TimePart_value = map[string]int32{
	"TIME_PART_UNSPECIFIED": 0,
	"YEAR":                  1,
	"MONTH":                 2,
	"DAY_OF_MONTH":          3,
	"DAY_OF_WEEK":           4,
	"WEEK_OF_YEAR":          5,
	"HOUR_OF_DAY":           6,
}

func (x TimePartConfig_TimePart) String() string {
	return proto.EnumName(TimePartConfig_TimePart_name, int32(x))
}

func (TimePartConfig_TimePart) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{44, 0}
}

type CharsToIgnore_CommonCharsToIgnore int32

const (
	CharsToIgnore_COMMON_CHARS_TO_IGNORE_UNSPECIFIED CharsToIgnore_CommonCharsToIgnore = 0
	// 0-9
	CharsToIgnore_NUMERIC CharsToIgnore_CommonCharsToIgnore = 1
	// A-Z
	CharsToIgnore_ALPHA_UPPER_CASE CharsToIgnore_CommonCharsToIgnore = 2
	// a-z
	CharsToIgnore_ALPHA_LOWER_CASE CharsToIgnore_CommonCharsToIgnore = 3
	// US Punctuation, one of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
	CharsToIgnore_PUNCTUATION CharsToIgnore_CommonCharsToIgnore = 4
	// Whitespace character, one of [ \t\n\x0B\f\r]
	CharsToIgnore_WHITESPACE CharsToIgnore_CommonCharsToIgnore = 5
)

var CharsToIgnore_CommonCharsToIgnore_name = map[int32]string{
	0: "COMMON_CHARS_TO_IGNORE_UNSPECIFIED",
	1: "NUMERIC",
	2: "ALPHA_UPPER_CASE",
	3: "ALPHA_LOWER_CASE",
	4: "PUNCTUATION",
	5: "WHITESPACE",
}

var CharsToIgnore_CommonCharsToIgnore_value = map[string]int32{
	"COMMON_CHARS_TO_IGNORE_UNSPECIFIED": 0,
	"NUMERIC":                            1,
	"ALPHA_UPPER_CASE":                   2,
	"ALPHA_LOWER_CASE":                   3,
	"PUNCTUATION":                        4,
	"WHITESPACE":                         5,
}

func (x CharsToIgnore_CommonCharsToIgnore) String() string {
	return proto.EnumName(CharsToIgnore_CommonCharsToIgnore_name, int32(x))
}

func (CharsToIgnore_CommonCharsToIgnore) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{50, 0}
}

// These are commonly used subsets of the alphabet that the FFX mode
// natively supports. In the algorithm, the alphabet is selected using
// the "radix". Therefore each corresponds to particular radix.
type CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet int32

const (
	CryptoReplaceFfxFpeConfig_FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 0
	// [0-9] (radix of 10)
	CryptoReplaceFfxFpeConfig_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 1
	// [0-9A-F] (radix of 16)
	CryptoReplaceFfxFpeConfig_HEXADECIMAL CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 2
	// [0-9A-Z] (radix of 36)
	CryptoReplaceFfxFpeConfig_UPPER_CASE_ALPHA_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 3
	// [0-9A-Za-z] (radix of 62)
	CryptoReplaceFfxFpeConfig_ALPHA_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 4
)

var CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name = map[int32]string{
	0: "FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED",
	1: "NUMERIC",
	2: "HEXADECIMAL",
	3: "UPPER_CASE_ALPHA_NUMERIC",
	4: "ALPHA_NUMERIC",
}

var CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_value = map[string]int32{
	"FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED": 0,
	"NUMERIC":                                1,
	"HEXADECIMAL":                            2,
	"UPPER_CASE_ALPHA_NUMERIC":               3,
	"ALPHA_NUMERIC":                          4,
}

func (x CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet) String() string {
	return proto.EnumName(CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name, int32(x))
}

func (CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{54, 0}
}

type RecordCondition_Expressions_LogicalOperator int32

const (
	RecordCondition_Expressions_LOGICAL_OPERATOR_UNSPECIFIED RecordCondition_Expressions_LogicalOperator = 0
	RecordCondition_Expressions_AND                          RecordCondition_Expressions_LogicalOperator = 1
)

var RecordCondition_Expressions_LogicalOperator_name = map[int32]string{
	0: "LOGICAL_OPERATOR_UNSPECIFIED",
	1: "AND",
}

var RecordCondition_Expressions_LogicalOperator_value = map[string]int32{
	"LOGICAL_OPERATOR_UNSPECIFIED": 0,
	"AND":                          1,
}

func (x RecordCondition_Expressions_LogicalOperator) String() string {
	return proto.EnumName(RecordCondition_Expressions_LogicalOperator_name, int32(x))
}

func (RecordCondition_Expressions_LogicalOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{64, 2, 0}
}

// Possible outcomes of transformations.
type TransformationSummary_TransformationResultCode int32

const (
	TransformationSummary_TRANSFORMATION_RESULT_CODE_UNSPECIFIED TransformationSummary_TransformationResultCode = 0
	TransformationSummary_SUCCESS                                TransformationSummary_TransformationResultCode = 1
	TransformationSummary_ERROR                                  TransformationSummary_TransformationResultCode = 2
)

var TransformationSummary_TransformationResultCode_name = map[int32]string{
	0: "TRANSFORMATION_RESULT_CODE_UNSPECIFIED",
	1: "SUCCESS",
	2: "ERROR",
}

var TransformationSummary_TransformationResultCode_value = map[string]int32{
	"TRANSFORMATION_RESULT_CODE_UNSPECIFIED": 0,
	"SUCCESS":                                1,
	"ERROR":                                  2,
}

func (x TransformationSummary_TransformationResultCode) String() string {
	return proto.EnumName(TransformationSummary_TransformationResultCode_name, int32(x))
}

func (TransformationSummary_TransformationResultCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{66, 0}
}

// Whether the trigger is currently active. If PAUSED or CANCELLED, no jobs
// will be created with this configuration. The service may automatically
// pause triggers experiencing frequent errors. To restart a job, set the
// status to HEALTHY after correcting user errors.
type JobTrigger_Status int32

const (
	JobTrigger_STATUS_UNSPECIFIED JobTrigger_Status = 0
	// Trigger is healthy.
	JobTrigger_HEALTHY JobTrigger_Status = 1
	// Trigger is temporarily paused.
	JobTrigger_PAUSED JobTrigger_Status = 2
	// Trigger is cancelled and can not be resumed.
	JobTrigger_CANCELLED JobTrigger_Status = 3
)

var JobTrigger_Status_name = map[int32]string{
	0: "STATUS_UNSPECIFIED",
	1: "HEALTHY",
	2: "PAUSED",
	3: "CANCELLED",
}

var JobTrigger_Status_value = map[string]int32{
	"STATUS_UNSPECIFIED": 0,
	"HEALTHY":            1,
	"PAUSED":             2,
	"CANCELLED":          3,
}

func (x JobTrigger_Status) String() string {
	return proto.EnumName(JobTrigger_Status_name, int32(x))
}

func (JobTrigger_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{71, 0}
}

type DlpJob_JobState int32

const (
	DlpJob_JOB_STATE_UNSPECIFIED DlpJob_JobState = 0
	// The job has not yet started.
	DlpJob_PENDING DlpJob_JobState = 1
	// The job is currently running.
	DlpJob_RUNNING DlpJob_JobState = 2
	// The job is no longer running.
	DlpJob_DONE DlpJob_JobState = 3
	// The job was canceled before it could complete.
	DlpJob_CANCELED DlpJob_JobState = 4
	// The job had an error and did not complete.
	DlpJob_FAILED DlpJob_JobState = 5
)

var DlpJob_JobState_name = map[int32]string{
	0: "JOB_STATE_UNSPECIFIED",
	1: "PENDING",
	2: "RUNNING",
	3: "DONE",
	4: "CANCELED",
	5: "FAILED",
}

var DlpJob_JobState_value = map[string]int32{
	"JOB_STATE_UNSPECIFIED": 0,
	"PENDING":               1,
	"RUNNING":               2,
	"DONE":                  3,
	"CANCELED":              4,
	"FAILED":                5,
}

func (x DlpJob_JobState) String() string {
	return proto.EnumName(DlpJob_JobState_name, int32(x))
}

func (DlpJob_JobState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{88, 0}
}

// List of exclude infoTypes.
type ExcludeInfoTypes struct {
	// InfoType list in ExclusionRule rule drops a finding when it overlaps or
	// contained within with a finding of an infoType from this list. For
	// example, for `InspectionRuleSet.info_types` containing "PHONE_NUMBER"` and
	// `exclusion_rule` containing `exclude_info_types.info_types` with
	// "EMAIL_ADDRESS" the phone number findings are dropped if they overlap
	// with EMAIL_ADDRESS finding.
	// That leads to "555-222-2222@example.org" to generate only a single
	// finding, namely email address.
	InfoTypes            []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_ExcludeInfoTypes proto.InternalMessageInfo

func (m *ExcludeInfoTypes) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

// The rule that specifies conditions when findings of infoTypes specified in
// `InspectionRuleSet` are removed from results.
type ExclusionRule struct {
	// Types that are valid to be assigned to Type:
	//	*ExclusionRule_Dictionary
	//	*ExclusionRule_Regex
	//	*ExclusionRule_ExcludeInfoTypes
	Type isExclusionRule_Type `protobuf_oneof:"type"`
	// How the rule is applied, see MatchingType documentation for details.
	MatchingType         MatchingType `protobuf:"varint,4,opt,name=matching_type,json=matchingType,proto3,enum=google.privacy.dlp.v2.MatchingType" json:"matching_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_ExclusionRule proto.InternalMessageInfo

type isExclusionRule_Type interface {
	isExclusionRule_Type()
}

type ExclusionRule_Dictionary struct {
	Dictionary *CustomInfoType_Dictionary `protobuf:"bytes,1,opt,name=dictionary,proto3,oneof"`
}

type ExclusionRule_Regex struct {
	Regex *CustomInfoType_Regex `protobuf:"bytes,2,opt,name=regex,proto3,oneof"`
}

type ExclusionRule_ExcludeInfoTypes struct {
	ExcludeInfoTypes *ExcludeInfoTypes `protobuf:"bytes,3,opt,name=exclude_info_types,json=excludeInfoTypes,proto3,oneof"`
}

func (*ExclusionRule_Dictionary) isExclusionRule_Type() {}

func (*ExclusionRule_Regex) isExclusionRule_Type() {}

func (*ExclusionRule_ExcludeInfoTypes) isExclusionRule_Type() {}

func (m *ExclusionRule) GetType() isExclusionRule_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *ExclusionRule) GetDictionary() *CustomInfoType_Dictionary {
	if x, ok := m.GetType().(*ExclusionRule_Dictionary); ok {
		return x.Dictionary
	}
	return nil
}

func (m *ExclusionRule) GetRegex() *CustomInfoType_Regex {
	if x, ok := m.GetType().(*ExclusionRule_Regex); ok {
		return x.Regex
	}
	return nil
}

func (m *ExclusionRule) GetExcludeInfoTypes() *ExcludeInfoTypes {
	if x, ok := m.GetType().(*ExclusionRule_ExcludeInfoTypes); ok {
		return x.ExcludeInfoTypes
	}
	return nil
}

func (m *ExclusionRule) GetMatchingType() MatchingType {
	if m != nil {
		return m.MatchingType
	}
	return MatchingType_MATCHING_TYPE_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ExclusionRule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ExclusionRule_Dictionary)(nil),
		(*ExclusionRule_Regex)(nil),
		(*ExclusionRule_ExcludeInfoTypes)(nil),
	}
}

// A single inspection rule to be applied to infoTypes, specified in
// `InspectionRuleSet`.
type InspectionRule struct {
	// Types that are valid to be assigned to Type:
	//	*InspectionRule_HotwordRule
	//	*InspectionRule_ExclusionRule
	Type                 isInspectionRule_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_InspectionRule proto.InternalMessageInfo

type isInspectionRule_Type interface {
	isInspectionRule_Type()
}

type InspectionRule_HotwordRule struct {
	HotwordRule *CustomInfoType_DetectionRule_HotwordRule `protobuf:"bytes,1,opt,name=hotword_rule,json=hotwordRule,proto3,oneof"`
}

type InspectionRule_ExclusionRule struct {
	ExclusionRule *ExclusionRule `protobuf:"bytes,2,opt,name=exclusion_rule,json=exclusionRule,proto3,oneof"`
}

func (*InspectionRule_HotwordRule) isInspectionRule_Type() {}

func (*InspectionRule_ExclusionRule) isInspectionRule_Type() {}

func (m *InspectionRule) GetType() isInspectionRule_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *InspectionRule) GetHotwordRule() *CustomInfoType_DetectionRule_HotwordRule {
	if x, ok := m.GetType().(*InspectionRule_HotwordRule); ok {
		return x.HotwordRule
	}
	return nil
}

func (m *InspectionRule) GetExclusionRule() *ExclusionRule {
	if x, ok := m.GetType().(*InspectionRule_ExclusionRule); ok {
		return x.ExclusionRule
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*InspectionRule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*InspectionRule_HotwordRule)(nil),
		(*InspectionRule_ExclusionRule)(nil),
	}
}

// Rule set for modifying a set of infoTypes to alter behavior under certain
// circumstances, depending on the specific details of the rules within the set.
type InspectionRuleSet struct {
	// List of infoTypes this rule set is applied to.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Set of rules to be applied to infoTypes. The rules are applied in order.
	Rules                []*InspectionRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *InspectionRuleSet) Reset()         { *m = InspectionRuleSet{} }
func (m *InspectionRuleSet) String() string { return proto.CompactTextString(m) }
func (*InspectionRuleSet) ProtoMessage()    {}
func (*InspectionRuleSet) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{3}
}

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

var xxx_messageInfo_InspectionRuleSet proto.InternalMessageInfo

func (m *InspectionRuleSet) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InspectionRuleSet) GetRules() []*InspectionRule {
	if m != nil {
		return m.Rules
	}
	return nil
}

// Configuration description of the scanning process.
// When used with redactContent only info_types and min_likelihood are currently
// used.
type InspectConfig struct {
	// Restricts what info_types to look for. The values must correspond to
	// InfoType values returned by ListInfoTypes or listed at
	// https://cloud.google.com/dlp/docs/infotypes-reference.
	//
	// When no InfoTypes or CustomInfoTypes are specified in a request, the
	// system may automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// The special InfoType name "ALL_BASIC" can be used to trigger all detectors,
	// but may change over time as new InfoTypes are added. If you need precise
	// control and predictability as to what detectors are run you should specify
	// specific InfoTypes listed in the reference.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Only returns findings equal or above this threshold. The default is
	// POSSIBLE.
	// See https://cloud.google.com/dlp/docs/likelihood to learn more.
	MinLikelihood Likelihood                   `protobuf:"varint,2,opt,name=min_likelihood,json=minLikelihood,proto3,enum=google.privacy.dlp.v2.Likelihood" json:"min_likelihood,omitempty"`
	Limits        *InspectConfig_FindingLimits `protobuf:"bytes,3,opt,name=limits,proto3" json:"limits,omitempty"`
	// When true, a contextual quote from the data that triggered a finding is
	// included in the response; see Finding.quote.
	IncludeQuote bool `protobuf:"varint,4,opt,name=include_quote,json=includeQuote,proto3" json:"include_quote,omitempty"`
	// When true, excludes type information of the findings.
	ExcludeInfoTypes bool `protobuf:"varint,5,opt,name=exclude_info_types,json=excludeInfoTypes,proto3" json:"exclude_info_types,omitempty"`
	// CustomInfoTypes provided by the user. See
	// https://cloud.google.com/dlp/docs/creating-custom-infotypes to learn more.
	CustomInfoTypes []*CustomInfoType `protobuf:"bytes,6,rep,name=custom_info_types,json=customInfoTypes,proto3" json:"custom_info_types,omitempty"`
	// List of options defining data content to scan.
	// If empty, text, images, and other content will be included.
	ContentOptions []ContentOption `protobuf:"varint,8,rep,packed,name=content_options,json=contentOptions,proto3,enum=google.privacy.dlp.v2.ContentOption" json:"content_options,omitempty"`
	// Set of rules to apply to the findings for this InspectConfig.
	// Exclusion rules, contained in the set are executed in the end, other
	// rules are executed in the order they are specified for each info type.
	RuleSet              []*InspectionRuleSet `protobuf:"bytes,10,rep,name=rule_set,json=ruleSet,proto3" json:"rule_set,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *InspectConfig) Reset()         { *m = InspectConfig{} }
func (m *InspectConfig) String() string { return proto.CompactTextString(m) }
func (*InspectConfig) ProtoMessage()    {}
func (*InspectConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{4}
}

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

var xxx_messageInfo_InspectConfig proto.InternalMessageInfo

func (m *InspectConfig) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InspectConfig) GetMinLikelihood() Likelihood {
	if m != nil {
		return m.MinLikelihood
	}
	return Likelihood_LIKELIHOOD_UNSPECIFIED
}

func (m *InspectConfig) GetLimits() *InspectConfig_FindingLimits {
	if m != nil {
		return m.Limits
	}
	return nil
}

func (m *InspectConfig) GetIncludeQuote() bool {
	if m != nil {
		return m.IncludeQuote
	}
	return false
}

func (m *InspectConfig) GetExcludeInfoTypes() bool {
	if m != nil {
		return m.ExcludeInfoTypes
	}
	return false
}

func (m *InspectConfig) GetCustomInfoTypes() []*CustomInfoType {
	if m != nil {
		return m.CustomInfoTypes
	}
	return nil
}

func (m *InspectConfig) GetContentOptions() []ContentOption {
	if m != nil {
		return m.ContentOptions
	}
	return nil
}

func (m *InspectConfig) GetRuleSet() []*InspectionRuleSet {
	if m != nil {
		return m.RuleSet
	}
	return nil
}

type InspectConfig_FindingLimits struct {
	// Max number of findings that will be returned for each item scanned.
	// When set within `InspectDataSourceRequest`,
	// the maximum returned is 2000 regardless if this is set higher.
	// When set within `InspectContentRequest`, this field is ignored.
	MaxFindingsPerItem int32 `protobuf:"varint,1,opt,name=max_findings_per_item,json=maxFindingsPerItem,proto3" json:"max_findings_per_item,omitempty"`
	// Max number of findings that will be returned per request/job.
	// When set within `InspectContentRequest`, the maximum returned is 2000
	// regardless if this is set higher.
	MaxFindingsPerRequest int32 `protobuf:"varint,2,opt,name=max_findings_per_request,json=maxFindingsPerRequest,proto3" json:"max_findings_per_request,omitempty"`
	// Configuration of findings limit given for specified infoTypes.
	MaxFindingsPerInfoType []*InspectConfig_FindingLimits_InfoTypeLimit `protobuf:"bytes,3,rep,name=max_findings_per_info_type,json=maxFindingsPerInfoType,proto3" json:"max_findings_per_info_type,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                                     `json:"-"`
	XXX_unrecognized       []byte                                       `json:"-"`
	XXX_sizecache          int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_InspectConfig_FindingLimits proto.InternalMessageInfo

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerItem() int32 {
	if m != nil {
		return m.MaxFindingsPerItem
	}
	return 0
}

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerRequest() int32 {
	if m != nil {
		return m.MaxFindingsPerRequest
	}
	return 0
}

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerInfoType() []*InspectConfig_FindingLimits_InfoTypeLimit {
	if m != nil {
		return m.MaxFindingsPerInfoType
	}
	return nil
}

// Max findings configuration per infoType, per content item or long
// running DlpJob.
type InspectConfig_FindingLimits_InfoTypeLimit struct {
	// Type of information the findings limit applies to. Only one limit per
	// info_type should be provided. If InfoTypeLimit does not have an
	// info_type, the DLP API applies the limit against all info_types that
	// are found but not specified in another InfoTypeLimit.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Max findings limit for the given infoType.
	MaxFindings          int32    `protobuf:"varint,2,opt,name=max_findings,json=maxFindings,proto3" json:"max_findings,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_InspectConfig_FindingLimits_InfoTypeLimit proto.InternalMessageInfo

func (m *InspectConfig_FindingLimits_InfoTypeLimit) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *InspectConfig_FindingLimits_InfoTypeLimit) GetMaxFindings() int32 {
	if m != nil {
		return m.MaxFindings
	}
	return 0
}

// Container for bytes to inspect or redact.
type ByteContentItem struct {
	// The type of data stored in the bytes string. Default will be TEXT_UTF8.
	Type ByteContentItem_BytesType `protobuf:"varint,1,opt,name=type,proto3,enum=google.privacy.dlp.v2.ByteContentItem_BytesType" json:"type,omitempty"`
	// Content data to inspect or redact.
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ByteContentItem) Reset()         { *m = ByteContentItem{} }
func (m *ByteContentItem) String() string { return proto.CompactTextString(m) }
func (*ByteContentItem) ProtoMessage()    {}
func (*ByteContentItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{5}
}

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

var xxx_messageInfo_ByteContentItem proto.InternalMessageInfo

func (m *ByteContentItem) GetType() ByteContentItem_BytesType {
	if m != nil {
		return m.Type
	}
	return ByteContentItem_BYTES_TYPE_UNSPECIFIED
}

func (m *ByteContentItem) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Container structure for the content to inspect.
type ContentItem struct {
	// Data of the item either in the byte array or UTF-8 string form, or table.
	//
	// Types that are valid to be assigned to DataItem:
	//	*ContentItem_Value
	//	*ContentItem_Table
	//	*ContentItem_ByteItem
	DataItem             isContentItem_DataItem `protobuf_oneof:"data_item"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ContentItem) Reset()         { *m = ContentItem{} }
func (m *ContentItem) String() string { return proto.CompactTextString(m) }
func (*ContentItem) ProtoMessage()    {}
func (*ContentItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{6}
}

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

var xxx_messageInfo_ContentItem proto.InternalMessageInfo

type isContentItem_DataItem interface {
	isContentItem_DataItem()
}

type ContentItem_Value struct {
	Value string `protobuf:"bytes,3,opt,name=value,proto3,oneof"`
}

type ContentItem_Table struct {
	Table *Table `protobuf:"bytes,4,opt,name=table,proto3,oneof"`
}

type ContentItem_ByteItem struct {
	ByteItem *ByteContentItem `protobuf:"bytes,5,opt,name=byte_item,json=byteItem,proto3,oneof"`
}

func (*ContentItem_Value) isContentItem_DataItem() {}

func (*ContentItem_Table) isContentItem_DataItem() {}

func (*ContentItem_ByteItem) isContentItem_DataItem() {}

func (m *ContentItem) GetDataItem() isContentItem_DataItem {
	if m != nil {
		return m.DataItem
	}
	return nil
}

func (m *ContentItem) GetValue() string {
	if x, ok := m.GetDataItem().(*ContentItem_Value); ok {
		return x.Value
	}
	return ""
}

func (m *ContentItem) GetTable() *Table {
	if x, ok := m.GetDataItem().(*ContentItem_Table); ok {
		return x.Table
	}
	return nil
}

func (m *ContentItem) GetByteItem() *ByteContentItem {
	if x, ok := m.GetDataItem().(*ContentItem_ByteItem); ok {
		return x.ByteItem
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ContentItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ContentItem_Value)(nil),
		(*ContentItem_Table)(nil),
		(*ContentItem_ByteItem)(nil),
	}
}

// Structured content to inspect. Up to 50,000 `Value`s per request allowed.
// See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
// learn more.
type Table struct {
	Headers              []*FieldId   `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"`
	Rows                 []*Table_Row `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Table) Reset()         { *m = Table{} }
func (m *Table) String() string { return proto.CompactTextString(m) }
func (*Table) ProtoMessage()    {}
func (*Table) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{7}
}

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

var xxx_messageInfo_Table proto.InternalMessageInfo

func (m *Table) GetHeaders() []*FieldId {
	if m != nil {
		return m.Headers
	}
	return nil
}

func (m *Table) GetRows() []*Table_Row {
	if m != nil {
		return m.Rows
	}
	return nil
}

type Table_Row struct {
	Values               []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Table_Row proto.InternalMessageInfo

func (m *Table_Row) GetValues() []*Value {
	if m != nil {
		return m.Values
	}
	return nil
}

// All the findings for a single scanned item.
type InspectResult struct {
	// List of findings for an item.
	Findings []*Finding `protobuf:"bytes,1,rep,name=findings,proto3" json:"findings,omitempty"`
	// If true, then this item might have more findings than were returned,
	// and the findings returned are an arbitrary subset of all findings.
	// The findings list might be truncated because the input items were too
	// large, or because the server reached the maximum amount of resources
	// allowed for a single API call. For best results, divide the input into
	// smaller batches.
	FindingsTruncated    bool     `protobuf:"varint,2,opt,name=findings_truncated,json=findingsTruncated,proto3" json:"findings_truncated,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InspectResult) Reset()         { *m = InspectResult{} }
func (m *InspectResult) String() string { return proto.CompactTextString(m) }
func (*InspectResult) ProtoMessage()    {}
func (*InspectResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{8}
}

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

var xxx_messageInfo_InspectResult proto.InternalMessageInfo

func (m *InspectResult) GetFindings() []*Finding {
	if m != nil {
		return m.Findings
	}
	return nil
}

func (m *InspectResult) GetFindingsTruncated() bool {
	if m != nil {
		return m.FindingsTruncated
	}
	return false
}

// Represents a piece of potentially sensitive content.
type Finding struct {
	// The content that was found. Even if the content is not textual, it
	// may be converted to a textual representation here.
	// Provided if `include_quote` is true and the finding is
	// less than or equal to 4096 bytes long. If the finding exceeds 4096 bytes
	// in length, the quote may be omitted.
	Quote string `protobuf:"bytes,1,opt,name=quote,proto3" json:"quote,omitempty"`
	// The type of content that might have been found.
	// Provided if `excluded_types` is false.
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Confidence of how likely it is that the `info_type` is correct.
	Likelihood Likelihood `protobuf:"varint,3,opt,name=likelihood,proto3,enum=google.privacy.dlp.v2.Likelihood" json:"likelihood,omitempty"`
	// Where the content was found.
	Location *Location `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
	// Timestamp when finding was detected.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Contains data parsed from quotes. Only populated if include_quote was set
	// to true and a supported infoType was requested. Currently supported
	// infoTypes: DATE, DATE_OF_BIRTH and TIME.
	QuoteInfo            *QuoteInfo `protobuf:"bytes,7,opt,name=quote_info,json=quoteInfo,proto3" json:"quote_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Finding) Reset()         { *m = Finding{} }
func (m *Finding) String() string { return proto.CompactTextString(m) }
func (*Finding) ProtoMessage()    {}
func (*Finding) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{9}
}

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

var xxx_messageInfo_Finding proto.InternalMessageInfo

func (m *Finding) GetQuote() string {
	if m != nil {
		return m.Quote
	}
	return ""
}

func (m *Finding) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *Finding) GetLikelihood() Likelihood {
	if m != nil {
		return m.Likelihood
	}
	return Likelihood_LIKELIHOOD_UNSPECIFIED
}

func (m *Finding) GetLocation() *Location {
	if m != nil {
		return m.Location
	}
	return nil
}

func (m *Finding) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Finding) GetQuoteInfo() *QuoteInfo {
	if m != nil {
		return m.QuoteInfo
	}
	return nil
}

// Specifies the location of the finding.
type Location struct {
	// Zero-based byte offsets delimiting the finding.
	// These are relative to the finding's containing element.
	// Note that when the content is not textual, this references
	// the UTF-8 encoded textual representation of the content.
	// Omitted if content is an image.
	ByteRange *Range `protobuf:"bytes,1,opt,name=byte_range,json=byteRange,proto3" json:"byte_range,omitempty"`
	// Unicode character offsets delimiting the finding.
	// These are relative to the finding's containing element.
	// Provided when the content is text.
	CodepointRange *Range `protobuf:"bytes,2,opt,name=codepoint_range,json=codepointRange,proto3" json:"codepoint_range,omitempty"`
	// List of nested objects pointing to the precise location of the finding
	// within the file or record.
	ContentLocations     []*ContentLocation `protobuf:"bytes,7,rep,name=content_locations,json=contentLocations,proto3" json:"content_locations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *Location) Reset()         { *m = Location{} }
func (m *Location) String() string { return proto.CompactTextString(m) }
func (*Location) ProtoMessage()    {}
func (*Location) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{10}
}

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

var xxx_messageInfo_Location proto.InternalMessageInfo

func (m *Location) GetByteRange() *Range {
	if m != nil {
		return m.ByteRange
	}
	return nil
}

func (m *Location) GetCodepointRange() *Range {
	if m != nil {
		return m.CodepointRange
	}
	return nil
}

func (m *Location) GetContentLocations() []*ContentLocation {
	if m != nil {
		return m.ContentLocations
	}
	return nil
}

// Findings container location data.
type ContentLocation struct {
	// Name of the container where the finding is located.
	// The top level name is the source file name or table name. Names of some
	// common storage containers are formatted as follows:
	//
	// * BigQuery tables:  `<project_id>:<dataset_id>.<table_id>`
	// * Cloud Storage files: `gs://<bucket>/<path>`
	// * Datastore namespace: <namespace>
	//
	// Nested names could be absent if the embedded object has no string
	// identifier (for an example an image contained within a document).
	ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"`
	// Type of the container within the file with location of the finding.
	//
	// Types that are valid to be assigned to Location:
	//	*ContentLocation_RecordLocation
	//	*ContentLocation_ImageLocation
	//	*ContentLocation_DocumentLocation
	Location isContentLocation_Location `protobuf_oneof:"location"`
	// Findings container modification timestamp, if applicable.
	// For Google Cloud Storage contains last file modification timestamp.
	// For BigQuery table contains last_modified_time property.
	// For Datastore - not populated.
	ContainerTimestamp *timestamp.Timestamp `protobuf:"bytes,6,opt,name=container_timestamp,json=containerTimestamp,proto3" json:"container_timestamp,omitempty"`
	// Findings container version, if available
	// ("generation" for Google Cloud Storage).
	ContainerVersion     string   `protobuf:"bytes,7,opt,name=container_version,json=containerVersion,proto3" json:"container_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ContentLocation) Reset()         { *m = ContentLocation{} }
func (m *ContentLocation) String() string { return proto.CompactTextString(m) }
func (*ContentLocation) ProtoMessage()    {}
func (*ContentLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{11}
}

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

var xxx_messageInfo_ContentLocation proto.InternalMessageInfo

func (m *ContentLocation) GetContainerName() string {
	if m != nil {
		return m.ContainerName
	}
	return ""
}

type isContentLocation_Location interface {
	isContentLocation_Location()
}

type ContentLocation_RecordLocation struct {
	RecordLocation *RecordLocation `protobuf:"bytes,2,opt,name=record_location,json=recordLocation,proto3,oneof"`
}

type ContentLocation_ImageLocation struct {
	ImageLocation *ImageLocation `protobuf:"bytes,3,opt,name=image_location,json=imageLocation,proto3,oneof"`
}

type ContentLocation_DocumentLocation struct {
	DocumentLocation *DocumentLocation `protobuf:"bytes,5,opt,name=document_location,json=documentLocation,proto3,oneof"`
}

func (*ContentLocation_RecordLocation) isContentLocation_Location() {}

func (*ContentLocation_ImageLocation) isContentLocation_Location() {}

func (*ContentLocation_DocumentLocation) isContentLocation_Location() {}

func (m *ContentLocation) GetLocation() isContentLocation_Location {
	if m != nil {
		return m.Location
	}
	return nil
}

func (m *ContentLocation) GetRecordLocation() *RecordLocation {
	if x, ok := m.GetLocation().(*ContentLocation_RecordLocation); ok {
		return x.RecordLocation
	}
	return nil
}

func (m *ContentLocation) GetImageLocation() *ImageLocation {
	if x, ok := m.GetLocation().(*ContentLocation_ImageLocation); ok {
		return x.ImageLocation
	}
	return nil
}

func (m *ContentLocation) GetDocumentLocation() *DocumentLocation {
	if x, ok := m.GetLocation().(*ContentLocation_DocumentLocation); ok {
		return x.DocumentLocation
	}
	return nil
}

func (m *ContentLocation) GetContainerTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.ContainerTimestamp
	}
	return nil
}

func (m *ContentLocation) GetContainerVersion() string {
	if m != nil {
		return m.ContainerVersion
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ContentLocation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ContentLocation_RecordLocation)(nil),
		(*ContentLocation_ImageLocation)(nil),
		(*ContentLocation_DocumentLocation)(nil),
	}
}

// Location of a finding within a document.
type DocumentLocation struct {
	// Offset of the line, from the beginning of the file, where the finding
	// is located.
	FileOffset           int64    `protobuf:"varint,1,opt,name=file_offset,json=fileOffset,proto3" json:"file_offset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DocumentLocation) Reset()         { *m = DocumentLocation{} }
func (m *DocumentLocation) String() string { return proto.CompactTextString(m) }
func (*DocumentLocation) ProtoMessage()    {}
func (*DocumentLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{12}
}

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

var xxx_messageInfo_DocumentLocation proto.InternalMessageInfo

func (m *DocumentLocation) GetFileOffset() int64 {
	if m != nil {
		return m.FileOffset
	}
	return 0
}

// Location of a finding within a row or record.
type RecordLocation struct {
	// Key of the finding.
	RecordKey *RecordKey `protobuf:"bytes,1,opt,name=record_key,json=recordKey,proto3" json:"record_key,omitempty"`
	// Field id of the field containing the finding.
	FieldId *FieldId `protobuf:"bytes,2,opt,name=field_id,json=fieldId,proto3" json:"field_id,omitempty"`
	// Location within a `ContentItem.Table`.
	TableLocation        *TableLocation `protobuf:"bytes,3,opt,name=table_location,json=tableLocation,proto3" json:"table_location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *RecordLocation) Reset()         { *m = RecordLocation{} }
func (m *RecordLocation) String() string { return proto.CompactTextString(m) }
func (*RecordLocation) ProtoMessage()    {}
func (*RecordLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{13}
}

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

var xxx_messageInfo_RecordLocation proto.InternalMessageInfo

func (m *RecordLocation) GetRecordKey() *RecordKey {
	if m != nil {
		return m.RecordKey
	}
	return nil
}

func (m *RecordLocation) GetFieldId() *FieldId {
	if m != nil {
		return m.FieldId
	}
	return nil
}

func (m *RecordLocation) GetTableLocation() *TableLocation {
	if m != nil {
		return m.TableLocation
	}
	return nil
}

// Location of a finding within a table.
type TableLocation struct {
	// The zero-based index of the row where the finding is located.
	RowIndex             int64    `protobuf:"varint,1,opt,name=row_index,json=rowIndex,proto3" json:"row_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TableLocation) Reset()         { *m = TableLocation{} }
func (m *TableLocation) String() string { return proto.CompactTextString(m) }
func (*TableLocation) ProtoMessage()    {}
func (*TableLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{14}
}

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

var xxx_messageInfo_TableLocation proto.InternalMessageInfo

func (m *TableLocation) GetRowIndex() int64 {
	if m != nil {
		return m.RowIndex
	}
	return 0
}

// Generic half-open interval [start, end)
type Range struct {
	// Index of the first character of the range (inclusive).
	Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
	// Index of the last character of the range (exclusive).
	End                  int64    `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Range) Reset()         { *m = Range{} }
func (m *Range) String() string { return proto.CompactTextString(m) }
func (*Range) ProtoMessage()    {}
func (*Range) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{15}
}

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

var xxx_messageInfo_Range proto.InternalMessageInfo

func (m *Range) GetStart() int64 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *Range) GetEnd() int64 {
	if m != nil {
		return m.End
	}
	return 0
}

// Location of the finding within an image.
type ImageLocation struct {
	// Bounding boxes locating the pixels within the image containing the finding.
	BoundingBoxes        []*BoundingBox `protobuf:"bytes,1,rep,name=bounding_boxes,json=boundingBoxes,proto3" json:"bounding_boxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *ImageLocation) Reset()         { *m = ImageLocation{} }
func (m *ImageLocation) String() string { return proto.CompactTextString(m) }
func (*ImageLocation) ProtoMessage()    {}
func (*ImageLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{16}
}

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

var xxx_messageInfo_ImageLocation proto.InternalMessageInfo

func (m *ImageLocation) GetBoundingBoxes() []*BoundingBox {
	if m != nil {
		return m.BoundingBoxes
	}
	return nil
}

// Bounding box encompassing detected text within an image.
type BoundingBox struct {
	// Top coordinate of the bounding box. (0,0) is upper left.
	Top int32 `protobuf:"varint,1,opt,name=top,proto3" json:"top,omitempty"`
	// Left coordinate of the bounding box. (0,0) is upper left.
	Left int32 `protobuf:"varint,2,opt,name=left,proto3" json:"left,omitempty"`
	// Width of the bounding box in pixels.
	Width int32 `protobuf:"varint,3,opt,name=width,proto3" json:"width,omitempty"`
	// Height of the bounding box in pixels.
	Height               int32    `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BoundingBox) Reset()         { *m = BoundingBox{} }
func (m *BoundingBox) String() string { return proto.CompactTextString(m) }
func (*BoundingBox) ProtoMessage()    {}
func (*BoundingBox) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{17}
}

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

var xxx_messageInfo_BoundingBox proto.InternalMessageInfo

func (m *BoundingBox) GetTop() int32 {
	if m != nil {
		return m.Top
	}
	return 0
}

func (m *BoundingBox) GetLeft() int32 {
	if m != nil {
		return m.Left
	}
	return 0
}

func (m *BoundingBox) GetWidth() int32 {
	if m != nil {
		return m.Width
	}
	return 0
}

func (m *BoundingBox) GetHeight() int32 {
	if m != nil {
		return m.Height
	}
	return 0
}

// Request to search for potentially sensitive info in an image and redact it
// by covering it with a colored rectangle.
type RedactImageRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the inspector.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The configuration for specifying what content to redact from images.
	ImageRedactionConfigs []*RedactImageRequest_ImageRedactionConfig `protobuf:"bytes,5,rep,name=image_redaction_configs,json=imageRedactionConfigs,proto3" json:"image_redaction_configs,omitempty"`
	// Whether the response should include findings along with the redacted
	// image.
	IncludeFindings bool `protobuf:"varint,6,opt,name=include_findings,json=includeFindings,proto3" json:"include_findings,omitempty"`
	// The content must be PNG, JPEG, SVG or BMP.
	ByteItem             *ByteContentItem `protobuf:"bytes,7,opt,name=byte_item,json=byteItem,proto3" json:"byte_item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *RedactImageRequest) Reset()         { *m = RedactImageRequest{} }
func (m *RedactImageRequest) String() string { return proto.CompactTextString(m) }
func (*RedactImageRequest) ProtoMessage()    {}
func (*RedactImageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{18}
}

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

var xxx_messageInfo_RedactImageRequest proto.InternalMessageInfo

func (m *RedactImageRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *RedactImageRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *RedactImageRequest) GetImageRedactionConfigs() []*RedactImageRequest_ImageRedactionConfig {
	if m != nil {
		return m.ImageRedactionConfigs
	}
	return nil
}

func (m *RedactImageRequest) GetIncludeFindings() bool {
	if m != nil {
		return m.IncludeFindings
	}
	return false
}

func (m *RedactImageRequest) GetByteItem() *ByteContentItem {
	if m != nil {
		return m.ByteItem
	}
	return nil
}

// Configuration for determining how redaction of images should occur.
type RedactImageRequest_ImageRedactionConfig struct {
	// Type of information to redact from images.
	//
	// Types that are valid to be assigned to Target:
	//	*RedactImageRequest_ImageRedactionConfig_InfoType
	//	*RedactImageRequest_ImageRedactionConfig_RedactAllText
	Target isRedactImageRequest_ImageRedactionConfig_Target `protobuf_oneof:"target"`
	// The color to use when redacting content from an image. If not specified,
	// the default is black.
	RedactionColor       *Color   `protobuf:"bytes,3,opt,name=redaction_color,json=redactionColor,proto3" json:"redaction_color,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RedactImageRequest_ImageRedactionConfig proto.InternalMessageInfo

type isRedactImageRequest_ImageRedactionConfig_Target interface {
	isRedactImageRequest_ImageRedactionConfig_Target()
}

type RedactImageRequest_ImageRedactionConfig_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3,oneof"`
}

type RedactImageRequest_ImageRedactionConfig_RedactAllText struct {
	RedactAllText bool `protobuf:"varint,2,opt,name=redact_all_text,json=redactAllText,proto3,oneof"`
}

func (*RedactImageRequest_ImageRedactionConfig_InfoType) isRedactImageRequest_ImageRedactionConfig_Target() {
}

func (*RedactImageRequest_ImageRedactionConfig_RedactAllText) isRedactImageRequest_ImageRedactionConfig_Target() {
}

func (m *RedactImageRequest_ImageRedactionConfig) GetTarget() isRedactImageRequest_ImageRedactionConfig_Target {
	if m != nil {
		return m.Target
	}
	return nil
}

func (m *RedactImageRequest_ImageRedactionConfig) GetInfoType() *InfoType {
	if x, ok := m.GetTarget().(*RedactImageRequest_ImageRedactionConfig_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *RedactImageRequest_ImageRedactionConfig) GetRedactAllText() bool {
	if x, ok := m.GetTarget().(*RedactImageRequest_ImageRedactionConfig_RedactAllText); ok {
		return x.RedactAllText
	}
	return false
}

func (m *RedactImageRequest_ImageRedactionConfig) GetRedactionColor() *Color {
	if m != nil {
		return m.RedactionColor
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RedactImageRequest_ImageRedactionConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RedactImageRequest_ImageRedactionConfig_InfoType)(nil),
		(*RedactImageRequest_ImageRedactionConfig_RedactAllText)(nil),
	}
}

// Represents a color in the RGB color space.
type Color struct {
	// The amount of red in the color as a value in the interval [0, 1].
	Red float32 `protobuf:"fixed32,1,opt,name=red,proto3" json:"red,omitempty"`
	// The amount of green in the color as a value in the interval [0, 1].
	Green float32 `protobuf:"fixed32,2,opt,name=green,proto3" json:"green,omitempty"`
	// The amount of blue in the color as a value in the interval [0, 1].
	Blue                 float32  `protobuf:"fixed32,3,opt,name=blue,proto3" json:"blue,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Color) Reset()         { *m = Color{} }
func (m *Color) String() string { return proto.CompactTextString(m) }
func (*Color) ProtoMessage()    {}
func (*Color) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{19}
}

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

var xxx_messageInfo_Color proto.InternalMessageInfo

func (m *Color) GetRed() float32 {
	if m != nil {
		return m.Red
	}
	return 0
}

func (m *Color) GetGreen() float32 {
	if m != nil {
		return m.Green
	}
	return 0
}

func (m *Color) GetBlue() float32 {
	if m != nil {
		return m.Blue
	}
	return 0
}

// Results of redacting an image.
type RedactImageResponse struct {
	// The redacted image. The type will be the same as the original image.
	RedactedImage []byte `protobuf:"bytes,1,opt,name=redacted_image,json=redactedImage,proto3" json:"redacted_image,omitempty"`
	// If an image was being inspected and the InspectConfig's include_quote was
	// set to true, then this field will include all text, if any, that was found
	// in the image.
	ExtractedText string `protobuf:"bytes,2,opt,name=extracted_text,json=extractedText,proto3" json:"extracted_text,omitempty"`
	// The findings. Populated when include_findings in the request is true.
	InspectResult        *InspectResult `protobuf:"bytes,3,opt,name=inspect_result,json=inspectResult,proto3" json:"inspect_result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *RedactImageResponse) Reset()         { *m = RedactImageResponse{} }
func (m *RedactImageResponse) String() string { return proto.CompactTextString(m) }
func (*RedactImageResponse) ProtoMessage()    {}
func (*RedactImageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{20}
}

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

var xxx_messageInfo_RedactImageResponse proto.InternalMessageInfo

func (m *RedactImageResponse) GetRedactedImage() []byte {
	if m != nil {
		return m.RedactedImage
	}
	return nil
}

func (m *RedactImageResponse) GetExtractedText() string {
	if m != nil {
		return m.ExtractedText
	}
	return ""
}

func (m *RedactImageResponse) GetInspectResult() *InspectResult {
	if m != nil {
		return m.InspectResult
	}
	return nil
}

// Request to de-identify a list of items.
type DeidentifyContentRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the de-identification of the content item.
	// Items specified here will override the template referenced by the
	// deidentify_template_name argument.
	DeidentifyConfig *DeidentifyConfig `protobuf:"bytes,2,opt,name=deidentify_config,json=deidentifyConfig,proto3" json:"deidentify_config,omitempty"`
	// Configuration for the inspector.
	// Items specified here will override the template referenced by the
	// inspect_template_name argument.
	InspectConfig *InspectConfig `protobuf:"bytes,3,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to de-identify. Will be treated as text.
	Item *ContentItem `protobuf:"bytes,4,opt,name=item,proto3" json:"item,omitempty"`
	// Optional template to use. Any configuration directly specified in
	// inspect_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName string `protobuf:"bytes,5,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Optional template to use. Any configuration directly specified in
	// deidentify_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	DeidentifyTemplateName string   `protobuf:"bytes,6,opt,name=deidentify_template_name,json=deidentifyTemplateName,proto3" json:"deidentify_template_name,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

func (m *DeidentifyContentRequest) Reset()         { *m = DeidentifyContentRequest{} }
func (m *DeidentifyContentRequest) String() string { return proto.CompactTextString(m) }
func (*DeidentifyContentRequest) ProtoMessage()    {}
func (*DeidentifyContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{21}
}

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

var xxx_messageInfo_DeidentifyContentRequest proto.InternalMessageInfo

func (m *DeidentifyContentRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *DeidentifyContentRequest) GetDeidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.DeidentifyConfig
	}
	return nil
}

func (m *DeidentifyContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *DeidentifyContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *DeidentifyContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *DeidentifyContentRequest) GetDeidentifyTemplateName() string {
	if m != nil {
		return m.DeidentifyTemplateName
	}
	return ""
}

// Results of de-identifying a ContentItem.
type DeidentifyContentResponse struct {
	// The de-identified item.
	Item *ContentItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// An overview of the changes that were made on the `item`.
	Overview             *TransformationOverview `protobuf:"bytes,2,opt,name=overview,proto3" json:"overview,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *DeidentifyContentResponse) Reset()         { *m = DeidentifyContentResponse{} }
func (m *DeidentifyContentResponse) String() string { return proto.CompactTextString(m) }
func (*DeidentifyContentResponse) ProtoMessage()    {}
func (*DeidentifyContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{22}
}

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

var xxx_messageInfo_DeidentifyContentResponse proto.InternalMessageInfo

func (m *DeidentifyContentResponse) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *DeidentifyContentResponse) GetOverview() *TransformationOverview {
	if m != nil {
		return m.Overview
	}
	return nil
}

// Request to re-identify an item.
type ReidentifyContentRequest struct {
	// The parent resource name.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the re-identification of the content item.
	// This field shares the same proto message type that is used for
	// de-identification, however its usage here is for the reversal of the
	// previous de-identification. Re-identification is performed by examining
	// the transformations used to de-identify the items and executing the
	// reverse. This requires that only reversible transformations
	// be provided here. The reversible transformations are:
	//
	//  - `CryptoReplaceFfxFpeConfig`
	ReidentifyConfig *DeidentifyConfig `protobuf:"bytes,2,opt,name=reidentify_config,json=reidentifyConfig,proto3" json:"reidentify_config,omitempty"`
	// Configuration for the inspector.
	InspectConfig *InspectConfig `protobuf:"bytes,3,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to re-identify. Will be treated as text.
	Item *ContentItem `protobuf:"bytes,4,opt,name=item,proto3" json:"item,omitempty"`
	// Optional template to use. Any configuration directly specified in
	// `inspect_config` will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName string `protobuf:"bytes,5,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Optional template to use. References an instance of `DeidentifyTemplate`.
	// Any configuration directly specified in `reidentify_config` or
	// `inspect_config` will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	ReidentifyTemplateName string   `protobuf:"bytes,6,opt,name=reidentify_template_name,json=reidentifyTemplateName,proto3" json:"reidentify_template_name,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

func (m *ReidentifyContentRequest) Reset()         { *m = ReidentifyContentRequest{} }
func (m *ReidentifyContentRequest) String() string { return proto.CompactTextString(m) }
func (*ReidentifyContentRequest) ProtoMessage()    {}
func (*ReidentifyContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{23}
}

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

var xxx_messageInfo_ReidentifyContentRequest proto.InternalMessageInfo

func (m *ReidentifyContentRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ReidentifyContentRequest) GetReidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.ReidentifyConfig
	}
	return nil
}

func (m *ReidentifyContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *ReidentifyContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *ReidentifyContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *ReidentifyContentRequest) GetReidentifyTemplateName() string {
	if m != nil {
		return m.ReidentifyTemplateName
	}
	return ""
}

// Results of re-identifying a item.
type ReidentifyContentResponse struct {
	// The re-identified item.
	Item *ContentItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// An overview of the changes that were made to the `item`.
	Overview             *TransformationOverview `protobuf:"bytes,2,opt,name=overview,proto3" json:"overview,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *ReidentifyContentResponse) Reset()         { *m = ReidentifyContentResponse{} }
func (m *ReidentifyContentResponse) String() string { return proto.CompactTextString(m) }
func (*ReidentifyContentResponse) ProtoMessage()    {}
func (*ReidentifyContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{24}
}

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

var xxx_messageInfo_ReidentifyContentResponse proto.InternalMessageInfo

func (m *ReidentifyContentResponse) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *ReidentifyContentResponse) GetOverview() *TransformationOverview {
	if m != nil {
		return m.Overview
	}
	return nil
}

// Request to search for potentially sensitive info in a ContentItem.
type InspectContentRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the inspector. What specified here will override
	// the template referenced by the inspect_template_name argument.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to inspect.
	Item *ContentItem `protobuf:"bytes,3,opt,name=item,proto3" json:"item,omitempty"`
	// Optional template to use. Any configuration directly specified in
	// inspect_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName  string   `protobuf:"bytes,4,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InspectContentRequest) Reset()         { *m = InspectContentRequest{} }
func (m *InspectContentRequest) String() string { return proto.CompactTextString(m) }
func (*InspectContentRequest) ProtoMessage()    {}
func (*InspectContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{25}
}

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

var xxx_messageInfo_InspectContentRequest proto.InternalMessageInfo

func (m *InspectContentRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *InspectContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *InspectContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *InspectContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

// Results of inspecting an item.
type InspectContentResponse struct {
	// The findings.
	Result               *InspectResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *InspectContentResponse) Reset()         { *m = InspectContentResponse{} }
func (m *InspectContentResponse) String() string { return proto.CompactTextString(m) }
func (*InspectContentResponse) ProtoMessage()    {}
func (*InspectContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{26}
}

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

var xxx_messageInfo_InspectContentResponse proto.InternalMessageInfo

func (m *InspectContentResponse) GetResult() *InspectResult {
	if m != nil {
		return m.Result
	}
	return nil
}

// Cloud repository for storing output.
type OutputStorageConfig struct {
	// Types that are valid to be assigned to Type:
	//	*OutputStorageConfig_Table
	Type isOutputStorageConfig_Type `protobuf_oneof:"type"`
	// Schema used for writing the findings for Inspect jobs. This field is only
	// used for Inspect and must be unspecified for Risk jobs. Columns are derived
	// from the `Finding` object. If appending to an existing table, any columns
	// from the predefined schema that are missing will be added. No columns in
	// the existing table will be deleted.
	//
	// If unspecified, then all available columns will be used for a new table or
	// an (existing) table with no schema, and no changes will be made to an
	// existing table that has a schema.
	OutputSchema         OutputStorageConfig_OutputSchema `protobuf:"varint,3,opt,name=output_schema,json=outputSchema,proto3,enum=google.privacy.dlp.v2.OutputStorageConfig_OutputSchema" json:"output_schema,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *OutputStorageConfig) Reset()         { *m = OutputStorageConfig{} }
func (m *OutputStorageConfig) String() string { return proto.CompactTextString(m) }
func (*OutputStorageConfig) ProtoMessage()    {}
func (*OutputStorageConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{27}
}

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

var xxx_messageInfo_OutputStorageConfig proto.InternalMessageInfo

type isOutputStorageConfig_Type interface {
	isOutputStorageConfig_Type()
}

type OutputStorageConfig_Table struct {
	Table *BigQueryTable `protobuf:"bytes,1,opt,name=table,proto3,oneof"`
}

func (*OutputStorageConfig_Table) isOutputStorageConfig_Type() {}

func (m *OutputStorageConfig) GetType() isOutputStorageConfig_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *OutputStorageConfig) GetTable() *BigQueryTable {
	if x, ok := m.GetType().(*OutputStorageConfig_Table); ok {
		return x.Table
	}
	return nil
}

func (m *OutputStorageConfig) GetOutputSchema() OutputStorageConfig_OutputSchema {
	if m != nil {
		return m.OutputSchema
	}
	return OutputStorageConfig_OUTPUT_SCHEMA_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OutputStorageConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OutputStorageConfig_Table)(nil),
	}
}

// Statistics regarding a specific InfoType.
type InfoTypeStats struct {
	// The type of finding this stat is for.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Number of findings for this infoType.
	Count                int64    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InfoTypeStats) Reset()         { *m = InfoTypeStats{} }
func (m *InfoTypeStats) String() string { return proto.CompactTextString(m) }
func (*InfoTypeStats) ProtoMessage()    {}
func (*InfoTypeStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{28}
}

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

var xxx_messageInfo_InfoTypeStats proto.InternalMessageInfo

func (m *InfoTypeStats) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *InfoTypeStats) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

// The results of an inspect DataSource job.
type InspectDataSourceDetails struct {
	// The configuration used for this job.
	RequestedOptions *InspectDataSourceDetails_RequestedOptions `protobuf:"bytes,2,opt,name=requested_options,json=requestedOptions,proto3" json:"requested_options,omitempty"`
	// A summary of the outcome of this inspect job.
	Result               *InspectDataSourceDetails_Result `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *InspectDataSourceDetails) Reset()         { *m = InspectDataSourceDetails{} }
func (m *InspectDataSourceDetails) String() string { return proto.CompactTextString(m) }
func (*InspectDataSourceDetails) ProtoMessage()    {}
func (*InspectDataSourceDetails) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{29}
}

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

var xxx_messageInfo_InspectDataSourceDetails proto.InternalMessageInfo

func (m *InspectDataSourceDetails) GetRequestedOptions() *InspectDataSourceDetails_RequestedOptions {
	if m != nil {
		return m.RequestedOptions
	}
	return nil
}

func (m *InspectDataSourceDetails) GetResult() *InspectDataSourceDetails_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

type InspectDataSourceDetails_RequestedOptions struct {
	// If run with an InspectTemplate, a snapshot of its state at the time of
	// this run.
	SnapshotInspectTemplate *InspectTemplate  `protobuf:"bytes,1,opt,name=snapshot_inspect_template,json=snapshotInspectTemplate,proto3" json:"snapshot_inspect_template,omitempty"`
	JobConfig               *InspectJobConfig `protobuf:"bytes,3,opt,name=job_config,json=jobConfig,proto3" json:"job_config,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}          `json:"-"`
	XXX_unrecognized        []byte            `json:"-"`
	XXX_sizecache           int32             `json:"-"`
}

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

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

var xxx_messageInfo_InspectDataSourceDetails_RequestedOptions proto.InternalMessageInfo

func (m *InspectDataSourceDetails_RequestedOptions) GetSnapshotInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.SnapshotInspectTemplate
	}
	return nil
}

func (m *InspectDataSourceDetails_RequestedOptions) GetJobConfig() *InspectJobConfig {
	if m != nil {
		return m.JobConfig
	}
	return nil
}

// All result fields mentioned below are updated while the job is processing.
type InspectDataSourceDetails_Result struct {
	// Total size in bytes that were processed.
	ProcessedBytes int64 `protobuf:"varint,1,opt,name=processed_bytes,json=processedBytes,proto3" json:"processed_bytes,omitempty"`
	// Estimate of the number of bytes to process.
	TotalEstimatedBytes int64 `protobuf:"varint,2,opt,name=total_estimated_bytes,json=totalEstimatedBytes,proto3" json:"total_estimated_bytes,omitempty"`
	// Statistics of how many instances of each info type were found during
	// inspect job.
	InfoTypeStats        []*InfoTypeStats `protobuf:"bytes,3,rep,name=info_type_stats,json=infoTypeStats,proto3" json:"info_type_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_InspectDataSourceDetails_Result proto.InternalMessageInfo

func (m *InspectDataSourceDetails_Result) GetProcessedBytes() int64 {
	if m != nil {
		return m.ProcessedBytes
	}
	return 0
}

func (m *InspectDataSourceDetails_Result) GetTotalEstimatedBytes() int64 {
	if m != nil {
		return m.TotalEstimatedBytes
	}
	return 0
}

func (m *InspectDataSourceDetails_Result) GetInfoTypeStats() []*InfoTypeStats {
	if m != nil {
		return m.InfoTypeStats
	}
	return nil
}

// InfoType description.
type InfoTypeDescription struct {
	// Internal name of the infoType.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Human readable form of the infoType name.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Which parts of the API supports this InfoType.
	SupportedBy []InfoTypeSupportedBy `protobuf:"varint,3,rep,packed,name=supported_by,json=supportedBy,proto3,enum=google.privacy.dlp.v2.InfoTypeSupportedBy" json:"supported_by,omitempty"`
	// Description of the infotype. Translated when language is provided in the
	// request.
	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InfoTypeDescription) Reset()         { *m = InfoTypeDescription{} }
func (m *InfoTypeDescription) String() string { return proto.CompactTextString(m) }
func (*InfoTypeDescription) ProtoMessage()    {}
func (*InfoTypeDescription) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{30}
}

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

var xxx_messageInfo_InfoTypeDescription proto.InternalMessageInfo

func (m *InfoTypeDescription) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *InfoTypeDescription) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *InfoTypeDescription) GetSupportedBy() []InfoTypeSupportedBy {
	if m != nil {
		return m.SupportedBy
	}
	return nil
}

func (m *InfoTypeDescription) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

// Request for the list of infoTypes.
type ListInfoTypesRequest struct {
	// Optional BCP-47 language code for localized infoType friendly
	// names. If omitted, or if localized strings are not available,
	// en-US strings will be returned.
	LanguageCode string `protobuf:"bytes,1,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional filter to only return infoTypes supported by certain parts of the
	// API. Defaults to supported_by=INSPECT.
	Filter               string   `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListInfoTypesRequest) Reset()         { *m = ListInfoTypesRequest{} }
func (m *ListInfoTypesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInfoTypesRequest) ProtoMessage()    {}
func (*ListInfoTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{31}
}

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

var xxx_messageInfo_ListInfoTypesRequest proto.InternalMessageInfo

func (m *ListInfoTypesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *ListInfoTypesRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

// Response to the ListInfoTypes request.
type ListInfoTypesResponse struct {
	// Set of sensitive infoTypes.
	InfoTypes            []*InfoTypeDescription `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ListInfoTypesResponse) Reset()         { *m = ListInfoTypesResponse{} }
func (m *ListInfoTypesResponse) String() string { return proto.CompactTextString(m) }
func (*ListInfoTypesResponse) ProtoMessage()    {}
func (*ListInfoTypesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{32}
}

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

var xxx_messageInfo_ListInfoTypesResponse proto.InternalMessageInfo

func (m *ListInfoTypesResponse) GetInfoTypes() []*InfoTypeDescription {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

// Configuration for a risk analysis job. See
// https://cloud.google.com/dlp/docs/concepts-risk-analysis to learn more.
type RiskAnalysisJobConfig struct {
	// Privacy metric to compute.
	PrivacyMetric *PrivacyMetric `protobuf:"bytes,1,opt,name=privacy_metric,json=privacyMetric,proto3" json:"privacy_metric,omitempty"`
	// Input dataset to compute metrics over.
	SourceTable *BigQueryTable `protobuf:"bytes,2,opt,name=source_table,json=sourceTable,proto3" json:"source_table,omitempty"`
	// Actions to execute at the completion of the job. Are executed in the order
	// provided.
	Actions              []*Action `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *RiskAnalysisJobConfig) Reset()         { *m = RiskAnalysisJobConfig{} }
func (m *RiskAnalysisJobConfig) String() string { return proto.CompactTextString(m) }
func (*RiskAnalysisJobConfig) ProtoMessage()    {}
func (*RiskAnalysisJobConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{33}
}

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

var xxx_messageInfo_RiskAnalysisJobConfig proto.InternalMessageInfo

func (m *RiskAnalysisJobConfig) GetPrivacyMetric() *PrivacyMetric {
	if m != nil {
		return m.PrivacyMetric
	}
	return nil
}

func (m *RiskAnalysisJobConfig) GetSourceTable() *BigQueryTable {
	if m != nil {
		return m.SourceTable
	}
	return nil
}

func (m *RiskAnalysisJobConfig) GetActions() []*Action {
	if m != nil {
		return m.Actions
	}
	return nil
}

// A column with a semantic tag attached.
type QuasiId struct {
	// Identifies the column. [required]
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Semantic tag that identifies what a column contains, to determine which
	// statistical model to use to estimate the reidentifiability of each
	// value. [required]
	//
	// Types that are valid to be assigned to Tag:
	//	*QuasiId_InfoType
	//	*QuasiId_CustomTag
	//	*QuasiId_Inferred
	Tag                  isQuasiId_Tag `protobuf_oneof:"tag"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *QuasiId) Reset()         { *m = QuasiId{} }
func (m *QuasiId) String() string { return proto.CompactTextString(m) }
func (*QuasiId) ProtoMessage()    {}
func (*QuasiId) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{34}
}

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

var xxx_messageInfo_QuasiId proto.InternalMessageInfo

func (m *QuasiId) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

type isQuasiId_Tag interface {
	isQuasiId_Tag()
}

type QuasiId_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3,oneof"`
}

type QuasiId_CustomTag struct {
	CustomTag string `protobuf:"bytes,3,opt,name=custom_tag,json=customTag,proto3,oneof"`
}

type QuasiId_Inferred struct {
	Inferred *empty.Empty `protobuf:"bytes,4,opt,name=inferred,proto3,oneof"`
}

func (*QuasiId_InfoType) isQuasiId_Tag() {}

func (*QuasiId_CustomTag) isQuasiId_Tag() {}

func (*QuasiId_Inferred) isQuasiId_Tag() {}

func (m *QuasiId) GetTag() isQuasiId_Tag {
	if m != nil {
		return m.Tag
	}
	return nil
}

func (m *QuasiId) GetInfoType() *InfoType {
	if x, ok := m.GetTag().(*QuasiId_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *QuasiId) GetCustomTag() string {
	if x, ok := m.GetTag().(*QuasiId_CustomTag); ok {
		return x.CustomTag
	}
	return ""
}

func (m *QuasiId) GetInferred() *empty.Empty {
	if x, ok := m.GetTag().(*QuasiId_Inferred); ok {
		return x.Inferred
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*QuasiId) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*QuasiId_InfoType)(nil),
		(*QuasiId_CustomTag)(nil),
		(*QuasiId_Inferred)(nil),
	}
}

// An auxiliary table containing statistical information on the relative
// frequency of different quasi-identifiers values. It has one or several
// quasi-identifiers columns, and one column that indicates the relative
// frequency of each quasi-identifier tuple.
// If a tuple is present in the data but not in the auxiliary table, the
// corresponding relative frequency is assumed to be zero (and thus, the
// tuple is highly reidentifiable).
type StatisticalTable struct {
	// Auxiliary table location. [required]
	Table *BigQueryTable `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"`
	// Quasi-identifier columns. [required]
	QuasiIds []*StatisticalTable_QuasiIdentifierField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// The relative frequency column must contain a floating-point number
	// between 0 and 1 (inclusive). Null values are assumed to be zero.
	// [required]
	RelativeFrequency    *FieldId `protobuf:"bytes,2,opt,name=relative_frequency,json=relativeFrequency,proto3" json:"relative_frequency,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StatisticalTable) Reset()         { *m = StatisticalTable{} }
func (m *StatisticalTable) String() string { return proto.CompactTextString(m) }
func (*StatisticalTable) ProtoMessage()    {}
func (*StatisticalTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{35}
}

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

var xxx_messageInfo_StatisticalTable proto.InternalMessageInfo

func (m *StatisticalTable) GetTable() *BigQueryTable {
	if m != nil {
		return m.Table
	}
	return nil
}

func (m *StatisticalTable) GetQuasiIds() []*StatisticalTable_QuasiIdentifierField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *StatisticalTable) GetRelativeFrequency() *FieldId {
	if m != nil {
		return m.RelativeFrequency
	}
	return nil
}

// A quasi-identifier column has a custom_tag, used to know which column
// in the data corresponds to which column in the statistical model.
type StatisticalTable_QuasiIdentifierField struct {
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	CustomTag            string   `protobuf:"bytes,2,opt,name=custom_tag,json=customTag,proto3" json:"custom_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_StatisticalTable_QuasiIdentifierField proto.InternalMessageInfo

func (m *StatisticalTable_QuasiIdentifierField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *StatisticalTable_QuasiIdentifierField) GetCustomTag() string {
	if m != nil {
		return m.CustomTag
	}
	return ""
}

// Privacy metric to compute for reidentification risk analysis.
type PrivacyMetric struct {
	// Types that are valid to be assigned to Type:
	//	*PrivacyMetric_NumericalStatsConfig_
	//	*PrivacyMetric_CategoricalStatsConfig_
	//	*PrivacyMetric_KAnonymityConfig_
	//	*PrivacyMetric_LDiversityConfig_
	//	*PrivacyMetric_KMapEstimationConfig_
	//	*PrivacyMetric_DeltaPresenceEstimationConfig_
	Type                 isPrivacyMetric_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *PrivacyMetric) Reset()         { *m = PrivacyMetric{} }
func (m *PrivacyMetric) String() string { return proto.CompactTextString(m) }
func (*PrivacyMetric) ProtoMessage()    {}
func (*PrivacyMetric) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36}
}

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

var xxx_messageInfo_PrivacyMetric proto.InternalMessageInfo

type isPrivacyMetric_Type interface {
	isPrivacyMetric_Type()
}

type PrivacyMetric_NumericalStatsConfig_ struct {
	NumericalStatsConfig *PrivacyMetric_NumericalStatsConfig `protobuf:"bytes,1,opt,name=numerical_stats_config,json=numericalStatsConfig,proto3,oneof"`
}

type PrivacyMetric_CategoricalStatsConfig_ struct {
	CategoricalStatsConfig *PrivacyMetric_CategoricalStatsConfig `protobuf:"bytes,2,opt,name=categorical_stats_config,json=categoricalStatsConfig,proto3,oneof"`
}

type PrivacyMetric_KAnonymityConfig_ struct {
	KAnonymityConfig *PrivacyMetric_KAnonymityConfig `protobuf:"bytes,3,opt,name=k_anonymity_config,json=kAnonymityConfig,proto3,oneof"`
}

type PrivacyMetric_LDiversityConfig_ struct {
	LDiversityConfig *PrivacyMetric_LDiversityConfig `protobuf:"bytes,4,opt,name=l_diversity_config,json=lDiversityConfig,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_ struct {
	KMapEstimationConfig *PrivacyMetric_KMapEstimationConfig `protobuf:"bytes,5,opt,name=k_map_estimation_config,json=kMapEstimationConfig,proto3,oneof"`
}

type PrivacyMetric_DeltaPresenceEstimationConfig_ struct {
	DeltaPresenceEstimationConfig *PrivacyMetric_DeltaPresenceEstimationConfig `protobuf:"bytes,6,opt,name=delta_presence_estimation_config,json=deltaPresenceEstimationConfig,proto3,oneof"`
}

func (*PrivacyMetric_NumericalStatsConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_CategoricalStatsConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_KAnonymityConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_LDiversityConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_KMapEstimationConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_DeltaPresenceEstimationConfig_) isPrivacyMetric_Type() {}

func (m *PrivacyMetric) GetType() isPrivacyMetric_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *PrivacyMetric) GetNumericalStatsConfig() *PrivacyMetric_NumericalStatsConfig {
	if x, ok := m.GetType().(*PrivacyMetric_NumericalStatsConfig_); ok {
		return x.NumericalStatsConfig
	}
	return nil
}

func (m *PrivacyMetric) GetCategoricalStatsConfig() *PrivacyMetric_CategoricalStatsConfig {
	if x, ok := m.GetType().(*PrivacyMetric_CategoricalStatsConfig_); ok {
		return x.CategoricalStatsConfig
	}
	return nil
}

func (m *PrivacyMetric) GetKAnonymityConfig() *PrivacyMetric_KAnonymityConfig {
	if x, ok := m.GetType().(*PrivacyMetric_KAnonymityConfig_); ok {
		return x.KAnonymityConfig
	}
	return nil
}

func (m *PrivacyMetric) GetLDiversityConfig() *PrivacyMetric_LDiversityConfig {
	if x, ok := m.GetType().(*PrivacyMetric_LDiversityConfig_); ok {
		return x.LDiversityConfig
	}
	return nil
}

func (m *PrivacyMetric) GetKMapEstimationConfig() *PrivacyMetric_KMapEstimationConfig {
	if x, ok := m.GetType().(*PrivacyMetric_KMapEstimationConfig_); ok {
		return x.KMapEstimationConfig
	}
	return nil
}

func (m *PrivacyMetric) GetDeltaPresenceEstimationConfig() *PrivacyMetric_DeltaPresenceEstimationConfig {
	if x, ok := m.GetType().(*PrivacyMetric_DeltaPresenceEstimationConfig_); ok {
		return x.DeltaPresenceEstimationConfig
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrivacyMetric) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrivacyMetric_NumericalStatsConfig_)(nil),
		(*PrivacyMetric_CategoricalStatsConfig_)(nil),
		(*PrivacyMetric_KAnonymityConfig_)(nil),
		(*PrivacyMetric_LDiversityConfig_)(nil),
		(*PrivacyMetric_KMapEstimationConfig_)(nil),
		(*PrivacyMetric_DeltaPresenceEstimationConfig_)(nil),
	}
}

// Compute numerical stats over an individual column, including
// min, max, and quantiles.
type PrivacyMetric_NumericalStatsConfig struct {
	// Field to compute numerical stats on. Supported types are
	// integer, float, date, datetime, timestamp, time.
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_NumericalStatsConfig proto.InternalMessageInfo

func (m *PrivacyMetric_NumericalStatsConfig) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

// Compute numerical stats over an individual column, including
// number of distinct values and value count distribution.
type PrivacyMetric_CategoricalStatsConfig struct {
	// Field to compute categorical stats on. All column types are
	// supported except for arrays and structs. However, it may be more
	// informative to use NumericalStats when the field type is supported,
	// depending on the data.
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_CategoricalStatsConfig proto.InternalMessageInfo

func (m *PrivacyMetric_CategoricalStatsConfig) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

// k-anonymity metric, used for analysis of reidentification risk.
type PrivacyMetric_KAnonymityConfig struct {
	// Set of fields to compute k-anonymity over. When multiple fields are
	// specified, they are considered a single composite key. Structs and
	// repeated data types are not supported; however, nested fields are
	// supported so long as they are not structs themselves or nested within
	// a repeated field.
	QuasiIds []*FieldId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Optional message indicating that multiple rows might be associated to a
	// single individual. If the same entity_id is associated to multiple
	// quasi-identifier tuples over distinct rows, we consider the entire
	// collection of tuples as the composite quasi-identifier. This collection
	// is a multiset: the order in which the different tuples appear in the
	// dataset is ignored, but their frequency is taken into account.
	//
	// Important note: a maximum of 1000 rows can be associated to a single
	// entity ID. If more rows are associated with the same entity ID, some
	// might be ignored.
	EntityId             *EntityId `protobuf:"bytes,2,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_KAnonymityConfig proto.InternalMessageInfo

func (m *PrivacyMetric_KAnonymityConfig) GetQuasiIds() []*FieldId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KAnonymityConfig) GetEntityId() *EntityId {
	if m != nil {
		return m.EntityId
	}
	return nil
}

// l-diversity metric, used for analysis of reidentification risk.
type PrivacyMetric_LDiversityConfig struct {
	// Set of quasi-identifiers indicating how equivalence classes are
	// defined for the l-diversity computation. When multiple fields are
	// specified, they are considered a single composite key.
	QuasiIds []*FieldId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Sensitive field for computing the l-value.
	SensitiveAttribute   *FieldId `protobuf:"bytes,2,opt,name=sensitive_attribute,json=sensitiveAttribute,proto3" json:"sensitive_attribute,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PrivacyMetric_LDiversityConfig) Reset()         { *m = PrivacyMetric_LDiversityConfig{} }
func (m *PrivacyMetric_LDiversityConfig) String() string { return proto.CompactTextString(m) }
func (*PrivacyMetric_LDiversityConfig) ProtoMessage()    {}
func (*PrivacyMetric_LDiversityConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 3}
}

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

var xxx_messageInfo_PrivacyMetric_LDiversityConfig proto.InternalMessageInfo

func (m *PrivacyMetric_LDiversityConfig) GetQuasiIds() []*FieldId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_LDiversityConfig) GetSensitiveAttribute() *FieldId {
	if m != nil {
		return m.SensitiveAttribute
	}
	return nil
}

// Reidentifiability metric. This corresponds to a risk model similar to what
// is called "journalist risk" in the literature, except the attack dataset is
// statistically modeled instead of being perfectly known. This can be done
// using publicly available data (like the US Census), or using a custom
// statistical model (indicated as one or several BigQuery tables), or by
// extrapolating from the distribution of values in the input dataset.
// A column with a semantic tag attached.
type PrivacyMetric_KMapEstimationConfig struct {
	// Fields considered to be quasi-identifiers. No two columns can have the
	// same tag. [required]
	QuasiIds []*PrivacyMetric_KMapEstimationConfig_TaggedField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// ISO 3166-1 alpha-2 region code to use in the statistical modeling.
	// Required if no column is tagged with a region-specific InfoType (like
	// US_ZIP_5) or a region code.
	RegionCode string `protobuf:"bytes,2,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Several auxiliary tables can be used in the analysis. Each custom_tag
	// used to tag a quasi-identifiers column must appear in exactly one column
	// of one auxiliary table.
	AuxiliaryTables      []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable `protobuf:"bytes,3,rep,name=auxiliary_tables,json=auxiliaryTables,proto3" json:"auxiliary_tables,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig) Reset()         { *m = PrivacyMetric_KMapEstimationConfig{} }
func (m *PrivacyMetric_KMapEstimationConfig) String() string { return proto.CompactTextString(m) }
func (*PrivacyMetric_KMapEstimationConfig) ProtoMessage()    {}
func (*PrivacyMetric_KMapEstimationConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig) GetQuasiIds() []*PrivacyMetric_KMapEstimationConfig_TaggedField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig) GetRegionCode() string {
	if m != nil {
		return m.RegionCode
	}
	return ""
}

func (m *PrivacyMetric_KMapEstimationConfig) GetAuxiliaryTables() []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable {
	if m != nil {
		return m.AuxiliaryTables
	}
	return nil
}

type PrivacyMetric_KMapEstimationConfig_TaggedField struct {
	// Identifies the column. [required]
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Semantic tag that identifies what a column contains, to determine which
	// statistical model to use to estimate the reidentifiability of each
	// value. [required]
	//
	// Types that are valid to be assigned to Tag:
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred
	Tag                  isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag `protobuf_oneof:"tag"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) Reset() {
	*m = PrivacyMetric_KMapEstimationConfig_TaggedField{}
}
func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) ProtoMessage() {}
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4, 0}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_TaggedField proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

type isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag interface {
	isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag()
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag struct {
	CustomTag string `protobuf:"bytes,3,opt,name=custom_tag,json=customTag,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred struct {
	Inferred *empty.Empty `protobuf:"bytes,4,opt,name=inferred,proto3,oneof"`
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetTag() isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag {
	if m != nil {
		return m.Tag
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetInfoType() *InfoType {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetCustomTag() string {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag); ok {
		return x.CustomTag
	}
	return ""
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetInferred() *empty.Empty {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred); ok {
		return x.Inferred
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType)(nil),
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag)(nil),
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred)(nil),
	}
}

// An auxiliary table contains statistical information on the relative
// frequency of different quasi-identifiers values. It has one or several
// quasi-identifiers columns, and one column that indicates the relative
// frequency of each quasi-identifier tuple.
// If a tuple is present in the data but not in the auxiliary table, the
// corresponding relative frequency is assumed to be zero (and thus, the
// tuple is highly reidentifiable).
type PrivacyMetric_KMapEstimationConfig_AuxiliaryTable struct {
	// Auxiliary table location. [required]
	Table *BigQueryTable `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"`
	// Quasi-identifier columns. [required]
	QuasiIds []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// The relative frequency column must contain a floating-point number
	// between 0 and 1 (inclusive). Null values are assumed to be zero.
	// [required]
	RelativeFrequency    *FieldId `protobuf:"bytes,2,opt,name=relative_frequency,json=relativeFrequency,proto3" json:"relative_frequency,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) Reset() {
	*m = PrivacyMetric_KMapEstimationConfig_AuxiliaryTable{}
}
func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) ProtoMessage() {}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4, 1}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_AuxiliaryTable proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetTable() *BigQueryTable {
	if m != nil {
		return m.Table
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetQuasiIds() []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetRelativeFrequency() *FieldId {
	if m != nil {
		return m.RelativeFrequency
	}
	return nil
}

// A quasi-identifier column has a custom_tag, used to know which column
// in the data corresponds to which column in the statistical model.
type PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField struct {
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	CustomTag            string   `protobuf:"bytes,2,opt,name=custom_tag,json=customTag,proto3" json:"custom_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) GetCustomTag() string {
	if m != nil {
		return m.CustomTag
	}
	return ""
}

// δ-presence metric, used to estimate how likely it is for an attacker to
// figure out that one given individual appears in a de-identified dataset.
// Similarly to the k-map metric, we cannot compute δ-presence exactly without
// knowing the attack dataset, so we use a statistical model instead.
type PrivacyMetric_DeltaPresenceEstimationConfig struct {
	// Fields considered to be quasi-identifiers. No two fields can have the
	// same tag. [required]
	QuasiIds []*QuasiId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// ISO 3166-1 alpha-2 region code to use in the statistical modeling.
	// Required if no column is tagged with a region-specific InfoType (like
	// US_ZIP_5) or a region code.
	RegionCode string `protobuf:"bytes,2,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Several auxiliary tables can be used in the analysis. Each custom_tag
	// used to tag a quasi-identifiers field must appear in exactly one
	// field of one auxiliary table.
	AuxiliaryTables      []*StatisticalTable `protobuf:"bytes,3,rep,name=auxiliary_tables,json=auxiliaryTables,proto3" json:"auxiliary_tables,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) Reset() {
	*m = PrivacyMetric_DeltaPresenceEstimationConfig{}
}
func (m *PrivacyMetric_DeltaPresenceEstimationConfig) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_DeltaPresenceEstimationConfig) ProtoMessage() {}
func (*PrivacyMetric_DeltaPresenceEstimationConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 5}
}

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

var xxx_messageInfo_PrivacyMetric_DeltaPresenceEstimationConfig proto.InternalMessageInfo

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetQuasiIds() []*QuasiId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetRegionCode() string {
	if m != nil {
		return m.RegionCode
	}
	return ""
}

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetAuxiliaryTables() []*StatisticalTable {
	if m != nil {
		return m.AuxiliaryTables
	}
	return nil
}

// Result of a risk analysis operation request.
type AnalyzeDataSourceRiskDetails struct {
	// Privacy metric to compute.
	RequestedPrivacyMetric *PrivacyMetric `protobuf:"bytes,1,opt,name=requested_privacy_metric,json=requestedPrivacyMetric,proto3" json:"requested_privacy_metric,omitempty"`
	// Input dataset to compute metrics over.
	RequestedSourceTable *BigQueryTable `protobuf:"bytes,2,opt,name=requested_source_table,json=requestedSourceTable,proto3" json:"requested_source_table,omitempty"`
	// Values associated with this metric.
	//
	// Types that are valid to be assigned to Result:
	//	*AnalyzeDataSourceRiskDetails_NumericalStatsResult_
	//	*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_
	//	*AnalyzeDataSourceRiskDetails_KAnonymityResult_
	//	*AnalyzeDataSourceRiskDetails_LDiversityResult_
	//	*AnalyzeDataSourceRiskDetails_KMapEstimationResult_
	//	*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_
	Result               isAnalyzeDataSourceRiskDetails_Result `protobuf_oneof:"result"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails) Reset()         { *m = AnalyzeDataSourceRiskDetails{} }
func (m *AnalyzeDataSourceRiskDetails) String() string { return proto.CompactTextString(m) }
func (*AnalyzeDataSourceRiskDetails) ProtoMessage()    {}
func (*AnalyzeDataSourceRiskDetails) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails) GetRequestedPrivacyMetric() *PrivacyMetric {
	if m != nil {
		return m.RequestedPrivacyMetric
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetRequestedSourceTable() *BigQueryTable {
	if m != nil {
		return m.RequestedSourceTable
	}
	return nil
}

type isAnalyzeDataSourceRiskDetails_Result interface {
	isAnalyzeDataSourceRiskDetails_Result()
}

type AnalyzeDataSourceRiskDetails_NumericalStatsResult_ struct {
	NumericalStatsResult *AnalyzeDataSourceRiskDetails_NumericalStatsResult `protobuf:"bytes,3,opt,name=numerical_stats_result,json=numericalStatsResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_CategoricalStatsResult_ struct {
	CategoricalStatsResult *AnalyzeDataSourceRiskDetails_CategoricalStatsResult `protobuf:"bytes,4,opt,name=categorical_stats_result,json=categoricalStatsResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_KAnonymityResult_ struct {
	KAnonymityResult *AnalyzeDataSourceRiskDetails_KAnonymityResult `protobuf:"bytes,5,opt,name=k_anonymity_result,json=kAnonymityResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_LDiversityResult_ struct {
	LDiversityResult *AnalyzeDataSourceRiskDetails_LDiversityResult `protobuf:"bytes,6,opt,name=l_diversity_result,json=lDiversityResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_KMapEstimationResult_ struct {
	KMapEstimationResult *AnalyzeDataSourceRiskDetails_KMapEstimationResult `protobuf:"bytes,7,opt,name=k_map_estimation_result,json=kMapEstimationResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_ struct {
	DeltaPresenceEstimationResult *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult `protobuf:"bytes,9,opt,name=delta_presence_estimation_result,json=deltaPresenceEstimationResult,proto3,oneof"`
}

func (*AnalyzeDataSourceRiskDetails_NumericalStatsResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_LDiversityResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_) isAnalyzeDataSourceRiskDetails_Result() {
}

func (m *AnalyzeDataSourceRiskDetails) GetResult() isAnalyzeDataSourceRiskDetails_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetNumericalStatsResult() *AnalyzeDataSourceRiskDetails_NumericalStatsResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_NumericalStatsResult_); ok {
		return x.NumericalStatsResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetCategoricalStatsResult() *AnalyzeDataSourceRiskDetails_CategoricalStatsResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_); ok {
		return x.CategoricalStatsResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetKAnonymityResult() *AnalyzeDataSourceRiskDetails_KAnonymityResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_KAnonymityResult_); ok {
		return x.KAnonymityResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetLDiversityResult() *AnalyzeDataSourceRiskDetails_LDiversityResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_LDiversityResult_); ok {
		return x.LDiversityResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetKMapEstimationResult() *AnalyzeDataSourceRiskDetails_KMapEstimationResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_KMapEstimationResult_); ok {
		return x.KMapEstimationResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetDeltaPresenceEstimationResult() *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_); ok {
		return x.DeltaPresenceEstimationResult
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AnalyzeDataSourceRiskDetails) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AnalyzeDataSourceRiskDetails_NumericalStatsResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_KAnonymityResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_LDiversityResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_KMapEstimationResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_)(nil),
	}
}

// Result of the numerical stats computation.
type AnalyzeDataSourceRiskDetails_NumericalStatsResult struct {
	// Minimum value appearing in the column.
	MinValue *Value `protobuf:"bytes,1,opt,name=min_value,json=minValue,proto3" json:"min_value,omitempty"`
	// Maximum value appearing in the column.
	MaxValue *Value `protobuf:"bytes,2,opt,name=max_value,json=maxValue,proto3" json:"max_value,omitempty"`
	// List of 99 values that partition the set of field values into 100 equal
	// sized buckets.
	QuantileValues       []*Value `protobuf:"bytes,4,rep,name=quantile_values,json=quantileValues,proto3" json:"quantile_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_NumericalStatsResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetMinValue() *Value {
	if m != nil {
		return m.MinValue
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetMaxValue() *Value {
	if m != nil {
		return m.MaxValue
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetQuantileValues() []*Value {
	if m != nil {
		return m.QuantileValues
	}
	return nil
}

// Result of the categorical stats computation.
type AnalyzeDataSourceRiskDetails_CategoricalStatsResult struct {
	// Histogram of value frequencies in the column.
	ValueFrequencyHistogramBuckets []*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket `protobuf:"bytes,5,rep,name=value_frequency_histogram_buckets,json=valueFrequencyHistogramBuckets,proto3" json:"value_frequency_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral           struct{}                                                                               `json:"-"`
	XXX_unrecognized               []byte                                                                                 `json:"-"`
	XXX_sizecache                  int32                                                                                  `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_CategoricalStatsResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult) GetValueFrequencyHistogramBuckets() []*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket {
	if m != nil {
		return m.ValueFrequencyHistogramBuckets
	}
	return nil
}

type AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket struct {
	// Lower bound on the value frequency of the values in this bucket.
	ValueFrequencyLowerBound int64 `protobuf:"varint,1,opt,name=value_frequency_lower_bound,json=valueFrequencyLowerBound,proto3" json:"value_frequency_lower_bound,omitempty"`
	// Upper bound on the value frequency of the values in this bucket.
	ValueFrequencyUpperBound int64 `protobuf:"varint,2,opt,name=value_frequency_upper_bound,json=valueFrequencyUpperBound,proto3" json:"value_frequency_upper_bound,omitempty"`
	// Total number of values in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of value frequencies in this bucket. The total number of
	// values returned per bucket is capped at 20.
	BucketValues []*ValueFrequency `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetValueFrequencyLowerBound() int64 {
	if m != nil {
		return m.ValueFrequencyLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetValueFrequencyUpperBound() int64 {
	if m != nil {
		return m.ValueFrequencyUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketValues() []*ValueFrequency {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the k-anonymity computation.
type AnalyzeDataSourceRiskDetails_KAnonymityResult struct {
	// Histogram of k-anonymity equivalence classes.
	EquivalenceClassHistogramBuckets []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket `protobuf:"bytes,5,rep,name=equivalence_class_histogram_buckets,json=equivalenceClassHistogramBuckets,proto3" json:"equivalence_class_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral             struct{}                                                                   `json:"-"`
	XXX_unrecognized                 []byte                                                                     `json:"-"`
	XXX_sizecache                    int32                                                                      `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult) GetEquivalenceClassHistogramBuckets() []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket {
	if m != nil {
		return m.EquivalenceClassHistogramBuckets
	}
	return nil
}

// The set of columns' values that share the same ldiversity value
type AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass struct {
	// Set of values defining the equivalence class. One value per
	// quasi-identifier column in the original KAnonymity metric message.
	// The order is always the same as the original request.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// Size of the equivalence class, for example number of rows with the
	// above set of values.
	EquivalenceClassSize int64    `protobuf:"varint,2,opt,name=equivalence_class_size,json=equivalenceClassSize,proto3" json:"equivalence_class_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass{}
}
func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 2, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) GetEquivalenceClassSize() int64 {
	if m != nil {
		return m.EquivalenceClassSize
	}
	return 0
}

type AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket struct {
	// Lower bound on the size of the equivalence classes in this bucket.
	EquivalenceClassSizeLowerBound int64 `protobuf:"varint,1,opt,name=equivalence_class_size_lower_bound,json=equivalenceClassSizeLowerBound,proto3" json:"equivalence_class_size_lower_bound,omitempty"`
	// Upper bound on the size of the equivalence classes in this bucket.
	EquivalenceClassSizeUpperBound int64 `protobuf:"varint,2,opt,name=equivalence_class_size_upper_bound,json=equivalenceClassSizeUpperBound,proto3" json:"equivalence_class_size_upper_bound,omitempty"`
	// Total number of equivalence classes in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of equivalence classes in this bucket. The total number of
	// classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct equivalence classes in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 2, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetEquivalenceClassSizeLowerBound() int64 {
	if m != nil {
		return m.EquivalenceClassSizeLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetEquivalenceClassSizeUpperBound() int64 {
	if m != nil {
		return m.EquivalenceClassSizeUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the l-diversity computation.
type AnalyzeDataSourceRiskDetails_LDiversityResult struct {
	// Histogram of l-diversity equivalence class sensitive value frequencies.
	SensitiveValueFrequencyHistogramBuckets []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket `protobuf:"bytes,5,rep,name=sensitive_value_frequency_histogram_buckets,json=sensitiveValueFrequencyHistogramBuckets,proto3" json:"sensitive_value_frequency_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral                    struct{}                                                                   `json:"-"`
	XXX_unrecognized                        []byte                                                                     `json:"-"`
	XXX_sizecache                           int32                                                                      `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult) Reset() {
	*m = AnalyzeDataSourceRiskDetails_LDiversityResult{}
}
func (m *AnalyzeDataSourceRiskDetails_LDiversityResult) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 3}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult) GetSensitiveValueFrequencyHistogramBuckets() []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket {
	if m != nil {
		return m.SensitiveValueFrequencyHistogramBuckets
	}
	return nil
}

// The set of columns' values that share the same ldiversity value.
type AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass struct {
	// Quasi-identifier values defining the k-anonymity equivalence
	// class. The order is always the same as the original request.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// Size of the k-anonymity equivalence class.
	EquivalenceClassSize int64 `protobuf:"varint,2,opt,name=equivalence_class_size,json=equivalenceClassSize,proto3" json:"equivalence_class_size,omitempty"`
	// Number of distinct sensitive values in this equivalence class.
	NumDistinctSensitiveValues int64 `protobuf:"varint,3,opt,name=num_distinct_sensitive_values,json=numDistinctSensitiveValues,proto3" json:"num_distinct_sensitive_values,omitempty"`
	// Estimated frequencies of top sensitive values.
	TopSensitiveValues   []*ValueFrequency `protobuf:"bytes,4,rep,name=top_sensitive_values,json=topSensitiveValues,proto3" json:"top_sensitive_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) Reset() {
	*m = AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass{}
}
func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 3, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetEquivalenceClassSize() int64 {
	if m != nil {
		return m.EquivalenceClassSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetNumDistinctSensitiveValues() int64 {
	if m != nil {
		return m.NumDistinctSensitiveValues
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetTopSensitiveValues() []*ValueFrequency {
	if m != nil {
		return m.TopSensitiveValues
	}
	return nil
}

type AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket struct {
	// Lower bound on the sensitive value frequencies of the equivalence
	// classes in this bucket.
	SensitiveValueFrequencyLowerBound int64 `protobuf:"varint,1,opt,name=sensitive_value_frequency_lower_bound,json=sensitiveValueFrequencyLowerBound,proto3" json:"sensitive_value_frequency_lower_bound,omitempty"`
	// Upper bound on the sensitive value frequencies of the equivalence
	// classes in this bucket.
	SensitiveValueFrequencyUpperBound int64 `protobuf:"varint,2,opt,name=sensitive_value_frequency_upper_bound,json=sensitiveValueFrequencyUpperBound,proto3" json:"sensitive_value_frequency_upper_bound,omitempty"`
	// Total number of equivalence classes in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of equivalence classes in this bucket. The total number of
	// classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct equivalence classes in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 3, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetSensitiveValueFrequencyLowerBound() int64 {
	if m != nil {
		return m.SensitiveValueFrequencyLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetSensitiveValueFrequencyUpperBound() int64 {
	if m != nil {
		return m.SensitiveValueFrequencyUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the reidentifiability analysis. Note that these results are an
// estimation, not exact values.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult struct {
	// The intervals [min_anonymity, max_anonymity] do not overlap. If a value
	// doesn't correspond to any such interval, the associated frequency is
	// zero. For example, the following records:
	//   {min_anonymity: 1, max_anonymity: 1, frequency: 17}
	//   {min_anonymity: 2, max_anonymity: 3, frequency: 42}
	//   {min_anonymity: 5, max_anonymity: 10, frequency: 99}
	// mean that there are no record with an estimated anonymity of 4, 5, or
	// larger than 10.
	KMapEstimationHistogram []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket `protobuf:"bytes,1,rep,name=k_map_estimation_histogram,json=kMapEstimationHistogram,proto3" json:"k_map_estimation_histogram,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                                                                           `json:"-"`
	XXX_unrecognized        []byte                                                                             `json:"-"`
	XXX_sizecache           int32                                                                              `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KMapEstimationResult{}
}
func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 4}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult) GetKMapEstimationHistogram() []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket {
	if m != nil {
		return m.KMapEstimationHistogram
	}
	return nil
}

// A tuple of values for the quasi-identifier columns.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues struct {
	// The quasi-identifier values.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// The estimated anonymity for these quasi-identifier values.
	EstimatedAnonymity   int64    `protobuf:"varint,2,opt,name=estimated_anonymity,json=estimatedAnonymity,proto3" json:"estimated_anonymity,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues{}
}
func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 4, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) GetEstimatedAnonymity() int64 {
	if m != nil {
		return m.EstimatedAnonymity
	}
	return 0
}

// A KMapEstimationHistogramBucket message with the following values:
//   min_anonymity: 3
//   max_anonymity: 5
//   frequency: 42
// means that there are 42 records whose quasi-identifier values correspond
// to 3, 4 or 5 people in the overlying population. An important particular
// case is when min_anonymity = max_anonymity = 1: the frequency field then
// corresponds to the number of uniquely identifiable records.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket struct {
	// Always positive.
	MinAnonymity int64 `protobuf:"varint,1,opt,name=min_anonymity,json=minAnonymity,proto3" json:"min_anonymity,omitempty"`
	// Always greater than or equal to min_anonymity.
	MaxAnonymity int64 `protobuf:"varint,2,opt,name=max_anonymity,json=maxAnonymity,proto3" json:"max_anonymity,omitempty"`
	// Number of records within these anonymity bounds.
	BucketSize int64 `protobuf:"varint,5,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of quasi-identifier tuple values in this bucket. The total
	// number of classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues `protobuf:"bytes,6,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct quasi-identifier tuple values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,7,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 4, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetMinAnonymity() int64 {
	if m != nil {
		return m.MinAnonymity
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetMaxAnonymity() int64 {
	if m != nil {
		return m.MaxAnonymity
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the δ-presence computation. Note that these results are an
// estimation, not exact values.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult struct {
	// The intervals [min_probability, max_probability) do not overlap. If a
	// value doesn't correspond to any such interval, the associated frequency
	// is zero. For example, the following records:
	//   {min_probability: 0, max_probability: 0.1, frequency: 17}
	//   {min_probability: 0.2, max_probability: 0.3, frequency: 42}
	//   {min_probability: 0.3, max_probability: 0.4, frequency: 99}
	// mean that there are no record with an estimated probability in [0.1, 0.2)
	// nor larger or equal to 0.4.
	DeltaPresenceEstimationHistogram []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket `protobuf:"bytes,1,rep,name=delta_presence_estimation_histogram,json=deltaPresenceEstimationHistogram,proto3" json:"delta_presence_estimation_histogram,omitempty"`
	XXX_NoUnkeyedLiteral             struct{}                                                                                             `json:"-"`
	XXX_unrecognized                 []byte                                                                                               `json:"-"`
	XXX_sizecache                    int32                                                                                                `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) Reset() {
	*m = AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult{}
}
func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 5}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) GetDeltaPresenceEstimationHistogram() []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket {
	if m != nil {
		return m.DeltaPresenceEstimationHistogram
	}
	return nil
}

// A tuple of values for the quasi-identifier columns.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues struct {
	// The quasi-identifier values.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// The estimated probability that a given individual sharing these
	// quasi-identifier values is in the dataset. This value, typically called
	// δ, is the ratio between the number of records in the dataset with these
	// quasi-identifier values, and the total number of individuals (inside
	// *and* outside the dataset) with these quasi-identifier values.
	// For example, if there are 15 individuals in the dataset who share the
	// same quasi-identifier values, and an estimated 100 people in the entire
	// population with these values, then δ is 0.15.
	EstimatedProbability float64  `protobuf:"fixed64,2,opt,name=estimated_probability,json=estimatedProbability,proto3" json:"estimated_probability,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) Reset() {
	*m = AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues{}
}
func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 5, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) GetEstimatedProbability() float64 {
	if m != nil {
		return m.EstimatedProbability
	}
	return 0
}

// A DeltaPresenceEstimationHistogramBucket message with the following
// values:
//   min_probability: 0.1
//   max_probability: 0.2
//   frequency: 42
// means that there are 42 records for which δ is in [0.1, 0.2). An
// important particular case is when min_probability = max_probability = 1:
// then, every individual who shares this quasi-identifier combination is in
// the dataset.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket struct {
	// Between 0 and 1.
	MinProbability float64 `protobuf:"fixed64,1,opt,name=min_probability,json=minProbability,proto3" json:"min_probability,omitempty"`
	// Always greater than or equal to min_probability.
	MaxProbability float64 `protobuf:"fixed64,2,opt,name=max_probability,json=maxProbability,proto3" json:"max_probability,omitempty"`
	// Number of records within these probability bounds.
	BucketSize int64 `protobuf:"varint,5,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of quasi-identifier tuple values in this bucket. The total
	// number of classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues `protobuf:"bytes,6,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct quasi-identifier tuple values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,7,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 5, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetMinProbability() float64 {
	if m != nil {
		return m.MinProbability
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetMaxProbability() float64 {
	if m != nil {
		return m.MaxProbability
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// A value of a field, including its frequency.
type ValueFrequency struct {
	// A value contained in the field in question.
	Value *Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// How many times the value is contained in the field.
	Count                int64    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ValueFrequency) Reset()         { *m = ValueFrequency{} }
func (m *ValueFrequency) String() string { return proto.CompactTextString(m) }
func (*ValueFrequency) ProtoMessage()    {}
func (*ValueFrequency) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{38}
}

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

var xxx_messageInfo_ValueFrequency proto.InternalMessageInfo

func (m *ValueFrequency) GetValue() *Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ValueFrequency) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

// Set of primitive values supported by the system.
// Note that for the purposes of inspection or transformation, the number
// of bytes considered to comprise a 'Value' is based on its representation
// as a UTF-8 encoded string. For example, if 'integer_value' is set to
// 123456789, the number of bytes would be counted as 9, even though an
// int64 only holds up to 8 bytes of data.
type Value struct {
	// Types that are valid to be assigned to Type:
	//	*Value_IntegerValue
	//	*Value_FloatValue
	//	*Value_StringValue
	//	*Value_BooleanValue
	//	*Value_TimestampValue
	//	*Value_TimeValue
	//	*Value_DateValue
	//	*Value_DayOfWeekValue
	Type                 isValue_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Value) Reset()         { *m = Value{} }
func (m *Value) String() string { return proto.CompactTextString(m) }
func (*Value) ProtoMessage()    {}
func (*Value) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{39}
}

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

var xxx_messageInfo_Value proto.InternalMessageInfo

type isValue_Type interface {
	isValue_Type()
}

type Value_IntegerValue struct {
	IntegerValue int64 `protobuf:"varint,1,opt,name=integer_value,json=integerValue,proto3,oneof"`
}

type Value_FloatValue struct {
	FloatValue float64 `protobuf:"fixed64,2,opt,name=float_value,json=floatValue,proto3,oneof"`
}

type Value_StringValue struct {
	StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"`
}

type Value_BooleanValue struct {
	BooleanValue bool `protobuf:"varint,4,opt,name=boolean_value,json=booleanValue,proto3,oneof"`
}

type Value_TimestampValue struct {
	TimestampValue *timestamp.Timestamp `protobuf:"bytes,5,opt,name=timestamp_value,json=timestampValue,proto3,oneof"`
}

type Value_TimeValue struct {
	TimeValue *timeofday.TimeOfDay `protobuf:"bytes,6,opt,name=time_value,json=timeValue,proto3,oneof"`
}

type Value_DateValue struct {
	DateValue *date.Date `protobuf:"bytes,7,opt,name=date_value,json=dateValue,proto3,oneof"`
}

type Value_DayOfWeekValue struct {
	DayOfWeekValue dayofweek.DayOfWeek `protobuf:"varint,8,opt,name=day_of_week_value,json=dayOfWeekValue,proto3,enum=google.type.DayOfWeek,oneof"`
}

func (*Value_IntegerValue) isValue_Type() {}

func (*Value_FloatValue) isValue_Type() {}

func (*Value_StringValue) isValue_Type() {}

func (*Value_BooleanValue) isValue_Type() {}

func (*Value_TimestampValue) isValue_Type() {}

func (*Value_TimeValue) isValue_Type() {}

func (*Value_DateValue) isValue_Type() {}

func (*Value_DayOfWeekValue) isValue_Type() {}

func (m *Value) GetType() isValue_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Value) GetIntegerValue() int64 {
	if x, ok := m.GetType().(*Value_IntegerValue); ok {
		return x.IntegerValue
	}
	return 0
}

func (m *Value) GetFloatValue() float64 {
	if x, ok := m.GetType().(*Value_FloatValue); ok {
		return x.FloatValue
	}
	return 0
}

func (m *Value) GetStringValue() string {
	if x, ok := m.GetType().(*Value_StringValue); ok {
		return x.StringValue
	}
	return ""
}

func (m *Value) GetBooleanValue() bool {
	if x, ok := m.GetType().(*Value_BooleanValue); ok {
		return x.BooleanValue
	}
	return false
}

func (m *Value) GetTimestampValue() *timestamp.Timestamp {
	if x, ok := m.GetType().(*Value_TimestampValue); ok {
		return x.TimestampValue
	}
	return nil
}

func (m *Value) GetTimeValue() *timeofday.TimeOfDay {
	if x, ok := m.GetType().(*Value_TimeValue); ok {
		return x.TimeValue
	}
	return nil
}

func (m *Value) GetDateValue() *date.Date {
	if x, ok := m.GetType().(*Value_DateValue); ok {
		return x.DateValue
	}
	return nil
}

func (m *Value) GetDayOfWeekValue() dayofweek.DayOfWeek {
	if x, ok := m.GetType().(*Value_DayOfWeekValue); ok {
		return x.DayOfWeekValue
	}
	return dayofweek.DayOfWeek_DAY_OF_WEEK_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Value) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Value_IntegerValue)(nil),
		(*Value_FloatValue)(nil),
		(*Value_StringValue)(nil),
		(*Value_BooleanValue)(nil),
		(*Value_TimestampValue)(nil),
		(*Value_TimeValue)(nil),
		(*Value_DateValue)(nil),
		(*Value_DayOfWeekValue)(nil),
	}
}

// Message for infoType-dependent details parsed from quote.
type QuoteInfo struct {
	// Object representation of the quote.
	//
	// Types that are valid to be assigned to ParsedQuote:
	//	*QuoteInfo_DateTime
	ParsedQuote          isQuoteInfo_ParsedQuote `protobuf_oneof:"parsed_quote"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *QuoteInfo) Reset()         { *m = QuoteInfo{} }
func (m *QuoteInfo) String() string { return proto.CompactTextString(m) }
func (*QuoteInfo) ProtoMessage()    {}
func (*QuoteInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{40}
}

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

var xxx_messageInfo_QuoteInfo proto.InternalMessageInfo

type isQuoteInfo_ParsedQuote interface {
	isQuoteInfo_ParsedQuote()
}

type QuoteInfo_DateTime struct {
	DateTime *DateTime `protobuf:"bytes,2,opt,name=date_time,json=dateTime,proto3,oneof"`
}

func (*QuoteInfo_DateTime) isQuoteInfo_ParsedQuote() {}

func (m *QuoteInfo) GetParsedQuote() isQuoteInfo_ParsedQuote {
	if m != nil {
		return m.ParsedQuote
	}
	return nil
}

func (m *QuoteInfo) GetDateTime() *DateTime {
	if x, ok := m.GetParsedQuote().(*QuoteInfo_DateTime); ok {
		return x.DateTime
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*QuoteInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*QuoteInfo_DateTime)(nil),
	}
}

// Message for a date time object.
// e.g. 2018-01-01, 5th August.
type DateTime struct {
	// One or more of the following must be set. All fields are optional, but
	// when set must be valid date or time values.
	Date                 *date.Date           `protobuf:"bytes,1,opt,name=date,proto3" json:"date,omitempty"`
	DayOfWeek            dayofweek.DayOfWeek  `protobuf:"varint,2,opt,name=day_of_week,json=dayOfWeek,proto3,enum=google.type.DayOfWeek" json:"day_of_week,omitempty"`
	Time                 *timeofday.TimeOfDay `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"`
	TimeZone             *DateTime_TimeZone   `protobuf:"bytes,4,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *DateTime) Reset()         { *m = DateTime{} }
func (m *DateTime) String() string { return proto.CompactTextString(m) }
func (*DateTime) ProtoMessage()    {}
func (*DateTime) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{41}
}

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

var xxx_messageInfo_DateTime proto.InternalMessageInfo

func (m *DateTime) GetDate() *date.Date {
	if m != nil {
		return m.Date
	}
	return nil
}

func (m *DateTime) GetDayOfWeek() dayofweek.DayOfWeek {
	if m != nil {
		return m.DayOfWeek
	}
	return dayofweek.DayOfWeek_DAY_OF_WEEK_UNSPECIFIED
}

func (m *DateTime) GetTime() *timeofday.TimeOfDay {
	if m != nil {
		return m.Time
	}
	return nil
}

func (m *DateTime) GetTimeZone() *DateTime_TimeZone {
	if m != nil {
		return m.TimeZone
	}
	return nil
}

type DateTime_TimeZone struct {
	// Set only if the offset can be determined. Positive for time ahead of UTC.
	// E.g. For "UTC-9", this value is -540.
	OffsetMinutes        int32    `protobuf:"varint,1,opt,name=offset_minutes,json=offsetMinutes,proto3" json:"offset_minutes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DateTime_TimeZone proto.InternalMessageInfo

func (m *DateTime_TimeZone) GetOffsetMinutes() int32 {
	if m != nil {
		return m.OffsetMinutes
	}
	return 0
}

// The configuration that controls how the data will change.
type DeidentifyConfig struct {
	// Types that are valid to be assigned to Transformation:
	//	*DeidentifyConfig_InfoTypeTransformations
	//	*DeidentifyConfig_RecordTransformations
	Transformation       isDeidentifyConfig_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *DeidentifyConfig) Reset()         { *m = DeidentifyConfig{} }
func (m *DeidentifyConfig) String() string { return proto.CompactTextString(m) }
func (*DeidentifyConfig) ProtoMessage()    {}
func (*DeidentifyConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{42}
}

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

var xxx_messageInfo_DeidentifyConfig proto.InternalMessageInfo

type isDeidentifyConfig_Transformation interface {
	isDeidentifyConfig_Transformation()
}

type DeidentifyConfig_InfoTypeTransformations struct {
	InfoTypeTransformations *InfoTypeTransformations `protobuf:"bytes,1,opt,name=info_type_transformations,json=infoTypeTransformations,proto3,oneof"`
}

type DeidentifyConfig_RecordTransformations struct {
	RecordTransformations *RecordTransformations `protobuf:"bytes,2,opt,name=record_transformations,json=recordTransformations,proto3,oneof"`
}

func (*DeidentifyConfig_InfoTypeTransformations) isDeidentifyConfig_Transformation() {}

func (*DeidentifyConfig_RecordTransformations) isDeidentifyConfig_Transformation() {}

func (m *DeidentifyConfig) GetTransformation() isDeidentifyConfig_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *DeidentifyConfig) GetInfoTypeTransformations() *InfoTypeTransformations {
	if x, ok := m.GetTransformation().(*DeidentifyConfig_InfoTypeTransformations); ok {
		return x.InfoTypeTransformations
	}
	return nil
}

func (m *DeidentifyConfig) GetRecordTransformations() *RecordTransformations {
	if x, ok := m.GetTransformation().(*DeidentifyConfig_RecordTransformations); ok {
		return x.RecordTransformations
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DeidentifyConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DeidentifyConfig_InfoTypeTransformations)(nil),
		(*DeidentifyConfig_RecordTransformations)(nil),
	}
}

// A rule for transforming a value.
type PrimitiveTransformation struct {
	// Types that are valid to be assigned to Transformation:
	//	*PrimitiveTransformation_ReplaceConfig
	//	*PrimitiveTransformation_RedactConfig
	//	*PrimitiveTransformation_CharacterMaskConfig
	//	*PrimitiveTransformation_CryptoReplaceFfxFpeConfig
	//	*PrimitiveTransformation_FixedSizeBucketingConfig
	//	*PrimitiveTransformation_BucketingConfig
	//	*PrimitiveTransformation_ReplaceWithInfoTypeConfig
	//	*PrimitiveTransformation_TimePartConfig
	//	*PrimitiveTransformation_CryptoHashConfig
	//	*PrimitiveTransformation_DateShiftConfig
	//	*PrimitiveTransformation_CryptoDeterministicConfig
	Transformation       isPrimitiveTransformation_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

func (m *PrimitiveTransformation) Reset()         { *m = PrimitiveTransformation{} }
func (m *PrimitiveTransformation) String() string { return proto.CompactTextString(m) }
func (*PrimitiveTransformation) ProtoMessage()    {}
func (*PrimitiveTransformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{43}
}

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

var xxx_messageInfo_PrimitiveTransformation proto.InternalMessageInfo

type isPrimitiveTransformation_Transformation interface {
	isPrimitiveTransformation_Transformation()
}

type PrimitiveTransformation_ReplaceConfig struct {
	ReplaceConfig *ReplaceValueConfig `protobuf:"bytes,1,opt,name=replace_config,json=replaceConfig,proto3,oneof"`
}

type PrimitiveTransformation_RedactConfig struct {
	RedactConfig *RedactConfig `protobuf:"bytes,2,opt,name=redact_config,json=redactConfig,proto3,oneof"`
}

type PrimitiveTransformation_CharacterMaskConfig struct {
	CharacterMaskConfig *CharacterMaskConfig `protobuf:"bytes,3,opt,name=character_mask_config,json=characterMaskConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoReplaceFfxFpeConfig struct {
	CryptoReplaceFfxFpeConfig *CryptoReplaceFfxFpeConfig `protobuf:"bytes,4,opt,name=crypto_replace_ffx_fpe_config,json=cryptoReplaceFfxFpeConfig,proto3,oneof"`
}

type PrimitiveTransformation_FixedSizeBucketingConfig struct {
	FixedSizeBucketingConfig *FixedSizeBucketingConfig `protobuf:"bytes,5,opt,name=fixed_size_bucketing_config,json=fixedSizeBucketingConfig,proto3,oneof"`
}

type PrimitiveTransformation_BucketingConfig struct {
	BucketingConfig *BucketingConfig `protobuf:"bytes,6,opt,name=bucketing_config,json=bucketingConfig,proto3,oneof"`
}

type PrimitiveTransformation_ReplaceWithInfoTypeConfig struct {
	ReplaceWithInfoTypeConfig *ReplaceWithInfoTypeConfig `protobuf:"bytes,7,opt,name=replace_with_info_type_config,json=replaceWithInfoTypeConfig,proto3,oneof"`
}

type PrimitiveTransformation_TimePartConfig struct {
	TimePartConfig *TimePartConfig `protobuf:"bytes,8,opt,name=time_part_config,json=timePartConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoHashConfig struct {
	CryptoHashConfig *CryptoHashConfig `protobuf:"bytes,9,opt,name=crypto_hash_config,json=cryptoHashConfig,proto3,oneof"`
}

type PrimitiveTransformation_DateShiftConfig struct {
	DateShiftConfig *DateShiftConfig `protobuf:"bytes,11,opt,name=date_shift_config,json=dateShiftConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoDeterministicConfig struct {
	CryptoDeterministicConfig *CryptoDeterministicConfig `protobuf:"bytes,12,opt,name=crypto_deterministic_config,json=cryptoDeterministicConfig,proto3,oneof"`
}

func (*PrimitiveTransformation_ReplaceConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_RedactConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CharacterMaskConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoReplaceFfxFpeConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_FixedSizeBucketingConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_BucketingConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_ReplaceWithInfoTypeConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_TimePartConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoHashConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_DateShiftConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoDeterministicConfig) isPrimitiveTransformation_Transformation() {}

func (m *PrimitiveTransformation) GetTransformation() isPrimitiveTransformation_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *PrimitiveTransformation) GetReplaceConfig() *ReplaceValueConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_ReplaceConfig); ok {
		return x.ReplaceConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetRedactConfig() *RedactConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_RedactConfig); ok {
		return x.RedactConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCharacterMaskConfig() *CharacterMaskConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CharacterMaskConfig); ok {
		return x.CharacterMaskConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoReplaceFfxFpeConfig() *CryptoReplaceFfxFpeConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoReplaceFfxFpeConfig); ok {
		return x.CryptoReplaceFfxFpeConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetFixedSizeBucketingConfig() *FixedSizeBucketingConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_FixedSizeBucketingConfig); ok {
		return x.FixedSizeBucketingConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetBucketingConfig() *BucketingConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_BucketingConfig); ok {
		return x.BucketingConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetReplaceWithInfoTypeConfig() *ReplaceWithInfoTypeConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_ReplaceWithInfoTypeConfig); ok {
		return x.ReplaceWithInfoTypeConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetTimePartConfig() *TimePartConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_TimePartConfig); ok {
		return x.TimePartConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoHashConfig() *CryptoHashConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoHashConfig); ok {
		return x.CryptoHashConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetDateShiftConfig() *DateShiftConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_DateShiftConfig); ok {
		return x.DateShiftConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoDeterministicConfig() *CryptoDeterministicConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoDeterministicConfig); ok {
		return x.CryptoDeterministicConfig
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrimitiveTransformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrimitiveTransformation_ReplaceConfig)(nil),
		(*PrimitiveTransformation_RedactConfig)(nil),
		(*PrimitiveTransformation_CharacterMaskConfig)(nil),
		(*PrimitiveTransformation_CryptoReplaceFfxFpeConfig)(nil),
		(*PrimitiveTransformation_FixedSizeBucketingConfig)(nil),
		(*PrimitiveTransformation_BucketingConfig)(nil),
		(*PrimitiveTransformation_ReplaceWithInfoTypeConfig)(nil),
		(*PrimitiveTransformation_TimePartConfig)(nil),
		(*PrimitiveTransformation_CryptoHashConfig)(nil),
		(*PrimitiveTransformation_DateShiftConfig)(nil),
		(*PrimitiveTransformation_CryptoDeterministicConfig)(nil),
	}
}

// For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
// portion of the value.
type TimePartConfig struct {
	PartToExtract        TimePartConfig_TimePart `protobuf:"varint,1,opt,name=part_to_extract,json=partToExtract,proto3,enum=google.privacy.dlp.v2.TimePartConfig_TimePart" json:"part_to_extract,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *TimePartConfig) Reset()         { *m = TimePartConfig{} }
func (m *TimePartConfig) String() string { return proto.CompactTextString(m) }
func (*TimePartConfig) ProtoMessage()    {}
func (*TimePartConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{44}
}

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

var xxx_messageInfo_TimePartConfig proto.InternalMessageInfo

func (m *TimePartConfig) GetPartToExtract() TimePartConfig_TimePart {
	if m != nil {
		return m.PartToExtract
	}
	return TimePartConfig_TIME_PART_UNSPECIFIED
}

// Pseudonymization method that generates surrogates via cryptographic hashing.
// Uses SHA-256.
// The key size must be either 32 or 64 bytes.
// Outputs a base64 encoded representation of the hashed output
// (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
// Currently, only string and integer values can be hashed.
// See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
type CryptoHashConfig struct {
	// The key used by the hash function.
	CryptoKey            *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *CryptoHashConfig) Reset()         { *m = CryptoHashConfig{} }
func (m *CryptoHashConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoHashConfig) ProtoMessage()    {}
func (*CryptoHashConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{45}
}

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

var xxx_messageInfo_CryptoHashConfig proto.InternalMessageInfo

func (m *CryptoHashConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

// Pseudonymization method that generates deterministic encryption for the given
// input. Outputs a base64 encoded representation of the encrypted output.
// Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
type CryptoDeterministicConfig struct {
	// The key used by the encryption function.
	CryptoKey *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	// The custom info type to annotate the surrogate with.
	// This annotation will be applied to the surrogate by prefixing it with
	// the name of the custom info type followed by the number of
	// characters comprising the surrogate. The following scheme defines the
	// format: <info type name>(<surrogate character count>):<surrogate>
	//
	// For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
	// the surrogate is 'abc', the full replacement value
	// will be: 'MY_TOKEN_INFO_TYPE(3):abc'
	//
	// This annotation identifies the surrogate when inspecting content using the
	// custom info type 'Surrogate'. This facilitates reversal of the
	// surrogate when it occurs in free text.
	//
	// In order for inspection to work properly, the name of this info type must
	// not occur naturally anywhere in your data; otherwise, inspection may either
	//
	// - reverse a surrogate that does not correspond to an actual identifier
	// - be unable to parse the surrogate and result in an error
	//
	// Therefore, choose your custom info type name carefully after considering
	// what your data looks like. One way to select a name that has a high chance
	// of yielding reliable detection is to include one or more unicode characters
	// that are highly improbable to exist in your data.
	// For example, assuming your data is entered from a regular ASCII keyboard,
	// the symbol with the hex code point 29DD might be used like so:
	// ⧝MY_TOKEN_TYPE
	SurrogateInfoType *InfoType `protobuf:"bytes,2,opt,name=surrogate_info_type,json=surrogateInfoType,proto3" json:"surrogate_info_type,omitempty"`
	// Optional. A context may be used for higher security and maintaining
	// referential integrity such that the same identifier in two different
	// contexts will be given a distinct surrogate. The context is appended to
	// plaintext value being encrypted. On decryption the provided context is
	// validated against the value used during encryption. If a context was
	// provided during encryption, same context must be provided during decryption
	// as well.
	//
	// If the context is not set, plaintext would be used as is for encryption.
	// If the context is set but:
	//
	// 1. there is no record present when transforming a given value or
	// 2. the field is not present when transforming a given value,
	//
	// plaintext would be used as is for encryption.
	//
	// Note that case (1) is expected when an `InfoTypeTransformation` is
	// applied to both structured and non-structured `ContentItem`s.
	Context              *FieldId `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CryptoDeterministicConfig) Reset()         { *m = CryptoDeterministicConfig{} }
func (m *CryptoDeterministicConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoDeterministicConfig) ProtoMessage()    {}
func (*CryptoDeterministicConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{46}
}

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

var xxx_messageInfo_CryptoDeterministicConfig proto.InternalMessageInfo

func (m *CryptoDeterministicConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

func (m *CryptoDeterministicConfig) GetSurrogateInfoType() *InfoType {
	if m != nil {
		return m.SurrogateInfoType
	}
	return nil
}

func (m *CryptoDeterministicConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

// Replace each input value with a given `Value`.
type ReplaceValueConfig struct {
	// Value to replace it with.
	NewValue             *Value   `protobuf:"bytes,1,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ReplaceValueConfig) Reset()         { *m = ReplaceValueConfig{} }
func (m *ReplaceValueConfig) String() string { return proto.CompactTextString(m) }
func (*ReplaceValueConfig) ProtoMessage()    {}
func (*ReplaceValueConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{47}
}

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

var xxx_messageInfo_ReplaceValueConfig proto.InternalMessageInfo

func (m *ReplaceValueConfig) GetNewValue() *Value {
	if m != nil {
		return m.NewValue
	}
	return nil
}

// Replace each matching finding with the name of the info_type.
type ReplaceWithInfoTypeConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ReplaceWithInfoTypeConfig) Reset()         { *m = ReplaceWithInfoTypeConfig{} }
func (m *ReplaceWithInfoTypeConfig) String() string { return proto.CompactTextString(m) }
func (*ReplaceWithInfoTypeConfig) ProtoMessage()    {}
func (*ReplaceWithInfoTypeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{48}
}

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

var xxx_messageInfo_ReplaceWithInfoTypeConfig proto.InternalMessageInfo

// Redact a given value. For example, if used with an `InfoTypeTransformation`
// transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
// output would be 'My phone number is '.
type RedactConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RedactConfig) Reset()         { *m = RedactConfig{} }
func (m *RedactConfig) String() string { return proto.CompactTextString(m) }
func (*RedactConfig) ProtoMessage()    {}
func (*RedactConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{49}
}

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

var xxx_messageInfo_RedactConfig proto.InternalMessageInfo

// Characters to skip when doing deidentification of a value. These will be left
// alone and skipped.
type CharsToIgnore struct {
	// Types that are valid to be assigned to Characters:
	//	*CharsToIgnore_CharactersToSkip
	//	*CharsToIgnore_CommonCharactersToIgnore
	Characters           isCharsToIgnore_Characters `protobuf_oneof:"characters"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *CharsToIgnore) Reset()         { *m = CharsToIgnore{} }
func (m *CharsToIgnore) String() string { return proto.CompactTextString(m) }
func (*CharsToIgnore) ProtoMessage()    {}
func (*CharsToIgnore) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{50}
}

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

var xxx_messageInfo_CharsToIgnore proto.InternalMessageInfo

type isCharsToIgnore_Characters interface {
	isCharsToIgnore_Characters()
}

type CharsToIgnore_CharactersToSkip struct {
	CharactersToSkip string `protobuf:"bytes,1,opt,name=characters_to_skip,json=charactersToSkip,proto3,oneof"`
}

type CharsToIgnore_CommonCharactersToIgnore struct {
	CommonCharactersToIgnore CharsToIgnore_CommonCharsToIgnore `protobuf:"varint,2,opt,name=common_characters_to_ignore,json=commonCharactersToIgnore,proto3,enum=google.privacy.dlp.v2.CharsToIgnore_CommonCharsToIgnore,oneof"`
}

func (*CharsToIgnore_CharactersToSkip) isCharsToIgnore_Characters() {}

func (*CharsToIgnore_CommonCharactersToIgnore) isCharsToIgnore_Characters() {}

func (m *CharsToIgnore) GetCharacters() isCharsToIgnore_Characters {
	if m != nil {
		return m.Characters
	}
	return nil
}

func (m *CharsToIgnore) GetCharactersToSkip() string {
	if x, ok := m.GetCharacters().(*CharsToIgnore_CharactersToSkip); ok {
		return x.CharactersToSkip
	}
	return ""
}

func (m *CharsToIgnore) GetCommonCharactersToIgnore() CharsToIgnore_CommonCharsToIgnore {
	if x, ok := m.GetCharacters().(*CharsToIgnore_CommonCharactersToIgnore); ok {
		return x.CommonCharactersToIgnore
	}
	return CharsToIgnore_COMMON_CHARS_TO_IGNORE_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CharsToIgnore) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CharsToIgnore_CharactersToSkip)(nil),
		(*CharsToIgnore_CommonCharactersToIgnore)(nil),
	}
}

// Partially mask a string by replacing a given number of characters with a
// fixed character. Masking can start from the beginning or end of the string.
// This can be used on data of any type (numbers, longs, and so on) and when
// de-identifying structured data we'll attempt to preserve the original data's
// type. (This allows you to take a long like 123 and modify it to a string like
// **3.
type CharacterMaskConfig struct {
	// Character to mask the sensitive values&mdash;for example, "*" for an
	// alphabetic string such as name, or "0" for a numeric string such as ZIP
	// code or credit card number. String must have length 1. If not supplied, we
	// will default to "*" for strings, 0 for digits.
	MaskingCharacter string `protobuf:"bytes,1,opt,name=masking_character,json=maskingCharacter,proto3" json:"masking_character,omitempty"`
	// Number of characters to mask. If not set, all matching chars will be
	// masked. Skipped characters do not count towards this tally.
	NumberToMask int32 `protobuf:"varint,2,opt,name=number_to_mask,json=numberToMask,proto3" json:"number_to_mask,omitempty"`
	// Mask characters in reverse order. For example, if `masking_character` is
	// '0', number_to_mask is 14, and `reverse_order` is false, then
	// 1234-5678-9012-3456 -> 00000000000000-3456
	// If `masking_character` is '*', `number_to_mask` is 3, and `reverse_order`
	// is true, then 12345 -> 12***
	ReverseOrder bool `protobuf:"varint,3,opt,name=reverse_order,json=reverseOrder,proto3" json:"reverse_order,omitempty"`
	// When masking a string, items in this list will be skipped when replacing.
	// For example, if your string is 555-555-5555 and you ask us to skip `-` and
	// mask 5 chars with * we would produce ***-*55-5555.
	CharactersToIgnore   []*CharsToIgnore `protobuf:"bytes,4,rep,name=characters_to_ignore,json=charactersToIgnore,proto3" json:"characters_to_ignore,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *CharacterMaskConfig) Reset()         { *m = CharacterMaskConfig{} }
func (m *CharacterMaskConfig) String() string { return proto.CompactTextString(m) }
func (*CharacterMaskConfig) ProtoMessage()    {}
func (*CharacterMaskConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{51}
}

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

var xxx_messageInfo_CharacterMaskConfig proto.InternalMessageInfo

func (m *CharacterMaskConfig) GetMaskingCharacter() string {
	if m != nil {
		return m.MaskingCharacter
	}
	return ""
}

func (m *CharacterMaskConfig) GetNumberToMask() int32 {
	if m != nil {
		return m.NumberToMask
	}
	return 0
}

func (m *CharacterMaskConfig) GetReverseOrder() bool {
	if m != nil {
		return m.ReverseOrder
	}
	return false
}

func (m *CharacterMaskConfig) GetCharactersToIgnore() []*CharsToIgnore {
	if m != nil {
		return m.CharactersToIgnore
	}
	return nil
}

// Buckets values based on fixed size ranges. The
// Bucketing transformation can provide all of this functionality,
// but requires more configuration. This message is provided as a convenience to
// the user for simple bucketing strategies.
//
// The transformed value will be a hyphenated string of
// <lower_bound>-<upper_bound>, i.e if lower_bound = 10 and upper_bound = 20
// all values that are within this bucket will be replaced with "10-20".
//
// This can be used on data of type: double, long.
//
// If the bound Value type differs from the type of data
// being transformed, we will first attempt converting the type of the data to
// be transformed to match the type of the bound before comparing.
//
// See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
type FixedSizeBucketingConfig struct {
	// Lower bound value of buckets. All values less than `lower_bound` are
	// grouped together into a single bucket; for example if `lower_bound` = 10,
	// then all values less than 10 are replaced with the value “-10”. [Required].
	LowerBound *Value `protobuf:"bytes,1,opt,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty"`
	// Upper bound value of buckets. All values greater than upper_bound are
	// grouped together into a single bucket; for example if `upper_bound` = 89,
	// then all values greater than 89 are replaced with the value “89+”.
	// [Required].
	UpperBound *Value `protobuf:"bytes,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"`
	// Size of each bucket (except for minimum and maximum buckets). So if
	// `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
	// following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
	// 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works. [Required].
	BucketSize           float64  `protobuf:"fixed64,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FixedSizeBucketingConfig) Reset()         { *m = FixedSizeBucketingConfig{} }
func (m *FixedSizeBucketingConfig) String() string { return proto.CompactTextString(m) }
func (*FixedSizeBucketingConfig) ProtoMessage()    {}
func (*FixedSizeBucketingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{52}
}

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

var xxx_messageInfo_FixedSizeBucketingConfig proto.InternalMessageInfo

func (m *FixedSizeBucketingConfig) GetLowerBound() *Value {
	if m != nil {
		return m.LowerBound
	}
	return nil
}

func (m *FixedSizeBucketingConfig) GetUpperBound() *Value {
	if m != nil {
		return m.UpperBound
	}
	return nil
}

func (m *FixedSizeBucketingConfig) GetBucketSize() float64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

// Generalization function that buckets values based on ranges. The ranges and
// replacement values are dynamically provided by the user for custom behavior,
// such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
// This can be used on
// data of type: number, long, string, timestamp.
// If the bound `Value` type differs from the type of data being transformed, we
// will first attempt converting the type of the data to be transformed to match
// the type of the bound before comparing.
// See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
type BucketingConfig struct {
	// Set of buckets. Ranges must be non-overlapping.
	Buckets              []*BucketingConfig_Bucket `protobuf:"bytes,1,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *BucketingConfig) Reset()         { *m = BucketingConfig{} }
func (m *BucketingConfig) String() string { return proto.CompactTextString(m) }
func (*BucketingConfig) ProtoMessage()    {}
func (*BucketingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{53}
}

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

var xxx_messageInfo_BucketingConfig proto.InternalMessageInfo

func (m *BucketingConfig) GetBuckets() []*BucketingConfig_Bucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

// Bucket is represented as a range, along with replacement values.
type BucketingConfig_Bucket struct {
	// Lower bound of the range, inclusive. Type should be the same as max if
	// used.
	Min *Value `protobuf:"bytes,1,opt,name=min,proto3" json:"min,omitempty"`
	// Upper bound of the range, exclusive; type must match min.
	Max *Value `protobuf:"bytes,2,opt,name=max,proto3" json:"max,omitempty"`
	// Replacement value for this bucket. If not provided
	// the default behavior will be to hyphenate the min-max range.
	ReplacementValue     *Value   `protobuf:"bytes,3,opt,name=replacement_value,json=replacementValue,proto3" json:"replacement_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BucketingConfig_Bucket proto.InternalMessageInfo

func (m *BucketingConfig_Bucket) GetMin() *Value {
	if m != nil {
		return m.Min
	}
	return nil
}

func (m *BucketingConfig_Bucket) GetMax() *Value {
	if m != nil {
		return m.Max
	}
	return nil
}

func (m *BucketingConfig_Bucket) GetReplacementValue() *Value {
	if m != nil {
		return m.ReplacementValue
	}
	return nil
}

// Replaces an identifier with a surrogate using Format Preserving Encryption
// (FPE) with the FFX mode of operation; however when used in the
// `ReidentifyContent` API method, it serves the opposite function by reversing
// the surrogate back into the original identifier. The identifier must be
// encoded as ASCII. For a given crypto key and context, the same identifier
// will be replaced with the same surrogate. Identifiers must be at least two
// characters long. In the case that the identifier is the empty string, it will
// be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
// more.
//
// Note: We recommend using  CryptoDeterministicConfig for all use cases which
// do not require preserving the input alphabet space and size, plus warrant
// referential integrity.
type CryptoReplaceFfxFpeConfig struct {
	// The key used by the encryption algorithm. [required]
	CryptoKey *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	// The 'tweak', a context may be used for higher security since the same
	// identifier in two different contexts won't be given the same surrogate. If
	// the context is not set, a default tweak will be used.
	//
	// If the context is set but:
	//
	// 1. there is no record present when transforming a given value or
	// 1. the field is not present when transforming a given value,
	//
	// a default tweak will be used.
	//
	// Note that case (1) is expected when an `InfoTypeTransformation` is
	// applied to both structured and non-structured `ContentItem`s.
	// Currently, the referenced field may be of value type integer or string.
	//
	// The tweak is constructed as a sequence of bytes in big endian byte order
	// such that:
	//
	// - a 64 bit integer is encoded followed by a single byte of value 1
	// - a string is encoded in UTF-8 format followed by a single byte of value 2
	Context *FieldId `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"`
	// Types that are valid to be assigned to Alphabet:
	//	*CryptoReplaceFfxFpeConfig_CommonAlphabet
	//	*CryptoReplaceFfxFpeConfig_CustomAlphabet
	//	*CryptoReplaceFfxFpeConfig_Radix
	Alphabet isCryptoReplaceFfxFpeConfig_Alphabet `protobuf_oneof:"alphabet"`
	// The custom infoType to annotate the surrogate with.
	// This annotation will be applied to the surrogate by prefixing it with
	// the name of the custom infoType followed by the number of
	// characters comprising the surrogate. The following scheme defines the
	// format: info_type_name(surrogate_character_count):surrogate
	//
	// For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
	// the surrogate is 'abc', the full replacement value
	// will be: 'MY_TOKEN_INFO_TYPE(3):abc'
	//
	// This annotation identifies the surrogate when inspecting content using the
	// custom infoType
	// [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
	// This facilitates reversal of the surrogate when it occurs in free text.
	//
	// In order for inspection to work properly, the name of this infoType must
	// not occur naturally anywhere in your data; otherwise, inspection may
	// find a surrogate that does not correspond to an actual identifier.
	// Therefore, choose your custom infoType name carefully after considering
	// what your data looks like. One way to select a name that has a high chance
	// of yielding reliable detection is to include one or more unicode characters
	// that are highly improbable to exist in your data.
	// For example, assuming your data is entered from a regular ASCII keyboard,
	// the symbol with the hex code point 29DD might be used like so:
	// ⧝MY_TOKEN_TYPE
	SurrogateInfoType    *InfoType `protobuf:"bytes,8,opt,name=surrogate_info_type,json=surrogateInfoType,proto3" json:"surrogate_info_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CryptoReplaceFfxFpeConfig) Reset()         { *m = CryptoReplaceFfxFpeConfig{} }
func (m *CryptoReplaceFfxFpeConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoReplaceFfxFpeConfig) ProtoMessage()    {}
func (*CryptoReplaceFfxFpeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{54}
}

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

var xxx_messageInfo_CryptoReplaceFfxFpeConfig proto.InternalMessageInfo

func (m *CryptoReplaceFfxFpeConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

func (m *CryptoReplaceFfxFpeConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

type isCryptoReplaceFfxFpeConfig_Alphabet interface {
	isCryptoReplaceFfxFpeConfig_Alphabet()
}

type CryptoReplaceFfxFpeConfig_CommonAlphabet struct {
	CommonAlphabet CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet `protobuf:"varint,4,opt,name=common_alphabet,json=commonAlphabet,proto3,enum=google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet,oneof"`
}

type CryptoReplaceFfxFpeConfig_CustomAlphabet struct {
	CustomAlphabet string `protobuf:"bytes,5,opt,name=custom_alphabet,json=customAlphabet,proto3,oneof"`
}

type CryptoReplaceFfxFpeConfig_Radix struct {
	Radix int32 `protobuf:"varint,6,opt,name=radix,proto3,oneof"`
}

func (*CryptoReplaceFfxFpeConfig_CommonAlphabet) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (*CryptoReplaceFfxFpeConfig_CustomAlphabet) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (*CryptoReplaceFfxFpeConfig_Radix) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (m *CryptoReplaceFfxFpeConfig) GetAlphabet() isCryptoReplaceFfxFpeConfig_Alphabet {
	if m != nil {
		return m.Alphabet
	}
	return nil
}

func (m *CryptoReplaceFfxFpeConfig) GetCommonAlphabet() CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_CommonAlphabet); ok {
		return x.CommonAlphabet
	}
	return CryptoReplaceFfxFpeConfig_FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED
}

func (m *CryptoReplaceFfxFpeConfig) GetCustomAlphabet() string {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_CustomAlphabet); ok {
		return x.CustomAlphabet
	}
	return ""
}

func (m *CryptoReplaceFfxFpeConfig) GetRadix() int32 {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_Radix); ok {
		return x.Radix
	}
	return 0
}

func (m *CryptoReplaceFfxFpeConfig) GetSurrogateInfoType() *InfoType {
	if m != nil {
		return m.SurrogateInfoType
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CryptoReplaceFfxFpeConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CryptoReplaceFfxFpeConfig_CommonAlphabet)(nil),
		(*CryptoReplaceFfxFpeConfig_CustomAlphabet)(nil),
		(*CryptoReplaceFfxFpeConfig_Radix)(nil),
	}
}

// This is a data encryption key (DEK) (as opposed to
// a key encryption key (KEK) stored by KMS).
// When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
// IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
// unwrap the data crypto key.
type CryptoKey struct {
	// Types that are valid to be assigned to Source:
	//	*CryptoKey_Transient
	//	*CryptoKey_Unwrapped
	//	*CryptoKey_KmsWrapped
	Source               isCryptoKey_Source `protobuf_oneof:"source"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *CryptoKey) Reset()         { *m = CryptoKey{} }
func (m *CryptoKey) String() string { return proto.CompactTextString(m) }
func (*CryptoKey) ProtoMessage()    {}
func (*CryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{55}
}

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

var xxx_messageInfo_CryptoKey proto.InternalMessageInfo

type isCryptoKey_Source interface {
	isCryptoKey_Source()
}

type CryptoKey_Transient struct {
	Transient *TransientCryptoKey `protobuf:"bytes,1,opt,name=transient,proto3,oneof"`
}

type CryptoKey_Unwrapped struct {
	Unwrapped *UnwrappedCryptoKey `protobuf:"bytes,2,opt,name=unwrapped,proto3,oneof"`
}

type CryptoKey_KmsWrapped struct {
	KmsWrapped *KmsWrappedCryptoKey `protobuf:"bytes,3,opt,name=kms_wrapped,json=kmsWrapped,proto3,oneof"`
}

func (*CryptoKey_Transient) isCryptoKey_Source() {}

func (*CryptoKey_Unwrapped) isCryptoKey_Source() {}

func (*CryptoKey_KmsWrapped) isCryptoKey_Source() {}

func (m *CryptoKey) GetSource() isCryptoKey_Source {
	if m != nil {
		return m.Source
	}
	return nil
}

func (m *CryptoKey) GetTransient() *TransientCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_Transient); ok {
		return x.Transient
	}
	return nil
}

func (m *CryptoKey) GetUnwrapped() *UnwrappedCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_Unwrapped); ok {
		return x.Unwrapped
	}
	return nil
}

func (m *CryptoKey) GetKmsWrapped() *KmsWrappedCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_KmsWrapped); ok {
		return x.KmsWrapped
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CryptoKey) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CryptoKey_Transient)(nil),
		(*CryptoKey_Unwrapped)(nil),
		(*CryptoKey_KmsWrapped)(nil),
	}
}

// Use this to have a random data crypto key generated.
// It will be discarded after the request finishes.
type TransientCryptoKey struct {
	// Name of the key. [required]
	// This is an arbitrary string used to differentiate different keys.
	// A unique key is generated per name: two separate `TransientCryptoKey`
	// protos share the same generated key if their names are the same.
	// When the data crypto key is generated, this name is not used in any way
	// (repeating the api call will result in a different key being generated).
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TransientCryptoKey) Reset()         { *m = TransientCryptoKey{} }
func (m *TransientCryptoKey) String() string { return proto.CompactTextString(m) }
func (*TransientCryptoKey) ProtoMessage()    {}
func (*TransientCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{56}
}

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

var xxx_messageInfo_TransientCryptoKey proto.InternalMessageInfo

func (m *TransientCryptoKey) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Using raw keys is prone to security risks due to accidentally
// leaking the key. Choose another type of key if possible.
type UnwrappedCryptoKey struct {
	// A 128/192/256 bit key. [required]
	Key                  []byte   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UnwrappedCryptoKey) Reset()         { *m = UnwrappedCryptoKey{} }
func (m *UnwrappedCryptoKey) String() string { return proto.CompactTextString(m) }
func (*UnwrappedCryptoKey) ProtoMessage()    {}
func (*UnwrappedCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{57}
}

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

var xxx_messageInfo_UnwrappedCryptoKey proto.InternalMessageInfo

func (m *UnwrappedCryptoKey) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

// Include to use an existing data crypto key wrapped by KMS.
// The wrapped key must be a 128/192/256 bit key.
// Authorization requires the following IAM permissions when sending a request
// to perform a crypto transformation using a kms-wrapped crypto key:
// dlp.kms.encrypt
type KmsWrappedCryptoKey struct {
	// The wrapped data crypto key. [required]
	WrappedKey []byte `protobuf:"bytes,1,opt,name=wrapped_key,json=wrappedKey,proto3" json:"wrapped_key,omitempty"`
	// The resource name of the KMS CryptoKey to use for unwrapping. [required]
	CryptoKeyName        string   `protobuf:"bytes,2,opt,name=crypto_key_name,json=cryptoKeyName,proto3" json:"crypto_key_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *KmsWrappedCryptoKey) Reset()         { *m = KmsWrappedCryptoKey{} }
func (m *KmsWrappedCryptoKey) String() string { return proto.CompactTextString(m) }
func (*KmsWrappedCryptoKey) ProtoMessage()    {}
func (*KmsWrappedCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{58}
}

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

var xxx_messageInfo_KmsWrappedCryptoKey proto.InternalMessageInfo

func (m *KmsWrappedCryptoKey) GetWrappedKey() []byte {
	if m != nil {
		return m.WrappedKey
	}
	return nil
}

func (m *KmsWrappedCryptoKey) GetCryptoKeyName() string {
	if m != nil {
		return m.CryptoKeyName
	}
	return ""
}

// Shifts dates by random number of days, with option to be consistent for the
// same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
// to learn more.
type DateShiftConfig struct {
	// Range of shift in days. Actual shift will be selected at random within this
	// range (inclusive ends). Negative means shift to earlier in time. Must not
	// be more than 365250 days (1000 years) each direction.
	//
	// For example, 3 means shift date to at most 3 days into the future.
	// [Required]
	UpperBoundDays int32 `protobuf:"varint,1,opt,name=upper_bound_days,json=upperBoundDays,proto3" json:"upper_bound_days,omitempty"`
	// For example, -5 means shift date to at most 5 days back in the past.
	// [Required]
	LowerBoundDays int32 `protobuf:"varint,2,opt,name=lower_bound_days,json=lowerBoundDays,proto3" json:"lower_bound_days,omitempty"`
	// Points to the field that contains the context, for example, an entity id.
	// If set, must also set method. If set, shift will be consistent for the
	// given context.
	Context *FieldId `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"`
	// Method for calculating shift that takes context into consideration. If
	// set, must also set context. Can only be applied to table items.
	//
	// Types that are valid to be assigned to Method:
	//	*DateShiftConfig_CryptoKey
	Method               isDateShiftConfig_Method `protobuf_oneof:"method"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *DateShiftConfig) Reset()         { *m = DateShiftConfig{} }
func (m *DateShiftConfig) String() string { return proto.CompactTextString(m) }
func (*DateShiftConfig) ProtoMessage()    {}
func (*DateShiftConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{59}
}

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

var xxx_messageInfo_DateShiftConfig proto.InternalMessageInfo

func (m *DateShiftConfig) GetUpperBoundDays() int32 {
	if m != nil {
		return m.UpperBoundDays
	}
	return 0
}

func (m *DateShiftConfig) GetLowerBoundDays() int32 {
	if m != nil {
		return m.LowerBoundDays
	}
	return 0
}

func (m *DateShiftConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

type isDateShiftConfig_Method interface {
	isDateShiftConfig_Method()
}

type DateShiftConfig_CryptoKey struct {
	CryptoKey *CryptoKey `protobuf:"bytes,4,opt,name=crypto_key,json=cryptoKey,proto3,oneof"`
}

func (*DateShiftConfig_CryptoKey) isDateShiftConfig_Method() {}

func (m *DateShiftConfig) GetMethod() isDateShiftConfig_Method {
	if m != nil {
		return m.Method
	}
	return nil
}

func (m *DateShiftConfig) GetCryptoKey() *CryptoKey {
	if x, ok := m.GetMethod().(*DateShiftConfig_CryptoKey); ok {
		return x.CryptoKey
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DateShiftConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DateShiftConfig_CryptoKey)(nil),
	}
}

// A type of transformation that will scan unstructured text and
// apply various `PrimitiveTransformation`s to each finding, where the
// transformation is applied to only values that were identified as a specific
// info_type.
type InfoTypeTransformations struct {
	// Transformation for each infoType. Cannot specify more than one
	// for a given infoType. [required]
	Transformations      []*InfoTypeTransformations_InfoTypeTransformation `protobuf:"bytes,1,rep,name=transformations,proto3" json:"transformations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
	XXX_unrecognized     []byte                                            `json:"-"`
	XXX_sizecache        int32                                             `json:"-"`
}

func (m *InfoTypeTransformations) Reset()         { *m = InfoTypeTransformations{} }
func (m *InfoTypeTransformations) String() string { return proto.CompactTextString(m) }
func (*InfoTypeTransformations) ProtoMessage()    {}
func (*InfoTypeTransformations) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{60}
}

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

var xxx_messageInfo_InfoTypeTransformations proto.InternalMessageInfo

func (m *InfoTypeTransformations) GetTransformations() []*InfoTypeTransformations_InfoTypeTransformation {
	if m != nil {
		return m.Transformations
	}
	return nil
}

// A transformation to apply to text that is identified as a specific
// info_type.
type InfoTypeTransformations_InfoTypeTransformation struct {
	// InfoTypes to apply the transformation to. An empty list will cause
	// this transformation to apply to all findings that correspond to
	// infoTypes that were requested in `InspectConfig`.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Primitive transformation to apply to the infoType. [required]
	PrimitiveTransformation *PrimitiveTransformation `protobuf:"bytes,2,opt,name=primitive_transformation,json=primitiveTransformation,proto3" json:"primitive_transformation,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
	XXX_unrecognized        []byte                   `json:"-"`
	XXX_sizecache           int32                    `json:"-"`
}

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

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

var xxx_messageInfo_InfoTypeTransformations_InfoTypeTransformation proto.InternalMessageInfo

func (m *InfoTypeTransformations_InfoTypeTransformation) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InfoTypeTransformations_InfoTypeTransformation) GetPrimitiveTransformation() *PrimitiveTransformation {
	if m != nil {
		return m.PrimitiveTransformation
	}
	return nil
}

// The transformation to apply to the field.
type FieldTransformation struct {
	// Input field(s) to apply the transformation to. [required]
	Fields []*FieldId `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"`
	// Only apply the transformation if the condition evaluates to true for the
	// given `RecordCondition`. The conditions are allowed to reference fields
	// that are not used in the actual transformation. [optional]
	//
	// Example Use Cases:
	//
	// - Apply a different bucket transformation to an age column if the zip code
	// column for the same record is within a specific range.
	// - Redact a field if the date of birth field is greater than 85.
	Condition *RecordCondition `protobuf:"bytes,3,opt,name=condition,proto3" json:"condition,omitempty"`
	// Transformation to apply. [required]
	//
	// Types that are valid to be assigned to Transformation:
	//	*FieldTransformation_PrimitiveTransformation
	//	*FieldTransformation_InfoTypeTransformations
	Transformation       isFieldTransformation_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *FieldTransformation) Reset()         { *m = FieldTransformation{} }
func (m *FieldTransformation) String() string { return proto.CompactTextString(m) }
func (*FieldTransformation) ProtoMessage()    {}
func (*FieldTransformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{61}
}

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

var xxx_messageInfo_FieldTransformation proto.InternalMessageInfo

func (m *FieldTransformation) GetFields() []*FieldId {
	if m != nil {
		return m.Fields
	}
	return nil
}

func (m *FieldTransformation) GetCondition() *RecordCondition {
	if m != nil {
		return m.Condition
	}
	return nil
}

type isFieldTransformation_Transformation interface {
	isFieldTransformation_Transformation()
}

type FieldTransformation_PrimitiveTransformation struct {
	PrimitiveTransformation *PrimitiveTransformation `protobuf:"bytes,4,opt,name=primitive_transformation,json=primitiveTransformation,proto3,oneof"`
}

type FieldTransformation_InfoTypeTransformations struct {
	InfoTypeTransformations *InfoTypeTransformations `protobuf:"bytes,5,opt,name=info_type_transformations,json=infoTypeTransformations,proto3,oneof"`
}

func (*FieldTransformation_PrimitiveTransformation) isFieldTransformation_Transformation() {}

func (*FieldTransformation_InfoTypeTransformations) isFieldTransformation_Transformation() {}

func (m *FieldTransformation) GetTransformation() isFieldTransformation_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *FieldTransformation) GetPrimitiveTransformation() *PrimitiveTransformation {
	if x, ok := m.GetTransformation().(*FieldTransformation_PrimitiveTransformation); ok {
		return x.PrimitiveTransformation
	}
	return nil
}

func (m *FieldTransformation) GetInfoTypeTransformations() *InfoTypeTransformations {
	if x, ok := m.GetTransformation().(*FieldTransformation_InfoTypeTransformations); ok {
		return x.InfoTypeTransformations
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*FieldTransformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*FieldTransformation_PrimitiveTransformation)(nil),
		(*FieldTransformation_InfoTypeTransformations)(nil),
	}
}

// A type of transformation that is applied over structured data such as a
// table.
type RecordTransformations struct {
	// Transform the record by applying various field transformations.
	FieldTransformations []*FieldTransformation `protobuf:"bytes,1,rep,name=field_transformations,json=fieldTransformations,proto3" json:"field_transformations,omitempty"`
	// Configuration defining which records get suppressed entirely. Records that
	// match any suppression rule are omitted from the output [optional].
	RecordSuppressions   []*RecordSuppression `protobuf:"bytes,2,rep,name=record_suppressions,json=recordSuppressions,proto3" json:"record_suppressions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *RecordTransformations) Reset()         { *m = RecordTransformations{} }
func (m *RecordTransformations) String() string { return proto.CompactTextString(m) }
func (*RecordTransformations) ProtoMessage()    {}
func (*RecordTransformations) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{62}
}

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

var xxx_messageInfo_RecordTransformations proto.InternalMessageInfo

func (m *RecordTransformations) GetFieldTransformations() []*FieldTransformation {
	if m != nil {
		return m.FieldTransformations
	}
	return nil
}

func (m *RecordTransformations) GetRecordSuppressions() []*RecordSuppression {
	if m != nil {
		return m.RecordSuppressions
	}
	return nil
}

// Configuration to suppress records whose suppression conditions evaluate to
// true.
type RecordSuppression struct {
	// A condition that when it evaluates to true will result in the record being
	// evaluated to be suppressed from the transformed content.
	Condition            *RecordCondition `protobuf:"bytes,1,opt,name=condition,proto3" json:"condition,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *RecordSuppression) Reset()         { *m = RecordSuppression{} }
func (m *RecordSuppression) String() string { return proto.CompactTextString(m) }
func (*RecordSuppression) ProtoMessage()    {}
func (*RecordSuppression) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{63}
}

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

var xxx_messageInfo_RecordSuppression proto.InternalMessageInfo

func (m *RecordSuppression) GetCondition() *RecordCondition {
	if m != nil {
		return m.Condition
	}
	return nil
}

// A condition for determining whether a transformation should be applied to
// a field.
type RecordCondition struct {
	// An expression.
	Expressions          *RecordCondition_Expressions `protobuf:"bytes,3,opt,name=expressions,proto3" json:"expressions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *RecordCondition) Reset()         { *m = RecordCondition{} }
func (m *RecordCondition) String() string { return proto.CompactTextString(m) }
func (*RecordCondition) ProtoMessage()    {}
func (*RecordCondition) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{64}
}

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

var xxx_messageInfo_RecordCondition proto.InternalMessageInfo

func (m *RecordCondition) GetExpressions() *RecordCondition_Expressions {
	if m != nil {
		return m.Expressions
	}
	return nil
}

// The field type of `value` and `field` do not need to match to be
// considered equal, but not all comparisons are possible.
// EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
// but all other comparisons are invalid with incompatible types.
// A `value` of type:
//
// - `string` can be compared against all other types
// - `boolean` can only be compared against other booleans
// - `integer` can be compared against doubles or a string if the string value
// can be parsed as an integer.
// - `double` can be compared against integers or a string if the string can
// be parsed as a double.
// - `Timestamp` can be compared against strings in RFC 3339 date string
// format.
// - `TimeOfDay` can be compared against timestamps and strings in the format
// of 'HH:mm:ss'.
//
// If we fail to compare do to type mismatch, a warning will be given and
// the condition will evaluate to false.
type RecordCondition_Condition struct {
	// Field within the record this condition is evaluated against. [required]
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Operator used to compare the field or infoType to the value. [required]
	Operator RelationalOperator `protobuf:"varint,3,opt,name=operator,proto3,enum=google.privacy.dlp.v2.RelationalOperator" json:"operator,omitempty"`
	// Value to compare against. [Required, except for `EXISTS` tests.]
	Value                *Value   `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Condition proto.InternalMessageInfo

func (m *RecordCondition_Condition) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *RecordCondition_Condition) GetOperator() RelationalOperator {
	if m != nil {
		return m.Operator
	}
	return RelationalOperator_RELATIONAL_OPERATOR_UNSPECIFIED
}

func (m *RecordCondition_Condition) GetValue() *Value {
	if m != nil {
		return m.Value
	}
	return nil
}

// A collection of conditions.
type RecordCondition_Conditions struct {
	Conditions           []*RecordCondition_Condition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Conditions proto.InternalMessageInfo

func (m *RecordCondition_Conditions) GetConditions() []*RecordCondition_Condition {
	if m != nil {
		return m.Conditions
	}
	return nil
}

// An expression, consisting or an operator and conditions.
type RecordCondition_Expressions struct {
	// The operator to apply to the result of conditions. Default and currently
	// only supported value is `AND`.
	LogicalOperator RecordCondition_Expressions_LogicalOperator `protobuf:"varint,1,opt,name=logical_operator,json=logicalOperator,proto3,enum=google.privacy.dlp.v2.RecordCondition_Expressions_LogicalOperator" json:"logical_operator,omitempty"`
	// Types that are valid to be assigned to Type:
	//	*RecordCondition_Expressions_Conditions
	Type                 isRecordCondition_Expressions_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Expressions proto.InternalMessageInfo

func (m *RecordCondition_Expressions) GetLogicalOperator() RecordCondition_Expressions_LogicalOperator {
	if m != nil {
		return m.LogicalOperator
	}
	return RecordCondition_Expressions_LOGICAL_OPERATOR_UNSPECIFIED
}

type isRecordCondition_Expressions_Type interface {
	isRecordCondition_Expressions_Type()
}

type RecordCondition_Expressions_Conditions struct {
	Conditions *RecordCondition_Conditions `protobuf:"bytes,3,opt,name=conditions,proto3,oneof"`
}

func (*RecordCondition_Expressions_Conditions) isRecordCondition_Expressions_Type() {}

func (m *RecordCondition_Expressions) GetType() isRecordCondition_Expressions_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *RecordCondition_Expressions) GetConditions() *RecordCondition_Conditions {
	if x, ok := m.GetType().(*RecordCondition_Expressions_Conditions); ok {
		return x.Conditions
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RecordCondition_Expressions) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RecordCondition_Expressions_Conditions)(nil),
	}
}

// Overview of the modifications that occurred.
type TransformationOverview struct {
	// Total size in bytes that were transformed in some way.
	TransformedBytes int64 `protobuf:"varint,2,opt,name=transformed_bytes,json=transformedBytes,proto3" json:"transformed_bytes,omitempty"`
	// Transformations applied to the dataset.
	TransformationSummaries []*TransformationSummary `protobuf:"bytes,3,rep,name=transformation_summaries,json=transformationSummaries,proto3" json:"transformation_summaries,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
	XXX_unrecognized        []byte                   `json:"-"`
	XXX_sizecache           int32                    `json:"-"`
}

func (m *TransformationOverview) Reset()         { *m = TransformationOverview{} }
func (m *TransformationOverview) String() string { return proto.CompactTextString(m) }
func (*TransformationOverview) ProtoMessage()    {}
func (*TransformationOverview) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{65}
}

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

var xxx_messageInfo_TransformationOverview proto.InternalMessageInfo

func (m *TransformationOverview) GetTransformedBytes() int64 {
	if m != nil {
		return m.TransformedBytes
	}
	return 0
}

func (m *TransformationOverview) GetTransformationSummaries() []*TransformationSummary {
	if m != nil {
		return m.TransformationSummaries
	}
	return nil
}

// Summary of a single transformation.
// Only one of 'transformation', 'field_transformation', or 'record_suppress'
// will be set.
type TransformationSummary struct {
	// Set if the transformation was limited to a specific InfoType.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Set if the transformation was limited to a specific FieldId.
	Field *FieldId `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"`
	// The specific transformation these stats apply to.
	Transformation *PrimitiveTransformation `protobuf:"bytes,3,opt,name=transformation,proto3" json:"transformation,omitempty"`
	// The field transformation that was applied.
	// If multiple field transformations are requested for a single field,
	// this list will contain all of them; otherwise, only one is supplied.
	FieldTransformations []*FieldTransformation `protobuf:"bytes,5,rep,name=field_transformations,json=fieldTransformations,proto3" json:"field_transformations,omitempty"`
	// The specific suppression option these stats apply to.
	RecordSuppress *RecordSuppression                     `protobuf:"bytes,6,opt,name=record_suppress,json=recordSuppress,proto3" json:"record_suppress,omitempty"`
	Results        []*TransformationSummary_SummaryResult `protobuf:"bytes,4,rep,name=results,proto3" json:"results,omitempty"`
	// Total size in bytes that were transformed in some way.
	TransformedBytes     int64    `protobuf:"varint,7,opt,name=transformed_bytes,json=transformedBytes,proto3" json:"transformed_bytes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TransformationSummary) Reset()         { *m = TransformationSummary{} }
func (m *TransformationSummary) String() string { return proto.CompactTextString(m) }
func (*TransformationSummary) ProtoMessage()    {}
func (*TransformationSummary) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{66}
}

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

var xxx_messageInfo_TransformationSummary proto.InternalMessageInfo

func (m *TransformationSummary) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *TransformationSummary) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *TransformationSummary) GetTransformation() *PrimitiveTransformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *TransformationSummary) GetFieldTransformations() []*FieldTransformation {
	if m != nil {
		return m.FieldTransformations
	}
	return nil
}

func (m *TransformationSummary) GetRecordSuppress() *RecordSuppression {
	if m != nil {
		return m.RecordSuppress
	}
	return nil
}

func (m *TransformationSummary) GetResults() []*TransformationSummary_SummaryResult {
	if m != nil {
		return m.Results
	}
	return nil
}

func (m *TransformationSummary) GetTransformedBytes() int64 {
	if m != nil {
		return m.TransformedBytes
	}
	return 0
}

// A collection that informs the user the number of times a particular
// `TransformationResultCode` and error details occurred.
type TransformationSummary_SummaryResult struct {
	Count int64                                          `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
	Code  TransformationSummary_TransformationResultCode `protobuf:"varint,2,opt,name=code,proto3,enum=google.privacy.dlp.v2.TransformationSummary_TransformationResultCode" json:"code,omitempty"`
	// A place for warnings or errors to show up if a transformation didn't
	// work as expected.
	Details              string   `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TransformationSummary_SummaryResult proto.InternalMessageInfo

func (m *TransformationSummary_SummaryResult) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

func (m *TransformationSummary_SummaryResult) GetCode() TransformationSummary_TransformationResultCode {
	if m != nil {
		return m.Code
	}
	return TransformationSummary_TRANSFORMATION_RESULT_CODE_UNSPECIFIED
}

func (m *TransformationSummary_SummaryResult) GetDetails() string {
	if m != nil {
		return m.Details
	}
	return ""
}

// Schedule for triggeredJobs.
type Schedule struct {
	// Types that are valid to be assigned to Option:
	//	*Schedule_RecurrencePeriodDuration
	Option               isSchedule_Option `protobuf_oneof:"option"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Schedule) Reset()         { *m = Schedule{} }
func (m *Schedule) String() string { return proto.CompactTextString(m) }
func (*Schedule) ProtoMessage()    {}
func (*Schedule) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{67}
}

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

var xxx_messageInfo_Schedule proto.InternalMessageInfo

type isSchedule_Option interface {
	isSchedule_Option()
}

type Schedule_RecurrencePeriodDuration struct {
	RecurrencePeriodDuration *duration.Duration `protobuf:"bytes,1,opt,name=recurrence_period_duration,json=recurrencePeriodDuration,proto3,oneof"`
}

func (*Schedule_RecurrencePeriodDuration) isSchedule_Option() {}

func (m *Schedule) GetOption() isSchedule_Option {
	if m != nil {
		return m.Option
	}
	return nil
}

func (m *Schedule) GetRecurrencePeriodDuration() *duration.Duration {
	if x, ok := m.GetOption().(*Schedule_RecurrencePeriodDuration); ok {
		return x.RecurrencePeriodDuration
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Schedule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Schedule_RecurrencePeriodDuration)(nil),
	}
}

// The inspectTemplate contains a configuration (set of types of sensitive data
// to be detected) to be used anywhere you otherwise would normally specify
// InspectConfig. See https://cloud.google.com/dlp/docs/concepts-templates
// to learn more.
type InspectTemplate struct {
	// The template name. Output only.
	//
	// The template will have one of the following formats:
	// `projects/PROJECT_ID/inspectTemplates/TEMPLATE_ID` OR
	// `organizations/ORGANIZATION_ID/inspectTemplates/TEMPLATE_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 256 chars).
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Short description (max 256 chars).
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The creation timestamp of a inspectTemplate, output only field.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// The last update timestamp of a inspectTemplate, output only field.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// The core content of the template. Configuration of the scanning process.
	InspectConfig        *InspectConfig `protobuf:"bytes,6,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *InspectTemplate) Reset()         { *m = InspectTemplate{} }
func (m *InspectTemplate) String() string { return proto.CompactTextString(m) }
func (*InspectTemplate) ProtoMessage()    {}
func (*InspectTemplate) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{68}
}

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

var xxx_messageInfo_InspectTemplate proto.InternalMessageInfo

func (m *InspectTemplate) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *InspectTemplate) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *InspectTemplate) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *InspectTemplate) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *InspectTemplate) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *InspectTemplate) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

// The DeidentifyTemplates contains instructions on how to deidentify content.
// See https://cloud.google.com/dlp/docs/concepts-templates to learn more.
type DeidentifyTemplate struct {
	// The template name. Output only.
	//
	// The template will have one of the following formats:
	// `projects/PROJECT_ID/deidentifyTemplates/TEMPLATE_ID` OR
	// `organizations/ORGANIZATION_ID/deidentifyTemplates/TEMPLATE_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 256 chars).
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Short description (max 256 chars).
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The creation timestamp of a inspectTemplate, output only field.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// The last update timestamp of a inspectTemplate, output only field.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// ///////////// // The core content of the template  // ///////////////
	DeidentifyConfig     *DeidentifyConfig `protobuf:"bytes,6,opt,name=deidentify_config,json=deidentifyConfig,proto3" json:"deidentify_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *DeidentifyTemplate) Reset()         { *m = DeidentifyTemplate{} }
func (m *DeidentifyTemplate) String() string { return proto.CompactTextString(m) }
func (*DeidentifyTemplate) ProtoMessage()    {}
func (*DeidentifyTemplate) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{69}
}

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

var xxx_messageInfo_DeidentifyTemplate proto.InternalMessageInfo

func (m *DeidentifyTemplate) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DeidentifyTemplate) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *DeidentifyTemplate) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *DeidentifyTemplate) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *DeidentifyTemplate) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *DeidentifyTemplate) GetDeidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.DeidentifyConfig
	}
	return nil
}

// Details information about an error encountered during job execution or
// the results of an unsuccessful activation of the JobTrigger.
// Output only field.
type Error struct {
	Details *status.Status `protobuf:"bytes,1,opt,name=details,proto3" json:"details,omitempty"`
	// The times the error occurred.
	Timestamps           []*timestamp.Timestamp `protobuf:"bytes,2,rep,name=timestamps,proto3" json:"timestamps,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *Error) Reset()         { *m = Error{} }
func (m *Error) String() string { return proto.CompactTextString(m) }
func (*Error) ProtoMessage()    {}
func (*Error) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{70}
}

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

var xxx_messageInfo_Error proto.InternalMessageInfo

func (m *Error) GetDetails() *status.Status {
	if m != nil {
		return m.Details
	}
	return nil
}

func (m *Error) GetTimestamps() []*timestamp.Timestamp {
	if m != nil {
		return m.Timestamps
	}
	return nil
}

// Contains a configuration to make dlp api calls on a repeating basis.
// See https://cloud.google.com/dlp/docs/concepts-job-triggers to learn more.
type JobTrigger struct {
	// Unique resource name for the triggeredJob, assigned by the service when the
	// triggeredJob is created, for example
	// `projects/dlp-test-project/triggeredJobs/53234423`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 100 chars)
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// User provided description (max 256 chars)
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The configuration details for the specific type of job to run.
	//
	// Types that are valid to be assigned to Job:
	//	*JobTrigger_InspectJob
	Job isJobTrigger_Job `protobuf_oneof:"job"`
	// A list of triggers which will be OR'ed together. Only one in the list
	// needs to trigger for a job to be started. The list may contain only
	// a single Schedule trigger and must have at least one object.
	Triggers []*JobTrigger_Trigger `protobuf:"bytes,5,rep,name=triggers,proto3" json:"triggers,omitempty"`
	// A stream of errors encountered when the trigger was activated. Repeated
	// errors may result in the JobTrigger automatically being paused.
	// Will return the last 100 errors. Whenever the JobTrigger is modified
	// this list will be cleared. Output only field.
	Errors []*Error `protobuf:"bytes,6,rep,name=errors,proto3" json:"errors,omitempty"`
	// The creation timestamp of a triggeredJob, output only field.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// The last update timestamp of a triggeredJob, output only field.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// The timestamp of the last time this trigger executed, output only field.
	LastRunTime *timestamp.Timestamp `protobuf:"bytes,9,opt,name=last_run_time,json=lastRunTime,proto3" json:"last_run_time,omitempty"`
	// A status for this trigger. [required]
	Status               JobTrigger_Status `protobuf:"varint,10,opt,name=status,proto3,enum=google.privacy.dlp.v2.JobTrigger_Status" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *JobTrigger) Reset()         { *m = JobTrigger{} }
func (m *JobTrigger) String() string { return proto.CompactTextString(m) }
func (*JobTrigger) ProtoMessage()    {}
func (*JobTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{71}
}

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

var xxx_messageInfo_JobTrigger proto.InternalMessageInfo

func (m *JobTrigger) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *JobTrigger) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *JobTrigger) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type isJobTrigger_Job interface {
	isJobTrigger_Job()
}

type JobTrigger_InspectJob struct {
	InspectJob *InspectJobConfig `protobuf:"bytes,4,opt,name=inspect_job,json=inspectJob,proto3,oneof"`
}

func (*JobTrigger_InspectJob) isJobTrigger_Job() {}

func (m *JobTrigger) GetJob() isJobTrigger_Job {
	if m != nil {
		return m.Job
	}
	return nil
}

func (m *JobTrigger) GetInspectJob() *InspectJobConfig {
	if x, ok := m.GetJob().(*JobTrigger_InspectJob); ok {
		return x.InspectJob
	}
	return nil
}

func (m *JobTrigger) GetTriggers() []*JobTrigger_Trigger {
	if m != nil {
		return m.Triggers
	}
	return nil
}

func (m *JobTrigger) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

func (m *JobTrigger) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *JobTrigger) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *JobTrigger) GetLastRunTime() *timestamp.Timestamp {
	if m != nil {
		return m.LastRunTime
	}
	return nil
}

func (m *JobTrigger) GetStatus() JobTrigger_Status {
	if m != nil {
		return m.Status
	}
	return JobTrigger_STATUS_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*JobTrigger) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*JobTrigger_InspectJob)(nil),
	}
}

// What event needs to occur for a new job to be started.
type JobTrigger_Trigger struct {
	// Types that are valid to be assigned to Trigger:
	//	*JobTrigger_Trigger_Schedule
	Trigger              isJobTrigger_Trigger_Trigger `protobuf_oneof:"trigger"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_JobTrigger_Trigger proto.InternalMessageInfo

type isJobTrigger_Trigger_Trigger interface {
	isJobTrigger_Trigger_Trigger()
}

type JobTrigger_Trigger_Schedule struct {
	Schedule *Schedule `protobuf:"bytes,1,opt,name=schedule,proto3,oneof"`
}

func (*JobTrigger_Trigger_Schedule) isJobTrigger_Trigger_Trigger() {}

func (m *JobTrigger_Trigger) GetTrigger() isJobTrigger_Trigger_Trigger {
	if m != nil {
		return m.Trigger
	}
	return nil
}

func (m *JobTrigger_Trigger) GetSchedule() *Schedule {
	if x, ok := m.GetTrigger().(*JobTrigger_Trigger_Schedule); ok {
		return x.Schedule
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*JobTrigger_Trigger) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*JobTrigger_Trigger_Schedule)(nil),
	}
}

// A task to execute on the completion of a job.
// See https://cloud.google.com/dlp/docs/concepts-actions to learn more.
type Action struct {
	// Types that are valid to be assigned to Action:
	//	*Action_SaveFindings_
	//	*Action_PubSub
	//	*Action_PublishSummaryToCscc_
	//	*Action_PublishFindingsToCloudDataCatalog_
	//	*Action_JobNotificationEmails_
	Action               isAction_Action `protobuf_oneof:"action"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Action) Reset()         { *m = Action{} }
func (m *Action) String() string { return proto.CompactTextString(m) }
func (*Action) ProtoMessage()    {}
func (*Action) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{72}
}

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

var xxx_messageInfo_Action proto.InternalMessageInfo

type isAction_Action interface {
	isAction_Action()
}

type Action_SaveFindings_ struct {
	SaveFindings *Action_SaveFindings `protobuf:"bytes,1,opt,name=save_findings,json=saveFindings,proto3,oneof"`
}

type Action_PubSub struct {
	PubSub *Action_PublishToPubSub `protobuf:"bytes,2,opt,name=pub_sub,json=pubSub,proto3,oneof"`
}

type Action_PublishSummaryToCscc_ struct {
	PublishSummaryToCscc *Action_PublishSummaryToCscc `protobuf:"bytes,3,opt,name=publish_summary_to_cscc,json=publishSummaryToCscc,proto3,oneof"`
}

type Action_PublishFindingsToCloudDataCatalog_ struct {
	PublishFindingsToCloudDataCatalog *Action_PublishFindingsToCloudDataCatalog `protobuf:"bytes,5,opt,name=publish_findings_to_cloud_data_catalog,json=publishFindingsToCloudDataCatalog,proto3,oneof"`
}

type Action_JobNotificationEmails_ struct {
	JobNotificationEmails *Action_JobNotificationEmails `protobuf:"bytes,8,opt,name=job_notification_emails,json=jobNotificationEmails,proto3,oneof"`
}

func (*Action_SaveFindings_) isAction_Action() {}

func (*Action_PubSub) isAction_Action() {}

func (*Action_PublishSummaryToCscc_) isAction_Action() {}

func (*Action_PublishFindingsToCloudDataCatalog_) isAction_Action() {}

func (*Action_JobNotificationEmails_) isAction_Action() {}

func (m *Action) GetAction() isAction_Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *Action) GetSaveFindings() *Action_SaveFindings {
	if x, ok := m.GetAction().(*Action_SaveFindings_); ok {
		return x.SaveFindings
	}
	return nil
}

func (m *Action) GetPubSub() *Action_PublishToPubSub {
	if x, ok := m.GetAction().(*Action_PubSub); ok {
		return x.PubSub
	}
	return nil
}

func (m *Action) GetPublishSummaryToCscc() *Action_PublishSummaryToCscc {
	if x, ok := m.GetAction().(*Action_PublishSummaryToCscc_); ok {
		return x.PublishSummaryToCscc
	}
	return nil
}

func (m *Action) GetPublishFindingsToCloudDataCatalog() *Action_PublishFindingsToCloudDataCatalog {
	if x, ok := m.GetAction().(*Action_PublishFindingsToCloudDataCatalog_); ok {
		return x.PublishFindingsToCloudDataCatalog
	}
	return nil
}

func (m *Action) GetJobNotificationEmails() *Action_JobNotificationEmails {
	if x, ok := m.GetAction().(*Action_JobNotificationEmails_); ok {
		return x.JobNotificationEmails
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Action) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Action_SaveFindings_)(nil),
		(*Action_PubSub)(nil),
		(*Action_PublishSummaryToCscc_)(nil),
		(*Action_PublishFindingsToCloudDataCatalog_)(nil),
		(*Action_JobNotificationEmails_)(nil),
	}
}

// If set, the detailed findings will be persisted to the specified
// OutputStorageConfig. Only a single instance of this action can be
// specified.
// Compatible with: Inspect, Risk
type Action_SaveFindings struct {
	OutputConfig         *OutputStorageConfig `protobuf:"bytes,1,opt,name=output_config,json=outputConfig,proto3" json:"output_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Action_SaveFindings proto.InternalMessageInfo

func (m *Action_SaveFindings) GetOutputConfig() *OutputStorageConfig {
	if m != nil {
		return m.OutputConfig
	}
	return nil
}

// Publish a message into given Pub/Sub topic when DlpJob has completed. The
// message contains a single field, `DlpJobName`, which is equal to the
// finished job's
// [`DlpJob.name`](/dlp/docs/reference/rest/v2/projects.dlpJobs#DlpJob).
// Compatible with: Inspect, Risk
type Action_PublishToPubSub struct {
	// Cloud Pub/Sub topic to send notifications to. The topic must have given
	// publishing access rights to the DLP API service account executing
	// the long running DlpJob sending the notifications.
	// Format is projects/{project}/topics/{topic}.
	Topic                string   `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishToPubSub proto.InternalMessageInfo

func (m *Action_PublishToPubSub) GetTopic() string {
	if m != nil {
		return m.Topic
	}
	return ""
}

// Publish the result summary of a DlpJob to the Cloud Security
// Command Center (CSCC Alpha).
// This action is only available for projects which are parts of
// an organization and whitelisted for the alpha Cloud Security Command
// Center.
// The action will publish count of finding instances and their info types.
// The summary of findings will be persisted in CSCC and are governed by CSCC
// service-specific policy, see https://cloud.google.com/terms/service-terms
// Only a single instance of this action can be specified.
// Compatible with: Inspect
type Action_PublishSummaryToCscc struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishSummaryToCscc proto.InternalMessageInfo

// Publish findings of a DlpJob to Cloud Data Catalog. Labels summarizing the
// results of the DlpJob will be applied to the entry for the resource scanned
// in Cloud Data Catalog. Any labels previously written by another DlpJob will
// be deleted. InfoType naming patterns are strictly enforced when using this
// feature. Note that the findings will be persisted in Cloud Data Catalog
// storage and are governed by Data Catalog service-specific policy, see
// https://cloud.google.com/terms/service-terms
// Only a single instance of this action can be specified and only allowed if
// all resources being scanned are BigQuery tables.
// Compatible with: Inspect
type Action_PublishFindingsToCloudDataCatalog struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Action_PublishFindingsToCloudDataCatalog) Reset() {
	*m = Action_PublishFindingsToCloudDataCatalog{}
}
func (m *Action_PublishFindingsToCloudDataCatalog) String() string { return proto.CompactTextString(m) }
func (*Action_PublishFindingsToCloudDataCatalog) ProtoMessage()    {}
func (*Action_PublishFindingsToCloudDataCatalog) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{72, 3}
}

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

var xxx_messageInfo_Action_PublishFindingsToCloudDataCatalog proto.InternalMessageInfo

// Enable email notification to project owners and editors on jobs's
// completion/failure.
type Action_JobNotificationEmails struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Action_JobNotificationEmails) Reset()         { *m = Action_JobNotificationEmails{} }
func (m *Action_JobNotificationEmails) String() string { return proto.CompactTextString(m) }
func (*Action_JobNotificationEmails) ProtoMessage()    {}
func (*Action_JobNotificationEmails) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{72, 4}
}

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

var xxx_messageInfo_Action_JobNotificationEmails proto.InternalMessageInfo

// Request message for CreateInspectTemplate.
type CreateInspectTemplateRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The InspectTemplate to create.
	InspectTemplate *InspectTemplate `protobuf:"bytes,2,opt,name=inspect_template,json=inspectTemplate,proto3" json:"inspect_template,omitempty"`
	// The template id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TemplateId           string   `protobuf:"bytes,3,opt,name=template_id,json=templateId,proto3" json:"template_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateInspectTemplateRequest) Reset()         { *m = CreateInspectTemplateRequest{} }
func (m *CreateInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateInspectTemplateRequest) ProtoMessage()    {}
func (*CreateInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{73}
}

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

var xxx_messageInfo_CreateInspectTemplateRequest proto.InternalMessageInfo

func (m *CreateInspectTemplateRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateInspectTemplateRequest) GetInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.InspectTemplate
	}
	return nil
}

func (m *CreateInspectTemplateRequest) GetTemplateId() string {
	if m != nil {
		return m.TemplateId
	}
	return ""
}

// Request message for UpdateInspectTemplate.
type UpdateInspectTemplateRequest struct {
	// Resource name of organization and inspectTemplate to be updated, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New InspectTemplate value.
	InspectTemplate *InspectTemplate `protobuf:"bytes,2,opt,name=inspect_template,json=inspectTemplate,proto3" json:"inspect_template,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateInspectTemplateRequest) Reset()         { *m = UpdateInspectTemplateRequest{} }
func (m *UpdateInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateInspectTemplateRequest) ProtoMessage()    {}
func (*UpdateInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{74}
}

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

var xxx_messageInfo_UpdateInspectTemplateRequest proto.InternalMessageInfo

func (m *UpdateInspectTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *UpdateInspectTemplateRequest) GetInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.InspectTemplate
	}
	return nil
}

func (m *UpdateInspectTemplateRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// Request message for GetInspectTemplate.
type GetInspectTemplateRequest struct {
	// Resource name of the organization and inspectTemplate to be read, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetInspectTemplateRequest) Reset()         { *m = GetInspectTemplateRequest{} }
func (m *GetInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*GetInspectTemplateRequest) ProtoMessage()    {}
func (*GetInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{75}
}

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

var xxx_messageInfo_GetInspectTemplateRequest proto.InternalMessageInfo

func (m *GetInspectTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for ListInspectTemplates.
type ListInspectTemplatesRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional page token to continue retrieval. Comes from previous call
	// to `ListInspectTemplates`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the template was created.
	// - `update_time`: corresponds to time the template was last updated.
	// - `name`: corresponds to template's name.
	// - `display_name`: corresponds to template's display name.
	OrderBy              string   `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListInspectTemplatesRequest) Reset()         { *m = ListInspectTemplatesRequest{} }
func (m *ListInspectTemplatesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInspectTemplatesRequest) ProtoMessage()    {}
func (*ListInspectTemplatesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{76}
}

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

var xxx_messageInfo_ListInspectTemplatesRequest proto.InternalMessageInfo

func (m *ListInspectTemplatesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListInspectTemplatesRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

func (m *ListInspectTemplatesRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListInspectTemplatesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

// Response message for ListInspectTemplates.
type ListInspectTemplatesResponse struct {
	// List of inspectTemplates, up to page_size in ListInspectTemplatesRequest.
	InspectTemplates []*InspectTemplate `protobuf:"bytes,1,rep,name=inspect_templates,json=inspectTemplates,proto3" json:"inspect_templates,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListInspectTemplates request.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListInspectTemplatesResponse) Reset()         { *m = ListInspectTemplatesResponse{} }
func (m *ListInspectTemplatesResponse) String() string { return proto.CompactTextString(m) }
func (*ListInspectTemplatesResponse) ProtoMessage()    {}
func (*ListInspectTemplatesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{77}
}

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

var xxx_messageInfo_ListInspectTemplatesResponse proto.InternalMessageInfo

func (m *ListInspectTemplatesResponse) GetInspectTemplates() []*InspectTemplate {
	if m != nil {
		return m.InspectTemplates
	}
	return nil
}

func (m *ListInspectTemplatesResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for DeleteInspectTemplate.
type DeleteInspectTemplateRequest struct {
	// Resource name of the organization and inspectTemplate to be deleted, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteInspectTemplateRequest) Reset()         { *m = DeleteInspectTemplateRequest{} }
func (m *DeleteInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteInspectTemplateRequest) ProtoMessage()    {}
func (*DeleteInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{78}
}

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

var xxx_messageInfo_DeleteInspectTemplateRequest proto.InternalMessageInfo

func (m *DeleteInspectTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for CreateJobTrigger.
type CreateJobTriggerRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The JobTrigger to create.
	JobTrigger *JobTrigger `protobuf:"bytes,2,opt,name=job_trigger,json=jobTrigger,proto3" json:"job_trigger,omitempty"`
	// The trigger id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TriggerId            string   `protobuf:"bytes,3,opt,name=trigger_id,json=triggerId,proto3" json:"trigger_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateJobTriggerRequest) Reset()         { *m = CreateJobTriggerRequest{} }
func (m *CreateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*CreateJobTriggerRequest) ProtoMessage()    {}
func (*CreateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{79}
}

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

var xxx_messageInfo_CreateJobTriggerRequest proto.InternalMessageInfo

func (m *CreateJobTriggerRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateJobTriggerRequest) GetJobTrigger() *JobTrigger {
	if m != nil {
		return m.JobTrigger
	}
	return nil
}

func (m *CreateJobTriggerRequest) GetTriggerId() string {
	if m != nil {
		return m.TriggerId
	}
	return ""
}

// Request message for ActivateJobTrigger.
type ActivateJobTriggerRequest struct {
	// Resource name of the trigger to activate, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ActivateJobTriggerRequest) Reset()         { *m = ActivateJobTriggerRequest{} }
func (m *ActivateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*ActivateJobTriggerRequest) ProtoMessage()    {}
func (*ActivateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{80}
}

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

var xxx_messageInfo_ActivateJobTriggerRequest proto.InternalMessageInfo

func (m *ActivateJobTriggerRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for UpdateJobTrigger.
type UpdateJobTriggerRequest struct {
	// Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New JobTrigger value.
	JobTrigger *JobTrigger `protobuf:"bytes,2,opt,name=job_trigger,json=jobTrigger,proto3" json:"job_trigger,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateJobTriggerRequest) Reset()         { *m = UpdateJobTriggerRequest{} }
func (m *UpdateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateJobTriggerRequest) ProtoMessage()    {}
func (*UpdateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{81}
}

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

var xxx_messageInfo_UpdateJobTriggerRequest proto.InternalMessageInfo

func (m *UpdateJobTriggerRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *UpdateJobTriggerRequest) GetJobTrigger() *JobTrigger {
	if m != nil {
		return m.JobTrigger
	}
	return nil
}

func (m *UpdateJobTriggerRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// Request message for GetJobTrigger.
type GetJobTriggerRequest struct {
	// Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetJobTriggerRequest) Reset()         { *m = GetJobTriggerRequest{} }
func (m *GetJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*GetJobTriggerRequest) ProtoMessage()    {}
func (*GetJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{82}
}

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

var xxx_messageInfo_GetJobTriggerRequest proto.InternalMessageInfo

func (m *GetJobTriggerRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for CreateDlpJobRequest. Used to initiate long running
// jobs such as calculating risk metrics or inspecting Google Cloud
// Storage.
type CreateDlpJobRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The configuration details for the specific type of job to run.
	//
	// Types that are valid to be assigned to Job:
	//	*CreateDlpJobRequest_InspectJob
	//	*CreateDlpJobRequest_RiskJob
	Job isCreateDlpJobRequest_Job `protobuf_oneof:"job"`
	// The job id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	JobId                string   `protobuf:"bytes,4,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateDlpJobRequest) Reset()         { *m = CreateDlpJobRequest{} }
func (m *CreateDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*CreateDlpJobRequest) ProtoMessage()    {}
func (*CreateDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{83}
}

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

var xxx_messageInfo_CreateDlpJobRequest proto.InternalMessageInfo

func (m *CreateDlpJobRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

type isCreateDlpJobRequest_Job interface {
	isCreateDlpJobRequest_Job()
}

type CreateDlpJobRequest_InspectJob struct {
	InspectJob *InspectJobConfig `protobuf:"bytes,2,opt,name=inspect_job,json=inspectJob,proto3,oneof"`
}

type CreateDlpJobRequest_RiskJob struct {
	RiskJob *RiskAnalysisJobConfig `protobuf:"bytes,3,opt,name=risk_job,json=riskJob,proto3,oneof"`
}

func (*CreateDlpJobRequest_InspectJob) isCreateDlpJobRequest_Job() {}

func (*CreateDlpJobRequest_RiskJob) isCreateDlpJobRequest_Job() {}

func (m *CreateDlpJobRequest) GetJob() isCreateDlpJobRequest_Job {
	if m != nil {
		return m.Job
	}
	return nil
}

func (m *CreateDlpJobRequest) GetInspectJob() *InspectJobConfig {
	if x, ok := m.GetJob().(*CreateDlpJobRequest_InspectJob); ok {
		return x.InspectJob
	}
	return nil
}

func (m *CreateDlpJobRequest) GetRiskJob() *RiskAnalysisJobConfig {
	if x, ok := m.GetJob().(*CreateDlpJobRequest_RiskJob); ok {
		return x.RiskJob
	}
	return nil
}

func (m *CreateDlpJobRequest) GetJobId() string {
	if m != nil {
		return m.JobId
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CreateDlpJobRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CreateDlpJobRequest_InspectJob)(nil),
		(*CreateDlpJobRequest_RiskJob)(nil),
	}
}

// Request message for ListJobTriggers.
type ListJobTriggersRequest struct {
	// The parent resource name, for example `projects/my-project-id`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional page token to continue retrieval. Comes from previous call
	// to ListJobTriggers. `order_by` field must not
	// change for subsequent calls.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional size of the page, can be limited by a server.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional comma separated list of triggeredJob fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the JobTrigger was created.
	// - `update_time`: corresponds to time the JobTrigger was last updated.
	// - `last_run_time`: corresponds to the last time the JobTrigger ran.
	// - `name`: corresponds to JobTrigger's name.
	// - `display_name`: corresponds to JobTrigger's display name.
	// - `status`: corresponds to JobTrigger's status.
	OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// Optional. Allows filtering.
	//
	// Supported syntax:
	//
	// * Filter expressions are made up of one or more restrictions.
	// * Restrictions can be combined by `AND` or `OR` logical operators. A
	// sequence of restrictions implicitly uses `AND`.
	// * A restriction has the form of `<field> <operator> <value>`.
	// * Supported fields/values for inspect jobs:
	//     - `status` - HEALTHY|PAUSED|CANCELLED
	//     - `inspected_storage` - DATASTORE|CLOUD_STORAGE|BIGQUERY
	//     - 'last_run_time` - RFC 3339 formatted timestamp, surrounded by
	//     quotation marks. Nanoseconds are ignored.
	//     - 'error_count' - Number of errors that have occurred while running.
	// * The operator must be `=` or `!=` for status and inspected_storage.
	//
	// Examples:
	//
	// * inspected_storage = cloud_storage AND status = HEALTHY
	// * inspected_storage = cloud_storage OR inspected_storage = bigquery
	// * inspected_storage = cloud_storage AND (state = PAUSED OR state = HEALTHY)
	// * last_run_time > \"2017-12-12T00:00:00+00:00\"
	//
	// The length of this field should be no more than 500 characters.
	Filter               string   `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListJobTriggersRequest) Reset()         { *m = ListJobTriggersRequest{} }
func (m *ListJobTriggersRequest) String() string { return proto.CompactTextString(m) }
func (*ListJobTriggersRequest) ProtoMessage()    {}
func (*ListJobTriggersRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{84}
}

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

var xxx_messageInfo_ListJobTriggersRequest proto.InternalMessageInfo

func (m *ListJobTriggersRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListJobTriggersRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

func (m *ListJobTriggersRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListJobTriggersRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListJobTriggersRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

// Response message for ListJobTriggers.
type ListJobTriggersResponse struct {
	// List of triggeredJobs, up to page_size in ListJobTriggersRequest.
	JobTriggers []*JobTrigger `protobuf:"bytes,1,rep,name=job_triggers,json=jobTriggers,proto3" json:"job_triggers,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListJobTriggers request.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListJobTriggersResponse) Reset()         { *m = ListJobTriggersResponse{} }
func (m *ListJobTriggersResponse) String() string { return proto.CompactTextString(m) }
func (*ListJobTriggersResponse) ProtoMessage()    {}
func (*ListJobTriggersResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{85}
}

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

var xxx_messageInfo_ListJobTriggersResponse proto.InternalMessageInfo

func (m *ListJobTriggersResponse) GetJobTriggers() []*JobTrigger {
	if m != nil {
		return m.JobTriggers
	}
	return nil
}

func (m *ListJobTriggersResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for DeleteJobTrigger.
type DeleteJobTriggerRequest struct {
	// Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteJobTriggerRequest) Reset()         { *m = DeleteJobTriggerRequest{} }
func (m *DeleteJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteJobTriggerRequest) ProtoMessage()    {}
func (*DeleteJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{86}
}

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

var xxx_messageInfo_DeleteJobTriggerRequest proto.InternalMessageInfo

func (m *DeleteJobTriggerRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

type InspectJobConfig struct {
	// The data to scan.
	StorageConfig *StorageConfig `protobuf:"bytes,1,opt,name=storage_config,json=storageConfig,proto3" json:"storage_config,omitempty"`
	// How and what to scan for.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// If provided, will be used as the default for all values in InspectConfig.
	// `inspect_config` will be merged into the values persisted as part of the
	// template.
	InspectTemplateName string `protobuf:"bytes,3,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Actions to execute at the completion of the job.
	Actions              []*Action `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *InspectJobConfig) Reset()         { *m = InspectJobConfig{} }
func (m *InspectJobConfig) String() string { return proto.CompactTextString(m) }
func (*InspectJobConfig) ProtoMessage()    {}
func (*InspectJobConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{87}
}

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

var xxx_messageInfo_InspectJobConfig proto.InternalMessageInfo

func (m *InspectJobConfig) GetStorageConfig() *StorageConfig {
	if m != nil {
		return m.StorageConfig
	}
	return nil
}

func (m *InspectJobConfig) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *InspectJobConfig) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *InspectJobConfig) GetActions() []*Action {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Combines all of the information about a DLP job.
type DlpJob struct {
	// The server-assigned name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The type of job.
	Type DlpJobType `protobuf:"varint,2,opt,name=type,proto3,enum=google.privacy.dlp.v2.DlpJobType" json:"type,omitempty"`
	// State of a job.
	State DlpJob_JobState `protobuf:"varint,3,opt,name=state,proto3,enum=google.privacy.dlp.v2.DlpJob_JobState" json:"state,omitempty"`
	// Types that are valid to be assigned to Details:
	//	*DlpJob_RiskDetails
	//	*DlpJob_InspectDetails
	Details isDlpJob_Details `protobuf_oneof:"details"`
	// Time when the job was created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Time when the job started.
	StartTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time when the job finished.
	EndTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// If created by a job trigger, the resource name of the trigger that
	// instantiated the job.
	JobTriggerName string `protobuf:"bytes,10,opt,name=job_trigger_name,json=jobTriggerName,proto3" json:"job_trigger_name,omitempty"`
	// A stream of errors encountered running the job.
	Errors               []*Error `protobuf:"bytes,11,rep,name=errors,proto3" json:"errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DlpJob) Reset()         { *m = DlpJob{} }
func (m *DlpJob) String() string { return proto.CompactTextString(m) }
func (*DlpJob) ProtoMessage()    {}
func (*DlpJob) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{88}
}

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

var xxx_messageInfo_DlpJob proto.InternalMessageInfo

func (m *DlpJob) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DlpJob) GetType() DlpJobType {
	if m != nil {
		return m.Type
	}
	return DlpJobType_DLP_JOB_TYPE_UNSPECIFIED
}

func (m *DlpJob) GetState() DlpJob_JobState {
	if m != nil {
		return m.State
	}
	return DlpJob_JOB_STATE_UNSPECIFIED
}

type isDlpJob_Details interface {
	isDlpJob_Details()
}

type DlpJob_RiskDetails struct {
	RiskDetails *AnalyzeDataSourceRiskDetails `protobuf:"bytes,4,opt,name=risk_details,json=riskDetails,proto3,oneof"`
}

type DlpJob_InspectDetails struct {
	InspectDetails *InspectDataSourceDetails `protobuf:"bytes,5,opt,name=inspect_details,json=inspectDetails,proto3,oneof"`
}

func (*DlpJob_RiskDetails) isDlpJob_Details() {}

func (*DlpJob_InspectDetails) isDlpJob_Details() {}

func (m *DlpJob) GetDetails() isDlpJob_Details {
	if m != nil {
		return m.Details
	}
	return nil
}

func (m *DlpJob) GetRiskDetails() *AnalyzeDataSourceRiskDetails {
	if x, ok := m.GetDetails().(*DlpJob_RiskDetails); ok {
		return x.RiskDetails
	}
	return nil
}

func (m *DlpJob) GetInspectDetails() *InspectDataSourceDetails {
	if x, ok := m.GetDetails().(*DlpJob_InspectDetails); ok {
		return x.InspectDetails
	}
	return nil
}

func (m *DlpJob) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *DlpJob) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *DlpJob) GetEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.EndTime
	}
	return nil
}

func (m *DlpJob) GetJobTriggerName() string {
	if m != nil {
		return m.JobTriggerName
	}
	return ""
}

func (m *DlpJob) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DlpJob) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DlpJob_RiskDetails)(nil),
		(*DlpJob_InspectDetails)(nil),
	}
}

// The request message for [DlpJobs.GetDlpJob][].
type GetDlpJobRequest struct {
	// The name of the DlpJob resource.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetDlpJobRequest) Reset()         { *m = GetDlpJobRequest{} }
func (m *GetDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*GetDlpJobRequest) ProtoMessage()    {}
func (*GetDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{89}
}

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

var xxx_messageInfo_GetDlpJobRequest proto.InternalMessageInfo

func (m *GetDlpJobRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// The request message for listing DLP jobs.
type ListDlpJobsRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional. Allows filtering.
	//
	// Supported syntax:
	//
	// * Filter expressions are made up of one or more restrictions.
	// * Restrictions can be combined by `AND` or `OR` logical operators. A
	// sequence of restrictions implicitly uses `AND`.
	// * A restriction has the form of `<field> <operator> <value>`.
	// * Supported fields/values for inspect jobs:
	//     - `state` - PENDING|RUNNING|CANCELED|FINISHED|FAILED
	//     - `inspected_storage` - DATASTORE|CLOUD_STORAGE|BIGQUERY
	//     - `trigger_name` - The resource name of the trigger that created job.
	//     - 'end_time` - Corresponds to time the job finished.
	//     - 'start_time` - Corresponds to time the job finished.
	// * Supported fields for risk analysis jobs:
	//     - `state` - RUNNING|CANCELED|FINISHED|FAILED
	//     - 'end_time` - Corresponds to time the job finished.
	//     - 'start_time` - Corresponds to time the job finished.
	// * The operator must be `=` or `!=`.
	//
	// Examples:
	//
	// * inspected_storage = cloud_storage AND state = done
	// * inspected_storage = cloud_storage OR inspected_storage = bigquery
	// * inspected_storage = cloud_storage AND (state = done OR state = canceled)
	// * end_time > \"2017-12-12T00:00:00+00:00\"
	//
	// The length of this field should be no more than 500 characters.
	Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"`
	// The standard list page size.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// The standard list page token.
	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// The type of job. Defaults to `DlpJobType.INSPECT`
	Type DlpJobType `protobuf:"varint,5,opt,name=type,proto3,enum=google.privacy.dlp.v2.DlpJobType" json:"type,omitempty"`
	// Optional comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc, end_time asc, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the job was created.
	// - `end_time`: corresponds to time the job ended.
	// - `name`: corresponds to job's name.
	// - `state`: corresponds to `state`
	OrderBy              string   `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDlpJobsRequest) Reset()         { *m = ListDlpJobsRequest{} }
func (m *ListDlpJobsRequest) String() string { return proto.CompactTextString(m) }
func (*ListDlpJobsRequest) ProtoMessage()    {}
func (*ListDlpJobsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{90}
}

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

var xxx_messageInfo_ListDlpJobsRequest proto.InternalMessageInfo

func (m *ListDlpJobsRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListDlpJobsRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

func (m *ListDlpJobsRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListDlpJobsRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

func (m *ListDlpJobsRequest) GetType() DlpJobType {
	if m != nil {
		return m.Type
	}
	return DlpJobType_DLP_JOB_TYPE_UNSPECIFIED
}

func (m *ListDlpJobsRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

// The response message for listing DLP jobs.
type ListDlpJobsResponse struct {
	// A list of DlpJobs that matches the specified filter in the request.
	Jobs []*DlpJob `protobuf:"bytes,1,rep,name=jobs,proto3" json:"jobs,omitempty"`
	// The standard List next-page token.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDlpJobsResponse) Reset()         { *m = ListDlpJobsResponse{} }
func (m *ListDlpJobsResponse) String() string { return proto.CompactTextString(m) }
func (*ListDlpJobsResponse) ProtoMessage()    {}
func (*ListDlpJobsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{91}
}

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

var xxx_messageInfo_ListDlpJobsResponse proto.InternalMessageInfo

func (m *ListDlpJobsResponse) GetJobs() []*DlpJob {
	if m != nil {
		return m.Jobs
	}
	return nil
}

func (m *ListDlpJobsResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// The request message for canceling a DLP job.
type CancelDlpJobRequest struct {
	// The name of the DlpJob resource to be cancelled.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CancelDlpJobRequest) Reset()         { *m = CancelDlpJobRequest{} }
func (m *CancelDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*CancelDlpJobRequest) ProtoMessage()    {}
func (*CancelDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{92}
}

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

var xxx_messageInfo_CancelDlpJobRequest proto.InternalMessageInfo

func (m *CancelDlpJobRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// The request message for deleting a DLP job.
type DeleteDlpJobRequest struct {
	// The name of the DlpJob resource to be deleted.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteDlpJobRequest) Reset()         { *m = DeleteDlpJobRequest{} }
func (m *DeleteDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteDlpJobRequest) ProtoMessage()    {}
func (*DeleteDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{93}
}

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

var xxx_messageInfo_DeleteDlpJobRequest proto.InternalMessageInfo

func (m *DeleteDlpJobRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for CreateDeidentifyTemplate.
type CreateDeidentifyTemplateRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The DeidentifyTemplate to create.
	DeidentifyTemplate *DeidentifyTemplate `protobuf:"bytes,2,opt,name=deidentify_template,json=deidentifyTemplate,proto3" json:"deidentify_template,omitempty"`
	// The template id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TemplateId           string   `protobuf:"bytes,3,opt,name=template_id,json=templateId,proto3" json:"template_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateDeidentifyTemplateRequest) Reset()         { *m = CreateDeidentifyTemplateRequest{} }
func (m *CreateDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateDeidentifyTemplateRequest) ProtoMessage()    {}
func (*CreateDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{94}
}

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

var xxx_messageInfo_CreateDeidentifyTemplateRequest proto.InternalMessageInfo

func (m *CreateDeidentifyTemplateRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateDeidentifyTemplateRequest) GetDeidentifyTemplate() *DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplate
	}
	return nil
}

func (m *CreateDeidentifyTemplateRequest) GetTemplateId() string {
	if m != nil {
		return m.TemplateId
	}
	return ""
}

// Request message for UpdateDeidentifyTemplate.
type UpdateDeidentifyTemplateRequest struct {
	// Resource name of organization and deidentify template to be updated, for
	// example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New DeidentifyTemplate value.
	DeidentifyTemplate *DeidentifyTemplate `protobuf:"bytes,2,opt,name=deidentify_template,json=deidentifyTemplate,proto3" json:"deidentify_template,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateDeidentifyTemplateRequest) Reset()         { *m = UpdateDeidentifyTemplateRequest{} }
func (m *UpdateDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateDeidentifyTemplateRequest) ProtoMessage()    {}
func (*UpdateDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{95}
}

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

var xxx_messageInfo_UpdateDeidentifyTemplateRequest proto.InternalMessageInfo

func (m *UpdateDeidentifyTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *UpdateDeidentifyTemplateRequest) GetDeidentifyTemplate() *DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplate
	}
	return nil
}

func (m *UpdateDeidentifyTemplateRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// Request message for GetDeidentifyTemplate.
type GetDeidentifyTemplateRequest struct {
	// Resource name of the organization and deidentify template to be read, for
	// example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetDeidentifyTemplateRequest) Reset()         { *m = GetDeidentifyTemplateRequest{} }
func (m *GetDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*GetDeidentifyTemplateRequest) ProtoMessage()    {}
func (*GetDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{96}
}

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

var xxx_messageInfo_GetDeidentifyTemplateRequest proto.InternalMessageInfo

func (m *GetDeidentifyTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for ListDeidentifyTemplates.
type ListDeidentifyTemplatesRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional page token to continue retrieval. Comes from previous call
	// to `ListDeidentifyTemplates`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the template was created.
	// - `update_time`: corresponds to time the template was last updated.
	// - `name`: corresponds to template's name.
	// - `display_name`: corresponds to template's display name.
	OrderBy              string   `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDeidentifyTemplatesRequest) Reset()         { *m = ListDeidentifyTemplatesRequest{} }
func (m *ListDeidentifyTemplatesRequest) String() string { return proto.CompactTextString(m) }
func (*ListDeidentifyTemplatesRequest) ProtoMessage()    {}
func (*ListDeidentifyTemplatesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{97}
}

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

var xxx_messageInfo_ListDeidentifyTemplatesRequest proto.InternalMessageInfo

func (m *ListDeidentifyTemplatesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListDeidentifyTemplatesRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

func (m *ListDeidentifyTemplatesRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListDeidentifyTemplatesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

// Response message for ListDeidentifyTemplates.
type ListDeidentifyTemplatesResponse struct {
	// List of deidentify templates, up to page_size in
	// ListDeidentifyTemplatesRequest.
	DeidentifyTemplates []*DeidentifyTemplate `protobuf:"bytes,1,rep,name=deidentify_templates,json=deidentifyTemplates,proto3" json:"deidentify_templates,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListDeidentifyTemplates request.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDeidentifyTemplatesResponse) Reset()         { *m = ListDeidentifyTemplatesResponse{} }
func (m *ListDeidentifyTemplatesResponse) String() string { return proto.CompactTextString(m) }
func (*ListDeidentifyTemplatesResponse) ProtoMessage()    {}
func (*ListDeidentifyTemplatesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{98}
}

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

var xxx_messageInfo_ListDeidentifyTemplatesResponse proto.InternalMessageInfo

func (m *ListDeidentifyTemplatesResponse) GetDeidentifyTemplates() []*DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplates
	}
	return nil
}

func (m *ListDeidentifyTemplatesResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for DeleteDeidentifyTemplate.
type DeleteDeidentifyTemplateRequest struct {
	// Resource name of the organization and deidentify template to be deleted,
	// for example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteDeidentifyTemplateRequest) Reset()         { *m = DeleteDeidentifyTemplateRequest{} }
func (m *DeleteDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteDeidentifyTemplateRequest) ProtoMessage()    {}
func (*DeleteDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{99}
}

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

var xxx_messageInfo_DeleteDeidentifyTemplateRequest proto.InternalMessageInfo

func (m *DeleteDeidentifyTemplateRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Configuration for a custom dictionary created from a data source of any size
// up to the maximum size defined in the
// [limits](https://cloud.google.com/dlp/limits) page. The artifacts of
// dictionary creation are stored in the specified Google Cloud Storage
// location. Consider using `CustomInfoType.Dictionary` for smaller dictionaries
// that satisfy the size requirements.
type LargeCustomDictionaryConfig struct {
	// Location to store dictionary artifacts in Google Cloud Storage. These files
	// will only be accessible by project owners and the DLP API. If any of these
	// artifacts are modified, the dictionary is considered invalid and can no
	// longer be used.
	OutputPath *CloudStoragePath `protobuf:"bytes,1,opt,name=output_path,json=outputPath,proto3" json:"output_path,omitempty"`
	// Types that are valid to be assigned to Source:
	//	*LargeCustomDictionaryConfig_CloudStorageFileSet
	//	*LargeCustomDictionaryConfig_BigQueryField
	Source               isLargeCustomDictionaryConfig_Source `protobuf_oneof:"source"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *LargeCustomDictionaryConfig) Reset()         { *m = LargeCustomDictionaryConfig{} }
func (m *LargeCustomDictionaryConfig) String() string { return proto.CompactTextString(m) }
func (*LargeCustomDictionaryConfig) ProtoMessage()    {}
func (*LargeCustomDictionaryConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{100}
}

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

var xxx_messageInfo_LargeCustomDictionaryConfig proto.InternalMessageInfo

func (m *LargeCustomDictionaryConfig) GetOutputPath() *CloudStoragePath {
	if m != nil {
		return m.OutputPath
	}
	return nil
}

type isLargeCustomDictionaryConfig_Source interface {
	isLargeCustomDictionaryConfig_Source()
}

type LargeCustomDictionaryConfig_CloudStorageFileSet struct {
	CloudStorageFileSet *CloudStorageFileSet `protobuf:"bytes,2,opt,name=cloud_storage_file_set,json=cloudStorageFileSet,proto3,oneof"`
}

type LargeCustomDictionaryConfig_BigQueryField struct {
	BigQueryField *BigQueryField `protobuf:"bytes,3,opt,name=big_query_field,json=bigQueryField,proto3,oneof"`
}

func (*LargeCustomDictionaryConfig_CloudStorageFileSet) isLargeCustomDictionaryConfig_Source() {}

func (*LargeCustomDictionaryConfig_BigQueryField) isLargeCustomDictionaryConfig_Source() {}

func (m *LargeCustomDictionaryConfig) GetSource() isLargeCustomDictionaryConfig_Source {
	if m != nil {
		return m.Source
	}
	return nil
}

func (m *LargeCustomDictionaryConfig) GetCloudStorageFileSet() *CloudStorageFileSet {
	if x, ok := m.GetSource().(*LargeCustomDictionaryConfig_CloudStorageFileSet); ok {
		return x.CloudStorageFileSet
	}
	return nil
}

func (m *LargeCustomDictionaryConfig) GetBigQueryField() *BigQueryField {
	if x, ok := m.GetSource().(*LargeCustomDictionaryConfig_BigQueryField); ok {
		return x.BigQueryField
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*LargeCustomDictionaryConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*LargeCustomDictionaryConfig_CloudStorageFileSet)(nil),
		(*LargeCustomDictionaryConfig_BigQueryField)(nil),
	}
}

// Summary statistics of a custom dictionary.
type LargeCustomDictionaryStats struct {
	// Approximate number of distinct phrases in the dictionary.
	ApproxNumPhrases     int64    `protobuf:"varint,1,opt,name=approx_num_phrases,json=approxNumPhrases,proto3" json:"approx_num_phrases,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LargeCustomDictionaryStats) Reset()         { *m = LargeCustomDictionaryStats{} }
func (m *LargeCustomDictionaryStats) String() string { return proto.CompactTextString(m) }
func (*LargeCustomDictionaryStats) ProtoMessage()    {}
func (*LargeCustomDictionaryStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{101}
}

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

var xxx_messageInfo_LargeCustomDictionaryStats proto.InternalMessageInfo

func (m *LargeCustomDictionaryStats) GetApproxNumPhrases() int64 {
	if m != nil {
		return m.ApproxNumPhrases
	}
	return 0
}

// Configuration for a StoredInfoType.
type StoredInfoTypeConfig struct {
	// Display name of the StoredInfoType (max 256 characters).
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Description of the StoredInfoType (max 256 characters).
	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Types that are valid to be assigned to Type:
	//	*StoredInfoTypeConfig_LargeCustomDictionary
	Type                 isStoredInfoTypeConfig_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *StoredInfoTypeConfig) Reset()         { *m = StoredInfoTypeConfig{} }
func (m *StoredInfoTypeConfig) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeConfig) ProtoMessage()    {}
func (*StoredInfoTypeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{102}
}

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

var xxx_messageInfo_StoredInfoTypeConfig proto.InternalMessageInfo

func (m *StoredInfoTypeConfig) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *StoredInfoTypeConfig) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type isStoredInfoTypeConfig_Type interface {
	isStoredInfoTypeConfig_Type()
}

type StoredInfoTypeConfig_LargeCustomDictionary struct {
	LargeCustomDictionary *LargeCustomDictionaryConfig `protobuf:"bytes,3,opt,name=large_custom_dictionary,json=largeCustomDictionary,proto3,oneof"`
}

func (*StoredInfoTypeConfig_LargeCustomDictionary) isStoredInfoTypeConfig_Type() {}

func (m *StoredInfoTypeConfig) GetType() isStoredInfoTypeConfig_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *StoredInfoTypeConfig) GetLargeCustomDictionary() *LargeCustomDictionaryConfig {
	if x, ok := m.GetType().(*StoredInfoTypeConfig_LargeCustomDictionary); ok {
		return x.LargeCustomDictionary
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StoredInfoTypeConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StoredInfoTypeConfig_LargeCustomDictionary)(nil),
	}
}

// Statistics for a StoredInfoType.
type StoredInfoTypeStats struct {
	// Types that are valid to be assigned to Type:
	//	*StoredInfoTypeStats_LargeCustomDictionary
	Type                 isStoredInfoTypeStats_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *StoredInfoTypeStats) Reset()         { *m = StoredInfoTypeStats{} }
func (m *StoredInfoTypeStats) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeStats) ProtoMessage()    {}
func (*StoredInfoTypeStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{103}
}

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

var xxx_messageInfo_StoredInfoTypeStats proto.InternalMessageInfo

type isStoredInfoTypeStats_Type interface {
	isStoredInfoTypeStats_Type()
}

type StoredInfoTypeStats_LargeCustomDictionary struct {
	LargeCustomDictionary *LargeCustomDictionaryStats `protobuf:"bytes,1,opt,name=large_custom_dictionary,json=largeCustomDictionary,proto3,oneof"`
}

func (*StoredInfoTypeStats_LargeCustomDictionary) isStoredInfoTypeStats_Type() {}

func (m *StoredInfoTypeStats) GetType() isStoredInfoTypeStats_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *StoredInfoTypeStats) GetLargeCustomDictionary() *LargeCustomDictionaryStats {
	if x, ok := m.GetType().(*StoredInfoTypeStats_LargeCustomDictionary); ok {
		return x.LargeCustomDictionary
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StoredInfoTypeStats) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StoredInfoTypeStats_LargeCustomDictionary)(nil),
	}
}

// Version of a StoredInfoType, including the configuration used to build it,
// create timestamp, and current state.
type StoredInfoTypeVersion struct {
	// StoredInfoType configuration.
	Config *StoredInfoTypeConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// Create timestamp of the version. Read-only, determined by the system
	// when the version is created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Stored info type version state. Read-only, updated by the system
	// during dictionary creation.
	State StoredInfoTypeState `protobuf:"varint,3,opt,name=state,proto3,enum=google.privacy.dlp.v2.StoredInfoTypeState" json:"state,omitempty"`
	// Errors that occurred when creating this storedInfoType version, or
	// anomalies detected in the storedInfoType data that render it unusable. Only
	// the five most recent errors will be displayed, with the most recent error
	// appearing first.
	// <p>For example, some of the data for stored custom dictionaries is put in
	// the user's Google Cloud Storage bucket, and if this data is modified or
	// deleted by the user or another system, the dictionary becomes invalid.
	// <p>If any errors occur, fix the problem indicated by the error message and
	// use the UpdateStoredInfoType API method to create another version of the
	// storedInfoType to continue using it, reusing the same `config` if it was
	// not the source of the error.
	Errors []*Error `protobuf:"bytes,4,rep,name=errors,proto3" json:"errors,omitempty"`
	// Statistics about this storedInfoType version.
	Stats                *StoredInfoTypeStats `protobuf:"bytes,5,opt,name=stats,proto3" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *StoredInfoTypeVersion) Reset()         { *m = StoredInfoTypeVersion{} }
func (m *StoredInfoTypeVersion) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeVersion) ProtoMessage()    {}
func (*StoredInfoTypeVersion) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{104}
}

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

var xxx_messageInfo_StoredInfoTypeVersion proto.InternalMessageInfo

func (m *StoredInfoTypeVersion) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *StoredInfoTypeVersion) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *StoredInfoTypeVersion) GetState() StoredInfoTypeState {
	if m != nil {
		return m.State
	}
	return StoredInfoTypeState_STORED_INFO_TYPE_STATE_UNSPECIFIED
}

func (m *StoredInfoTypeVersion) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

func (m *StoredInfoTypeVersion) GetStats() *StoredInfoTypeStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

// StoredInfoType resource message that contains information about the current
// version and any pending updates.
type StoredInfoType struct {
	// Resource name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Current version of the stored info type.
	CurrentVersion *StoredInfoTypeVersion `protobuf:"bytes,2,opt,name=current_version,json=currentVersion,proto3" json:"current_version,omitempty"`
	// Pending versions of the stored info type. Empty if no versions are
	// pending.
	PendingVersions      []*StoredInfoTypeVersion `protobuf:"bytes,3,rep,name=pending_versions,json=pendingVersions,proto3" json:"pending_versions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *StoredInfoType) Reset()         { *m = StoredInfoType{} }
func (m *StoredInfoType) String() string { return proto.CompactTextString(m) }
func (*StoredInfoType) ProtoMessage()    {}
func (*StoredInfoType) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{105}
}

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

var xxx_messageInfo_StoredInfoType proto.InternalMessageInfo

func (m *StoredInfoType) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *StoredInfoType) GetCurrentVersion() *StoredInfoTypeVersion {
	if m != nil {
		return m.CurrentVersion
	}
	return nil
}

func (m *StoredInfoType) GetPendingVersions() []*StoredInfoTypeVersion {
	if m != nil {
		return m.PendingVersions
	}
	return nil
}

// Request message for CreateStoredInfoType.
type CreateStoredInfoTypeRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration of the storedInfoType to create.
	Config *StoredInfoTypeConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
	// The storedInfoType ID can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	StoredInfoTypeId     string   `protobuf:"bytes,3,opt,name=stored_info_type_id,json=storedInfoTypeId,proto3" json:"stored_info_type_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateStoredInfoTypeRequest) Reset()         { *m = CreateStoredInfoTypeRequest{} }
func (m *CreateStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*CreateStoredInfoTypeRequest) ProtoMessage()    {}
func (*CreateStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{106}
}

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

var xxx_messageInfo_CreateStoredInfoTypeRequest proto.InternalMessageInfo

func (m *CreateStoredInfoTypeRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateStoredInfoTypeRequest) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *CreateStoredInfoTypeRequest) GetStoredInfoTypeId() string {
	if m != nil {
		return m.StoredInfoTypeId
	}
	return ""
}

// Request message for UpdateStoredInfoType.
type UpdateStoredInfoTypeRequest struct {
	// Resource name of organization and storedInfoType to be updated, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Updated configuration for the storedInfoType. If not provided, a new
	// version of the storedInfoType will be created with the existing
	// configuration.
	Config *StoredInfoTypeConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateStoredInfoTypeRequest) Reset()         { *m = UpdateStoredInfoTypeRequest{} }
func (m *UpdateStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateStoredInfoTypeRequest) ProtoMessage()    {}
func (*UpdateStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{107}
}

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

var xxx_messageInfo_UpdateStoredInfoTypeRequest proto.InternalMessageInfo

func (m *UpdateStoredInfoTypeRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *UpdateStoredInfoTypeRequest) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *UpdateStoredInfoTypeRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// Request message for GetStoredInfoType.
type GetStoredInfoTypeRequest struct {
	// Resource name of the organization and storedInfoType to be read, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetStoredInfoTypeRequest) Reset()         { *m = GetStoredInfoTypeRequest{} }
func (m *GetStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*GetStoredInfoTypeRequest) ProtoMessage()    {}
func (*GetStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{108}
}

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

var xxx_messageInfo_GetStoredInfoTypeRequest proto.InternalMessageInfo

func (m *GetStoredInfoTypeRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for ListStoredInfoTypes.
type ListStoredInfoTypesRequest struct {
	// The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional page token to continue retrieval. Comes from previous call
	// to `ListStoredInfoTypes`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc, display_name, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the most recent version of the
	// resource was created.
	// - `state`: corresponds to the state of the resource.
	// - `name`: corresponds to resource name.
	// - `display_name`: corresponds to info type's display name.
	OrderBy              string   `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListStoredInfoTypesRequest) Reset()         { *m = ListStoredInfoTypesRequest{} }
func (m *ListStoredInfoTypesRequest) String() string { return proto.CompactTextString(m) }
func (*ListStoredInfoTypesRequest) ProtoMessage()    {}
func (*ListStoredInfoTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{109}
}

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

var xxx_messageInfo_ListStoredInfoTypesRequest proto.InternalMessageInfo

func (m *ListStoredInfoTypesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListStoredInfoTypesRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

func (m *ListStoredInfoTypesRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListStoredInfoTypesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

// Response message for ListStoredInfoTypes.
type ListStoredInfoTypesResponse struct {
	// List of storedInfoTypes, up to page_size in ListStoredInfoTypesRequest.
	StoredInfoTypes []*StoredInfoType `protobuf:"bytes,1,rep,name=stored_info_types,json=storedInfoTypes,proto3" json:"stored_info_types,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListStoredInfoTypes request.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListStoredInfoTypesResponse) Reset()         { *m = ListStoredInfoTypesResponse{} }
func (m *ListStoredInfoTypesResponse) String() string { return proto.CompactTextString(m) }
func (*ListStoredInfoTypesResponse) ProtoMessage()    {}
func (*ListStoredInfoTypesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{110}
}

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

var xxx_messageInfo_ListStoredInfoTypesResponse proto.InternalMessageInfo

func (m *ListStoredInfoTypesResponse) GetStoredInfoTypes() []*StoredInfoType {
	if m != nil {
		return m.StoredInfoTypes
	}
	return nil
}

func (m *ListStoredInfoTypesResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for DeleteStoredInfoType.
type DeleteStoredInfoTypeRequest struct {
	// Resource name of the organization and storedInfoType to be deleted, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteStoredInfoTypeRequest) Reset()         { *m = DeleteStoredInfoTypeRequest{} }
func (m *DeleteStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteStoredInfoTypeRequest) ProtoMessage()    {}
func (*DeleteStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{111}
}

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

var xxx_messageInfo_DeleteStoredInfoTypeRequest proto.InternalMessageInfo

func (m *DeleteStoredInfoTypeRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func init() {
	proto.RegisterEnum("google.privacy.dlp.v2.ContentOption", ContentOption_name, ContentOption_value)
	proto.RegisterEnum("google.privacy.dlp.v2.MatchingType", MatchingType_name, MatchingType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.InfoTypeSupportedBy", InfoTypeSupportedBy_name, InfoTypeSupportedBy_value)
	proto.RegisterEnum("google.privacy.dlp.v2.RelationalOperator", RelationalOperator_name, RelationalOperator_value)
	proto.RegisterEnum("google.privacy.dlp.v2.DlpJobType", DlpJobType_name, DlpJobType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.StoredInfoTypeState", StoredInfoTypeState_name, StoredInfoTypeState_value)
	proto.RegisterEnum("google.privacy.dlp.v2.ByteContentItem_BytesType", ByteContentItem_BytesType_name, ByteContentItem_BytesType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.OutputStorageConfig_OutputSchema", OutputStorageConfig_OutputSchema_name, OutputStorageConfig_OutputSchema_value)
	proto.RegisterEnum("google.privacy.dlp.v2.TimePartConfig_TimePart", TimePartConfig_TimePart_name, TimePartConfig_TimePart_value)
	proto.RegisterEnum("google.privacy.dlp.v2.CharsToIgnore_CommonCharsToIgnore", CharsToIgnore_CommonCharsToIgnore_name, CharsToIgnore_CommonCharsToIgnore_value)
	proto.RegisterEnum("google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet", CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name, CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_value)
	proto.RegisterEnum("google.privacy.dlp.v2.RecordCondition_Expressions_LogicalOperator", RecordCondition_Expressions_LogicalOperator_name, RecordCondition_Expressions_LogicalOperator_value)
	proto.RegisterEnum("google.privacy.dlp.v2.TransformationSummary_TransformationResultCode", TransformationSummary_TransformationResultCode_name, TransformationSummary_TransformationResultCode_value)
	proto.RegisterEnum("google.privacy.dlp.v2.JobTrigger_Status", JobTrigger_Status_name, JobTrigger_Status_value)
	proto.RegisterEnum("google.privacy.dlp.v2.DlpJob_JobState", DlpJob_JobState_name, DlpJob_JobState_value)
	proto.RegisterType((*ExcludeInfoTypes)(nil), "google.privacy.dlp.v2.ExcludeInfoTypes")
	proto.RegisterType((*ExclusionRule)(nil), "google.privacy.dlp.v2.ExclusionRule")
	proto.RegisterType((*InspectionRule)(nil), "google.privacy.dlp.v2.InspectionRule")
	proto.RegisterType((*InspectionRuleSet)(nil), "google.privacy.dlp.v2.InspectionRuleSet")
	proto.RegisterType((*InspectConfig)(nil), "google.privacy.dlp.v2.InspectConfig")
	proto.RegisterType((*InspectConfig_FindingLimits)(nil), "google.privacy.dlp.v2.InspectConfig.FindingLimits")
	proto.RegisterType((*InspectConfig_FindingLimits_InfoTypeLimit)(nil), "google.privacy.dlp.v2.InspectConfig.FindingLimits.InfoTypeLimit")
	proto.RegisterType((*ByteContentItem)(nil), "google.privacy.dlp.v2.ByteContentItem")
	proto.RegisterType((*ContentItem)(nil), "google.privacy.dlp.v2.ContentItem")
	proto.RegisterType((*Table)(nil), "google.privacy.dlp.v2.Table")
	proto.RegisterType((*Table_Row)(nil), "google.privacy.dlp.v2.Table.Row")
	proto.RegisterType((*InspectResult)(nil), "google.privacy.dlp.v2.InspectResult")
	proto.RegisterType((*Finding)(nil), "google.privacy.dlp.v2.Finding")
	proto.RegisterType((*Location)(nil), "google.privacy.dlp.v2.Location")
	proto.RegisterType((*ContentLocation)(nil), "google.privacy.dlp.v2.ContentLocation")
	proto.RegisterType((*DocumentLocation)(nil), "google.privacy.dlp.v2.DocumentLocation")
	proto.RegisterType((*RecordLocation)(nil), "google.privacy.dlp.v2.RecordLocation")
	proto.RegisterType((*TableLocation)(nil), "google.privacy.dlp.v2.TableLocation")
	proto.RegisterType((*Range)(nil), "google.privacy.dlp.v2.Range")
	proto.RegisterType((*ImageLocation)(nil), "google.privacy.dlp.v2.ImageLocation")
	proto.RegisterType((*BoundingBox)(nil), "google.privacy.dlp.v2.BoundingBox")
	proto.RegisterType((*RedactImageRequest)(nil), "google.privacy.dlp.v2.RedactImageRequest")
	proto.RegisterType((*RedactImageRequest_ImageRedactionConfig)(nil), "google.privacy.dlp.v2.RedactImageRequest.ImageRedactionConfig")
	proto.RegisterType((*Color)(nil), "google.privacy.dlp.v2.Color")
	proto.RegisterType((*RedactImageResponse)(nil), "google.privacy.dlp.v2.RedactImageResponse")
	proto.RegisterType((*DeidentifyContentRequest)(nil), "google.privacy.dlp.v2.DeidentifyContentRequest")
	proto.RegisterType((*DeidentifyContentResponse)(nil), "google.privacy.dlp.v2.DeidentifyContentResponse")
	proto.RegisterType((*ReidentifyContentRequest)(nil), "google.privacy.dlp.v2.ReidentifyContentRequest")
	proto.RegisterType((*ReidentifyContentResponse)(nil), "google.privacy.dlp.v2.ReidentifyContentResponse")
	proto.RegisterType((*InspectContentRequest)(nil), "google.privacy.dlp.v2.InspectContentRequest")
	proto.RegisterType((*InspectContentResponse)(nil), "google.privacy.dlp.v2.InspectContentResponse")
	proto.RegisterType((*OutputStorageConfig)(nil), "google.privacy.dlp.v2.OutputStorageConfig")
	proto.RegisterType((*InfoTypeStats)(nil), "google.privacy.dlp.v2.InfoTypeStats")
	proto.RegisterType((*InspectDataSourceDetails)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails")
	proto.RegisterType((*InspectDataSourceDetails_RequestedOptions)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails.RequestedOptions")
	proto.RegisterType((*InspectDataSourceDetails_Result)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails.Result")
	proto.RegisterType((*InfoTypeDescription)(nil), "google.privacy.dlp.v2.InfoTypeDescription")
	proto.RegisterType((*ListInfoTypesRequest)(nil), "google.privacy.dlp.v2.ListInfoTypesRequest")
	proto.RegisterType((*ListInfoTypesResponse)(nil), "google.privacy.dlp.v2.ListInfoTypesResponse")
	proto.RegisterType((*RiskAnalysisJobConfig)(nil), "google.privacy.dlp.v2.RiskAnalysisJobConfig")
	proto.RegisterType((*QuasiId)(nil), "google.privacy.dlp.v2.QuasiId")
	proto.RegisterType((*StatisticalTable)(nil), "google.privacy.dlp.v2.StatisticalTable")
	proto.RegisterType((*StatisticalTable_QuasiIdentifierField)(nil), "google.privacy.dlp.v2.StatisticalTable.QuasiIdentifierField")
	proto.RegisterType((*PrivacyMetric)(nil), "google.privacy.dlp.v2.PrivacyMetric")
	proto.RegisterType((*PrivacyMetric_NumericalStatsConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.NumericalStatsConfig")
	proto.RegisterType((*PrivacyMetric_CategoricalStatsConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.CategoricalStatsConfig")
	proto.RegisterType((*PrivacyMetric_KAnonymityConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.KAnonymityConfig")
	proto.RegisterType((*PrivacyMetric_LDiversityConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.LDiversityConfig")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_TaggedField)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.TaggedField")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.AuxiliaryTable")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.AuxiliaryTable.QuasiIdField")
	proto.RegisterType((*PrivacyMetric_DeltaPresenceEstimationConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.DeltaPresenceEstimationConfig")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_NumericalStatsResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.NumericalStatsResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_CategoricalStatsResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.CategoricalStatsResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.CategoricalStatsResult.CategoricalStatsHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult.KAnonymityEquivalenceClass")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult.KAnonymityHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult.LDiversityEquivalenceClass")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult.LDiversityHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult.KMapEstimationQuasiIdValues")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult.KMapEstimationHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult.DeltaPresenceEstimationQuasiIdValues")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult.DeltaPresenceEstimationHistogramBucket")
	proto.RegisterType((*ValueFrequency)(nil), "google.privacy.dlp.v2.ValueFrequency")
	proto.RegisterType((*Value)(nil), "google.privacy.dlp.v2.Value")
	proto.RegisterType((*QuoteInfo)(nil), "google.privacy.dlp.v2.QuoteInfo")
	proto.RegisterType((*DateTime)(nil), "google.privacy.dlp.v2.DateTime")
	proto.RegisterType((*DateTime_TimeZone)(nil), "google.privacy.dlp.v2.DateTime.TimeZone")
	proto.RegisterType((*DeidentifyConfig)(nil), "google.privacy.dlp.v2.DeidentifyConfig")
	proto.RegisterType((*PrimitiveTransformation)(nil), "google.privacy.dlp.v2.PrimitiveTransformation")
	proto.RegisterType((*TimePartConfig)(nil), "google.privacy.dlp.v2.TimePartConfig")
	proto.RegisterType((*CryptoHashConfig)(nil), "google.privacy.dlp.v2.CryptoHashConfig")
	proto.RegisterType((*CryptoDeterministicConfig)(nil), "google.privacy.dlp.v2.CryptoDeterministicConfig")
	proto.RegisterType((*ReplaceValueConfig)(nil), "google.privacy.dlp.v2.ReplaceValueConfig")
	proto.RegisterType((*ReplaceWithInfoTypeConfig)(nil), "google.privacy.dlp.v2.ReplaceWithInfoTypeConfig")
	proto.RegisterType((*RedactConfig)(nil), "google.privacy.dlp.v2.RedactConfig")
	proto.RegisterType((*CharsToIgnore)(nil), "google.privacy.dlp.v2.CharsToIgnore")
	proto.RegisterType((*CharacterMaskConfig)(nil), "google.privacy.dlp.v2.CharacterMaskConfig")
	proto.RegisterType((*FixedSizeBucketingConfig)(nil), "google.privacy.dlp.v2.FixedSizeBucketingConfig")
	proto.RegisterType((*BucketingConfig)(nil), "google.privacy.dlp.v2.BucketingConfig")
	proto.RegisterType((*BucketingConfig_Bucket)(nil), "google.privacy.dlp.v2.BucketingConfig.Bucket")
	proto.RegisterType((*CryptoReplaceFfxFpeConfig)(nil), "google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig")
	proto.RegisterType((*CryptoKey)(nil), "google.privacy.dlp.v2.CryptoKey")
	proto.RegisterType((*TransientCryptoKey)(nil), "google.privacy.dlp.v2.TransientCryptoKey")
	proto.RegisterType((*UnwrappedCryptoKey)(nil), "google.privacy.dlp.v2.UnwrappedCryptoKey")
	proto.RegisterType((*KmsWrappedCryptoKey)(nil), "google.privacy.dlp.v2.KmsWrappedCryptoKey")
	proto.RegisterType((*DateShiftConfig)(nil), "google.privacy.dlp.v2.DateShiftConfig")
	proto.RegisterType((*InfoTypeTransformations)(nil), "google.privacy.dlp.v2.InfoTypeTransformations")
	proto.RegisterType((*InfoTypeTransformations_InfoTypeTransformation)(nil), "google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation")
	proto.RegisterType((*FieldTransformation)(nil), "google.privacy.dlp.v2.FieldTransformation")
	proto.RegisterType((*RecordTransformations)(nil), "google.privacy.dlp.v2.RecordTransformations")
	proto.RegisterType((*RecordSuppression)(nil), "google.privacy.dlp.v2.RecordSuppression")
	proto.RegisterType((*RecordCondition)(nil), "google.privacy.dlp.v2.RecordCondition")
	proto.RegisterType((*RecordCondition_Condition)(nil), "google.privacy.dlp.v2.RecordCondition.Condition")
	proto.RegisterType((*RecordCondition_Conditions)(nil), "google.privacy.dlp.v2.RecordCondition.Conditions")
	proto.RegisterType((*RecordCondition_Expressions)(nil), "google.privacy.dlp.v2.RecordCondition.Expressions")
	proto.RegisterType((*TransformationOverview)(nil), "google.privacy.dlp.v2.TransformationOverview")
	proto.RegisterType((*TransformationSummary)(nil), "google.privacy.dlp.v2.TransformationSummary")
	proto.RegisterType((*TransformationSummary_SummaryResult)(nil), "google.privacy.dlp.v2.TransformationSummary.SummaryResult")
	proto.RegisterType((*Schedule)(nil), "google.privacy.dlp.v2.Schedule")
	proto.RegisterType((*InspectTemplate)(nil), "google.privacy.dlp.v2.InspectTemplate")
	proto.RegisterType((*DeidentifyTemplate)(nil), "google.privacy.dlp.v2.DeidentifyTemplate")
	proto.RegisterType((*Error)(nil), "google.privacy.dlp.v2.Error")
	proto.RegisterType((*JobTrigger)(nil), "google.privacy.dlp.v2.JobTrigger")
	proto.RegisterType((*JobTrigger_Trigger)(nil), "google.privacy.dlp.v2.JobTrigger.Trigger")
	proto.RegisterType((*Action)(nil), "google.privacy.dlp.v2.Action")
	proto.RegisterType((*Action_SaveFindings)(nil), "google.privacy.dlp.v2.Action.SaveFindings")
	proto.RegisterType((*Action_PublishToPubSub)(nil), "google.privacy.dlp.v2.Action.PublishToPubSub")
	proto.RegisterType((*Action_PublishSummaryToCscc)(nil), "google.privacy.dlp.v2.Action.PublishSummaryToCscc")
	proto.RegisterType((*Action_PublishFindingsToCloudDataCatalog)(nil), "google.privacy.dlp.v2.Action.PublishFindingsToCloudDataCatalog")
	proto.RegisterType((*Action_JobNotificationEmails)(nil), "google.privacy.dlp.v2.Action.JobNotificationEmails")
	proto.RegisterType((*CreateInspectTemplateRequest)(nil), "google.privacy.dlp.v2.CreateInspectTemplateRequest")
	proto.RegisterType((*UpdateInspectTemplateRequest)(nil), "google.privacy.dlp.v2.UpdateInspectTemplateRequest")
	proto.RegisterType((*GetInspectTemplateRequest)(nil), "google.privacy.dlp.v2.GetInspectTemplateRequest")
	proto.RegisterType((*ListInspectTemplatesRequest)(nil), "google.privacy.dlp.v2.ListInspectTemplatesRequest")
	proto.RegisterType((*ListInspectTemplatesResponse)(nil), "google.privacy.dlp.v2.ListInspectTemplatesResponse")
	proto.RegisterType((*DeleteInspectTemplateRequest)(nil), "google.privacy.dlp.v2.DeleteInspectTemplateRequest")
	proto.RegisterType((*CreateJobTriggerRequest)(nil), "google.privacy.dlp.v2.CreateJobTriggerRequest")
	proto.RegisterType((*ActivateJobTriggerRequest)(nil), "google.privacy.dlp.v2.ActivateJobTriggerRequest")
	proto.RegisterType((*UpdateJobTriggerRequest)(nil), "google.privacy.dlp.v2.UpdateJobTriggerRequest")
	proto.RegisterType((*GetJobTriggerRequest)(nil), "google.privacy.dlp.v2.GetJobTriggerRequest")
	proto.RegisterType((*CreateDlpJobRequest)(nil), "google.privacy.dlp.v2.CreateDlpJobRequest")
	proto.RegisterType((*ListJobTriggersRequest)(nil), "google.privacy.dlp.v2.ListJobTriggersRequest")
	proto.RegisterType((*ListJobTriggersResponse)(nil), "google.privacy.dlp.v2.ListJobTriggersResponse")
	proto.RegisterType((*DeleteJobTriggerRequest)(nil), "google.privacy.dlp.v2.DeleteJobTriggerRequest")
	proto.RegisterType((*InspectJobConfig)(nil), "google.privacy.dlp.v2.InspectJobConfig")
	proto.RegisterType((*DlpJob)(nil), "google.privacy.dlp.v2.DlpJob")
	proto.RegisterType((*GetDlpJobRequest)(nil), "google.privacy.dlp.v2.GetDlpJobRequest")
	proto.RegisterType((*ListDlpJobsRequest)(nil), "google.privacy.dlp.v2.ListDlpJobsRequest")
	proto.RegisterType((*ListDlpJobsResponse)(nil), "google.privacy.dlp.v2.ListDlpJobsResponse")
	proto.RegisterType((*CancelDlpJobRequest)(nil), "google.privacy.dlp.v2.CancelDlpJobRequest")
	proto.RegisterType((*DeleteDlpJobRequest)(nil), "google.privacy.dlp.v2.DeleteDlpJobRequest")
	proto.RegisterType((*CreateDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.CreateDeidentifyTemplateRequest")
	proto.RegisterType((*UpdateDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.UpdateDeidentifyTemplateRequest")
	proto.RegisterType((*GetDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.GetDeidentifyTemplateRequest")
	proto.RegisterType((*ListDeidentifyTemplatesRequest)(nil), "google.privacy.dlp.v2.ListDeidentifyTemplatesRequest")
	proto.RegisterType((*ListDeidentifyTemplatesResponse)(nil), "google.privacy.dlp.v2.ListDeidentifyTemplatesResponse")
	proto.RegisterType((*DeleteDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.DeleteDeidentifyTemplateRequest")
	proto.RegisterType((*LargeCustomDictionaryConfig)(nil), "google.privacy.dlp.v2.LargeCustomDictionaryConfig")
	proto.RegisterType((*LargeCustomDictionaryStats)(nil), "google.privacy.dlp.v2.LargeCustomDictionaryStats")
	proto.RegisterType((*StoredInfoTypeConfig)(nil), "google.privacy.dlp.v2.StoredInfoTypeConfig")
	proto.RegisterType((*StoredInfoTypeStats)(nil), "google.privacy.dlp.v2.StoredInfoTypeStats")
	proto.RegisterType((*StoredInfoTypeVersion)(nil), "google.privacy.dlp.v2.StoredInfoTypeVersion")
	proto.RegisterType((*StoredInfoType)(nil), "google.privacy.dlp.v2.StoredInfoType")
	proto.RegisterType((*CreateStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.CreateStoredInfoTypeRequest")
	proto.RegisterType((*UpdateStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.UpdateStoredInfoTypeRequest")
	proto.RegisterType((*GetStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.GetStoredInfoTypeRequest")
	proto.RegisterType((*ListStoredInfoTypesRequest)(nil), "google.privacy.dlp.v2.ListStoredInfoTypesRequest")
	proto.RegisterType((*ListStoredInfoTypesResponse)(nil), "google.privacy.dlp.v2.ListStoredInfoTypesResponse")
	proto.RegisterType((*DeleteStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.DeleteStoredInfoTypeRequest")
}

func init() { proto.RegisterFile("google/privacy/dlp/v2/dlp.proto", fileDescriptor_6872a91dcb80f8dc) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// DlpServiceClient is the client API for DlpService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type DlpServiceClient interface {
	// Finds potentially sensitive info in content.
	// This method has limits on input size, processing time, and output size.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// For how to guides, see https://cloud.google.com/dlp/docs/inspecting-images
	// and https://cloud.google.com/dlp/docs/inspecting-text,
	InspectContent(ctx context.Context, in *InspectContentRequest, opts ...grpc.CallOption) (*InspectContentResponse, error)
	// Redacts potentially sensitive info from an image.
	// This method has limits on input size, processing time, and output size.
	// See https://cloud.google.com/dlp/docs/redacting-sensitive-data-images to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	RedactImage(ctx context.Context, in *RedactImageRequest, opts ...grpc.CallOption) (*RedactImageResponse, error)
	// De-identifies potentially sensitive info from a ContentItem.
	// This method has limits on input size and output size.
	// See https://cloud.google.com/dlp/docs/deidentify-sensitive-data to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	DeidentifyContent(ctx context.Context, in *DeidentifyContentRequest, opts ...grpc.CallOption) (*DeidentifyContentResponse, error)
	// Re-identifies content that has been de-identified.
	// See
	// https://cloud.google.com/dlp/docs/pseudonymization#re-identification_in_free_text_code_example
	// to learn more.
	ReidentifyContent(ctx context.Context, in *ReidentifyContentRequest, opts ...grpc.CallOption) (*ReidentifyContentResponse, error)
	// Returns a list of the sensitive information types that the DLP API
	// supports. See https://cloud.google.com/dlp/docs/infotypes-reference to
	// learn more.
	ListInfoTypes(ctx context.Context, in *ListInfoTypesRequest, opts ...grpc.CallOption) (*ListInfoTypesResponse, error)
	// Creates an InspectTemplate for re-using frequently used configuration
	// for inspecting content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	CreateInspectTemplate(ctx context.Context, in *CreateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Updates the InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	UpdateInspectTemplate(ctx context.Context, in *UpdateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Gets an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	GetInspectTemplate(ctx context.Context, in *GetInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Lists InspectTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	ListInspectTemplates(ctx context.Context, in *ListInspectTemplatesRequest, opts ...grpc.CallOption) (*ListInspectTemplatesResponse, error)
	// Deletes an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	DeleteInspectTemplate(ctx context.Context, in *DeleteInspectTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a DeidentifyTemplate for re-using frequently used configuration
	// for de-identifying content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	CreateDeidentifyTemplate(ctx context.Context, in *CreateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Updates the DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	UpdateDeidentifyTemplate(ctx context.Context, in *UpdateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Gets a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	GetDeidentifyTemplate(ctx context.Context, in *GetDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Lists DeidentifyTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	ListDeidentifyTemplates(ctx context.Context, in *ListDeidentifyTemplatesRequest, opts ...grpc.CallOption) (*ListDeidentifyTemplatesResponse, error)
	// Deletes a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	DeleteDeidentifyTemplate(ctx context.Context, in *DeleteDeidentifyTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a job trigger to run DLP actions such as scanning storage for
	// sensitive information on a set schedule.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	CreateJobTrigger(ctx context.Context, in *CreateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Updates a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	UpdateJobTrigger(ctx context.Context, in *UpdateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Gets a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	GetJobTrigger(ctx context.Context, in *GetJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Lists job triggers.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	ListJobTriggers(ctx context.Context, in *ListJobTriggersRequest, opts ...grpc.CallOption) (*ListJobTriggersResponse, error)
	// Deletes a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	DeleteJobTrigger(ctx context.Context, in *DeleteJobTriggerRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Activate a job trigger. Causes the immediate execute of a trigger
	// instead of waiting on the trigger event to occur.
	ActivateJobTrigger(ctx context.Context, in *ActivateJobTriggerRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Creates a new job to inspect storage or calculate risk metrics.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in inspect jobs, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	CreateDlpJob(ctx context.Context, in *CreateDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Lists DlpJobs that match the specified filter in the request.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	ListDlpJobs(ctx context.Context, in *ListDlpJobsRequest, opts ...grpc.CallOption) (*ListDlpJobsResponse, error)
	// Gets the latest state of a long-running DlpJob.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	GetDlpJob(ctx context.Context, in *GetDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Deletes a long-running DlpJob. This method indicates that the client is
	// no longer interested in the DlpJob result. The job will be cancelled if
	// possible.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	DeleteDlpJob(ctx context.Context, in *DeleteDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Starts asynchronous cancellation on a long-running DlpJob. The server
	// makes a best effort to cancel the DlpJob, but success is not
	// guaranteed.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	CancelDlpJob(ctx context.Context, in *CancelDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a pre-built stored infoType to be used for inspection.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	CreateStoredInfoType(ctx context.Context, in *CreateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Updates the stored infoType by creating a new version. The existing version
	// will continue to be used until the new version is ready.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	UpdateStoredInfoType(ctx context.Context, in *UpdateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Gets a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	GetStoredInfoType(ctx context.Context, in *GetStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Lists stored infoTypes.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	ListStoredInfoTypes(ctx context.Context, in *ListStoredInfoTypesRequest, opts ...grpc.CallOption) (*ListStoredInfoTypesResponse, error)
	// Deletes a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	DeleteStoredInfoType(ctx context.Context, in *DeleteStoredInfoTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error)
}

type dlpServiceClient struct {
	cc *grpc.ClientConn
}

func NewDlpServiceClient(cc *grpc.ClientConn) DlpServiceClient {
	return &dlpServiceClient{cc}
}

func (c *dlpServiceClient) InspectContent(ctx context.Context, in *InspectContentRequest, opts ...grpc.CallOption) (*InspectContentResponse, error) {
	out := new(InspectContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/InspectContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) RedactImage(ctx context.Context, in *RedactImageRequest, opts ...grpc.CallOption) (*RedactImageResponse, error) {
	out := new(RedactImageResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/RedactImage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeidentifyContent(ctx context.Context, in *DeidentifyContentRequest, opts ...grpc.CallOption) (*DeidentifyContentResponse, error) {
	out := new(DeidentifyContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeidentifyContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ReidentifyContent(ctx context.Context, in *ReidentifyContentRequest, opts ...grpc.CallOption) (*ReidentifyContentResponse, error) {
	out := new(ReidentifyContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ReidentifyContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListInfoTypes(ctx context.Context, in *ListInfoTypesRequest, opts ...grpc.CallOption) (*ListInfoTypesResponse, error) {
	out := new(ListInfoTypesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListInfoTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateInspectTemplate(ctx context.Context, in *CreateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateInspectTemplate(ctx context.Context, in *UpdateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetInspectTemplate(ctx context.Context, in *GetInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListInspectTemplates(ctx context.Context, in *ListInspectTemplatesRequest, opts ...grpc.CallOption) (*ListInspectTemplatesResponse, error) {
	out := new(ListInspectTemplatesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListInspectTemplates", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteInspectTemplate(ctx context.Context, in *DeleteInspectTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateDeidentifyTemplate(ctx context.Context, in *CreateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateDeidentifyTemplate(ctx context.Context, in *UpdateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetDeidentifyTemplate(ctx context.Context, in *GetDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListDeidentifyTemplates(ctx context.Context, in *ListDeidentifyTemplatesRequest, opts ...grpc.CallOption) (*ListDeidentifyTemplatesResponse, error) {
	out := new(ListDeidentifyTemplatesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListDeidentifyTemplates", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteDeidentifyTemplate(ctx context.Context, in *DeleteDeidentifyTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateJobTrigger(ctx context.Context, in *CreateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateJobTrigger(ctx context.Context, in *UpdateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetJobTrigger(ctx context.Context, in *GetJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListJobTriggers(ctx context.Context, in *ListJobTriggersRequest, opts ...grpc.CallOption) (*ListJobTriggersResponse, error) {
	out := new(ListJobTriggersResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListJobTriggers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteJobTrigger(ctx context.Context, in *DeleteJobTriggerRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ActivateJobTrigger(ctx context.Context, in *ActivateJobTriggerRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ActivateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateDlpJob(ctx context.Context, in *CreateDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListDlpJobs(ctx context.Context, in *ListDlpJobsRequest, opts ...grpc.CallOption) (*ListDlpJobsResponse, error) {
	out := new(ListDlpJobsResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListDlpJobs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetDlpJob(ctx context.Context, in *GetDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteDlpJob(ctx context.Context, in *DeleteDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CancelDlpJob(ctx context.Context, in *CancelDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CancelDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateStoredInfoType(ctx context.Context, in *CreateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateStoredInfoType(ctx context.Context, in *UpdateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetStoredInfoType(ctx context.Context, in *GetStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListStoredInfoTypes(ctx context.Context, in *ListStoredInfoTypesRequest, opts ...grpc.CallOption) (*ListStoredInfoTypesResponse, error) {
	out := new(ListStoredInfoTypesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListStoredInfoTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteStoredInfoType(ctx context.Context, in *DeleteStoredInfoTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// DlpServiceServer is the server API for DlpService service.
type DlpServiceServer interface {
	// Finds potentially sensitive info in content.
	// This method has limits on input size, processing time, and output size.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// For how to guides, see https://cloud.google.com/dlp/docs/inspecting-images
	// and https://cloud.google.com/dlp/docs/inspecting-text,
	InspectContent(context.Context, *InspectContentRequest) (*InspectContentResponse, error)
	// Redacts potentially sensitive info from an image.
	// This method has limits on input size, processing time, and output size.
	// See https://cloud.google.com/dlp/docs/redacting-sensitive-data-images to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	RedactImage(context.Context, *RedactImageRequest) (*RedactImageResponse, error)
	// De-identifies potentially sensitive info from a ContentItem.
	// This method has limits on input size and output size.
	// See https://cloud.google.com/dlp/docs/deidentify-sensitive-data to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	DeidentifyContent(context.Context, *DeidentifyContentRequest) (*DeidentifyContentResponse, error)
	// Re-identifies content that has been de-identified.
	// See
	// https://cloud.google.com/dlp/docs/pseudonymization#re-identification_in_free_text_code_example
	// to learn more.
	ReidentifyContent(context.Context, *ReidentifyContentRequest) (*ReidentifyContentResponse, error)
	// Returns a list of the sensitive information types that the DLP API
	// supports. See https://cloud.google.com/dlp/docs/infotypes-reference to
	// learn more.
	ListInfoTypes(context.Context, *ListInfoTypesRequest) (*ListInfoTypesResponse, error)
	// Creates an InspectTemplate for re-using frequently used configuration
	// for inspecting content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	CreateInspectTemplate(context.Context, *CreateInspectTemplateRequest) (*InspectTemplate, error)
	// Updates the InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	UpdateInspectTemplate(context.Context, *UpdateInspectTemplateRequest) (*InspectTemplate, error)
	// Gets an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	GetInspectTemplate(context.Context, *GetInspectTemplateRequest) (*InspectTemplate, error)
	// Lists InspectTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	ListInspectTemplates(context.Context, *ListInspectTemplatesRequest) (*ListInspectTemplatesResponse, error)
	// Deletes an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	DeleteInspectTemplate(context.Context, *DeleteInspectTemplateRequest) (*empty.Empty, error)
	// Creates a DeidentifyTemplate for re-using frequently used configuration
	// for de-identifying content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	CreateDeidentifyTemplate(context.Context, *CreateDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Updates the DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	UpdateDeidentifyTemplate(context.Context, *UpdateDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Gets a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	GetDeidentifyTemplate(context.Context, *GetDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Lists DeidentifyTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	ListDeidentifyTemplates(context.Context, *ListDeidentifyTemplatesRequest) (*ListDeidentifyTemplatesResponse, error)
	// Deletes a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	DeleteDeidentifyTemplate(context.Context, *DeleteDeidentifyTemplateRequest) (*empty.Empty, error)
	// Creates a job trigger to run DLP actions such as scanning storage for
	// sensitive information on a set schedule.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	CreateJobTrigger(context.Context, *CreateJobTriggerRequest) (*JobTrigger, error)
	// Updates a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	UpdateJobTrigger(context.Context, *UpdateJobTriggerRequest) (*JobTrigger, error)
	// Gets a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	GetJobTrigger(context.Context, *GetJobTriggerRequest) (*JobTrigger, error)
	// Lists job triggers.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	ListJobTriggers(context.Context, *ListJobTriggersRequest) (*ListJobTriggersResponse, error)
	// Deletes a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	DeleteJobTrigger(context.Context, *DeleteJobTriggerRequest) (*empty.Empty, error)
	// Activate a job trigger. Causes the immediate execute of a trigger
	// instead of waiting on the trigger event to occur.
	ActivateJobTrigger(context.Context, *ActivateJobTriggerRequest) (*DlpJob, error)
	// Creates a new job to inspect storage or calculate risk metrics.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in inspect jobs, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	CreateDlpJob(context.Context, *CreateDlpJobRequest) (*DlpJob, error)
	// Lists DlpJobs that match the specified filter in the request.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	ListDlpJobs(context.Context, *ListDlpJobsRequest) (*ListDlpJobsResponse, error)
	// Gets the latest state of a long-running DlpJob.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	GetDlpJob(context.Context, *GetDlpJobRequest) (*DlpJob, error)
	// Deletes a long-running DlpJob. This method indicates that the client is
	// no longer interested in the DlpJob result. The job will be cancelled if
	// possible.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	DeleteDlpJob(context.Context, *DeleteDlpJobRequest) (*empty.Empty, error)
	// Starts asynchronous cancellation on a long-running DlpJob. The server
	// makes a best effort to cancel the DlpJob, but success is not
	// guaranteed.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	CancelDlpJob(context.Context, *CancelDlpJobRequest) (*empty.Empty, error)
	// Creates a pre-built stored infoType to be used for inspection.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	CreateStoredInfoType(context.Context, *CreateStoredInfoTypeRequest) (*StoredInfoType, error)
	// Updates the stored infoType by creating a new version. The existing version
	// will continue to be used until the new version is ready.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	UpdateStoredInfoType(context.Context, *UpdateStoredInfoTypeRequest) (*StoredInfoType, error)
	// Gets a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	GetStoredInfoType(context.Context, *GetStoredInfoTypeRequest) (*StoredInfoType, error)
	// Lists stored infoTypes.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	ListStoredInfoTypes(context.Context, *ListStoredInfoTypesRequest) (*ListStoredInfoTypesResponse, error)
	// Deletes a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	DeleteStoredInfoType(context.Context, *DeleteStoredInfoTypeRequest) (*empty.Empty, error)
}

// UnimplementedDlpServiceServer can be embedded to have forward compatible implementations.
type UnimplementedDlpServiceServer struct {
}

func (*UnimplementedDlpServiceServer) InspectContent(ctx context.Context, req *InspectContentRequest) (*InspectContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method InspectContent not implemented")
}
func (*UnimplementedDlpServiceServer) RedactImage(ctx context.Context, req *RedactImageRequest) (*RedactImageResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method RedactImage not implemented")
}
func (*UnimplementedDlpServiceServer) DeidentifyContent(ctx context.Context, req *DeidentifyContentRequest) (*DeidentifyContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeidentifyContent not implemented")
}
func (*UnimplementedDlpServiceServer) ReidentifyContent(ctx context.Context, req *ReidentifyContentRequest) (*ReidentifyContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ReidentifyContent not implemented")
}
func (*UnimplementedDlpServiceServer) ListInfoTypes(ctx context.Context, req *ListInfoTypesRequest) (*ListInfoTypesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListInfoTypes not implemented")
}
func (*UnimplementedDlpServiceServer) CreateInspectTemplate(ctx context.Context, req *CreateInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateInspectTemplate(ctx context.Context, req *UpdateInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) GetInspectTemplate(ctx context.Context, req *GetInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) ListInspectTemplates(ctx context.Context, req *ListInspectTemplatesRequest) (*ListInspectTemplatesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListInspectTemplates not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteInspectTemplate(ctx context.Context, req *DeleteInspectTemplateRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) CreateDeidentifyTemplate(ctx context.Context, req *CreateDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateDeidentifyTemplate(ctx context.Context, req *UpdateDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) GetDeidentifyTemplate(ctx context.Context, req *GetDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) ListDeidentifyTemplates(ctx context.Context, req *ListDeidentifyTemplatesRequest) (*ListDeidentifyTemplatesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListDeidentifyTemplates not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteDeidentifyTemplate(ctx context.Context, req *DeleteDeidentifyTemplateRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) CreateJobTrigger(ctx context.Context, req *CreateJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateJobTrigger(ctx context.Context, req *UpdateJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) GetJobTrigger(ctx context.Context, req *GetJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) ListJobTriggers(ctx context.Context, req *ListJobTriggersRequest) (*ListJobTriggersResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListJobTriggers not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteJobTrigger(ctx context.Context, req *DeleteJobTriggerRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) ActivateJobTrigger(ctx context.Context, req *ActivateJobTriggerRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ActivateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) CreateDlpJob(ctx context.Context, req *CreateDlpJobRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) ListDlpJobs(ctx context.Context, req *ListDlpJobsRequest) (*ListDlpJobsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListDlpJobs not implemented")
}
func (*UnimplementedDlpServiceServer) GetDlpJob(ctx context.Context, req *GetDlpJobRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteDlpJob(ctx context.Context, req *DeleteDlpJobRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) CancelDlpJob(ctx context.Context, req *CancelDlpJobRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CancelDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) CreateStoredInfoType(ctx context.Context, req *CreateStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateStoredInfoType(ctx context.Context, req *UpdateStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) GetStoredInfoType(ctx context.Context, req *GetStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) ListStoredInfoTypes(ctx context.Context, req *ListStoredInfoTypesRequest) (*ListStoredInfoTypesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListStoredInfoTypes not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteStoredInfoType(ctx context.Context, req *DeleteStoredInfoTypeRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteStoredInfoType not implemented")
}

func RegisterDlpServiceServer(s *grpc.Server, srv DlpServiceServer) {
	s.RegisterService(&_DlpService_serviceDesc, srv)
}

func _DlpService_InspectContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InspectContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).InspectContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/InspectContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).InspectContent(ctx, req.(*InspectContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_RedactImage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RedactImageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).RedactImage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/RedactImage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).RedactImage(ctx, req.(*RedactImageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeidentifyContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeidentifyContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeidentifyContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeidentifyContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeidentifyContent(ctx, req.(*DeidentifyContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ReidentifyContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ReidentifyContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ReidentifyContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ReidentifyContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ReidentifyContent(ctx, req.(*ReidentifyContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListInfoTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListInfoTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListInfoTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListInfoTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListInfoTypes(ctx, req.(*ListInfoTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateInspectTemplate(ctx, req.(*CreateInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateInspectTemplate(ctx, req.(*UpdateInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetInspectTemplate(ctx, req.(*GetInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListInspectTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListInspectTemplatesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListInspectTemplates(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListInspectTemplates",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListInspectTemplates(ctx, req.(*ListInspectTemplatesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteInspectTemplate(ctx, req.(*DeleteInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateDeidentifyTemplate(ctx, req.(*CreateDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateDeidentifyTemplate(ctx, req.(*UpdateDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetDeidentifyTemplate(ctx, req.(*GetDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListDeidentifyTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListDeidentifyTemplatesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListDeidentifyTemplates(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListDeidentifyTemplates",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListDeidentifyTemplates(ctx, req.(*ListDeidentifyTemplatesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteDeidentifyTemplate(ctx, req.(*DeleteDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateJobTrigger(ctx, req.(*CreateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateJobTrigger(ctx, req.(*UpdateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetJobTrigger(ctx, req.(*GetJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListJobTriggers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListJobTriggersRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListJobTriggers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListJobTriggers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListJobTriggers(ctx, req.(*ListJobTriggersRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteJobTrigger(ctx, req.(*DeleteJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ActivateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ActivateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ActivateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ActivateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ActivateJobTrigger(ctx, req.(*ActivateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateDlpJob(ctx, req.(*CreateDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListDlpJobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListDlpJobsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListDlpJobs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListDlpJobs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListDlpJobs(ctx, req.(*ListDlpJobsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetDlpJob(ctx, req.(*GetDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteDlpJob(ctx, req.(*DeleteDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CancelDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CancelDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CancelDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CancelDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CancelDlpJob(ctx, req.(*CancelDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateStoredInfoType(ctx, req.(*CreateStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateStoredInfoType(ctx, req.(*UpdateStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetStoredInfoType(ctx, req.(*GetStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListStoredInfoTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListStoredInfoTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListStoredInfoTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListStoredInfoTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListStoredInfoTypes(ctx, req.(*ListStoredInfoTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteStoredInfoType(ctx, req.(*DeleteStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _DlpService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.privacy.dlp.v2.DlpService",
	HandlerType: (*DlpServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "InspectContent",
			Handler:    _DlpService_InspectContent_Handler,
		},
		{
			MethodName: "RedactImage",
			Handler:    _DlpService_RedactImage_Handler,
		},
		{
			MethodName: "DeidentifyContent",
			Handler:    _DlpService_DeidentifyContent_Handler,
		},
		{
			MethodName: "ReidentifyContent",
			Handler:    _DlpService_ReidentifyContent_Handler,
		},
		{
			MethodName: "ListInfoTypes",
			Handler:    _DlpService_ListInfoTypes_Handler,
		},
		{
			MethodName: "CreateInspectTemplate",
			Handler:    _DlpService_CreateInspectTemplate_Handler,
		},
		{
			MethodName: "UpdateInspectTemplate",
			Handler:    _DlpService_UpdateInspectTemplate_Handler,
		},
		{
			MethodName: "GetInspectTemplate",
			Handler:    _DlpService_GetInspectTemplate_Handler,
		},
		{
			MethodName: "ListInspectTemplates",
			Handler:    _DlpService_ListInspectTemplates_Handler,
		},
		{
			MethodName: "DeleteInspectTemplate",
			Handler:    _DlpService_DeleteInspectTemplate_Handler,
		},
		{
			MethodName: "CreateDeidentifyTemplate",
			Handler:    _DlpService_CreateDeidentifyTemplate_Handler,
		},
		{
			MethodName: "UpdateDeidentifyTemplate",
			Handler:    _DlpService_UpdateDeidentifyTemplate_Handler,
		},
		{
			MethodName: "GetDeidentifyTemplate",
			Handler:    _DlpService_GetDeidentifyTemplate_Handler,
		},
		{
			MethodName: "ListDeidentifyTemplates",
			Handler:    _DlpService_ListDeidentifyTemplates_Handler,
		},
		{
			MethodName: "DeleteDeidentifyTemplate",
			Handler:    _DlpService_DeleteDeidentifyTemplate_Handler,
		},
		{
			MethodName: "CreateJobTrigger",
			Handler:    _DlpService_CreateJobTrigger_Handler,
		},
		{
			MethodName: "UpdateJobTrigger",
			Handler:    _DlpService_UpdateJobTrigger_Handler,
		},
		{
			MethodName: "GetJobTrigger",
			Handler:    _DlpService_GetJobTrigger_Handler,
		},
		{
			MethodName: "ListJobTriggers",
			Handler:    _DlpService_ListJobTriggers_Handler,
		},
		{
			MethodName: "DeleteJobTrigger",
			Handler:    _DlpService_DeleteJobTrigger_Handler,
		},
		{
			MethodName: "ActivateJobTrigger",
			Handler:    _DlpService_ActivateJobTrigger_Handler,
		},
		{
			MethodName: "CreateDlpJob",
			Handler:    _DlpService_CreateDlpJob_Handler,
		},
		{
			MethodName: "ListDlpJobs",
			Handler:    _DlpService_ListDlpJobs_Handler,
		},
		{
			MethodName: "GetDlpJob",
			Handler:    _DlpService_GetDlpJob_Handler,
		},
		{
			MethodName: "DeleteDlpJob",
			Handler:    _DlpService_DeleteDlpJob_Handler,
		},
		{
			MethodName: "CancelDlpJob",
			Handler:    _DlpService_CancelDlpJob_Handler,
		},
		{
			MethodName: "CreateStoredInfoType",
			Handler:    _DlpService_CreateStoredInfoType_Handler,
		},
		{
			MethodName: "UpdateStoredInfoType",
			Handler:    _DlpService_UpdateStoredInfoType_Handler,
		},
		{
			MethodName: "GetStoredInfoType",
			Handler:    _DlpService_GetStoredInfoType_Handler,
		},
		{
			MethodName: "ListStoredInfoTypes",
			Handler:    _DlpService_ListStoredInfoTypes_Handler,
		},
		{
			MethodName: "DeleteStoredInfoType",
			Handler:    _DlpService_DeleteStoredInfoType_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/privacy/dlp/v2/dlp.proto",
}
