// Code generated by go run gob_gen.go; DO NOT EDIT.

package java

import (
	"android/soong/android"
	"android/soong/dexpreopt"
	"bytes"
	"fmt"
	"github.com/google/blueprint/gobtools"
	"github.com/google/blueprint/proptools"
	"github.com/google/blueprint/uniquelist"
	"reflect"
	"unsafe"
)

// begin of aar.go
func init() {
	resourcesNodeGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(resourcesNode) })
	AndroidLibraryInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AndroidLibraryInfo) })
	AARImportInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AARImportInfo) })
	JniPackageInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JniPackageInfo) })
	AARImportDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AARImportDepInSameApexChecker) })
	AARInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AARInfo) })
}

func (r resourcesNode) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.resPackage); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.manifest); err != nil {
		return err
	}

	val1 := r.additionalManifests.Len() == 0
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeReference(ctx, r.additionalManifests, buf, func(v uniquelist.UniqueList[android.Path], buf *bytes.Buffer) error {
			val2 := v.ToSlice()
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
			return nil
		}); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.rTxt); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.rJar); err != nil {
		return err
	}

	if err = r.assets.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.usedResourceProcessor); err != nil {
		return err
	}
	return err
}

func (r resourcesNode) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.resourcesNode")
	hasher.WriteInt(7)
	hasher.WriteString(":java.android.Path")
	val1 := r.resPackage == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.resPackage); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.resPackage == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.resPackage.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.resPackage.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.manifest == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.manifest); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.manifest == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error { return r.manifest.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.manifest.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.uniquelist.UniqueList[android.Path]")
	val11 := func(hasher *proptools.Hasher, val7 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val8 := val7 == nil
		if val8 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val7); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val9 := val7 == nil
					if val9 {
						hasher.WriteByte(0)
					} else {
						val10 := func(hasher *proptools.Hasher) error { return val7.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val10); err != nil {
							return err
						}
					}
				}
			} else {
				val7.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.additionalManifests.Hash(hasher, "android.Path", val11); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Path")
	val12 := r.rTxt == nil
	if val12 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.rTxt); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val13 := r.rTxt == nil
				if val13 {
					hasher.WriteByte(0)
				} else {
					val14 := func(hasher *proptools.Hasher) error { return r.rTxt.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val14); err != nil {
						return err
					}
				}
			}
		} else {
			r.rTxt.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val15 := r.rJar == nil
	if val15 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.rJar); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val16 := r.rJar == nil
				if val16 {
					hasher.WriteByte(0)
				} else {
					val17 := func(hasher *proptools.Hasher) error { return r.rJar.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val17); err != nil {
						return err
					}
				}
			}
		} else {
			r.rJar.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.assets.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.bool")
	if r.usedResourceProcessor {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *resourcesNode) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.resPackage = nil
	} else {
		r.resPackage = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.manifest = nil
	} else {
		r.manifest = val4.(android.Path)
	}

	var val6 bool
	if err = gobtools.DecodeBool(buf, &val6); err != nil {
		return err
	}
	if !val6 {
		tmp, err := gobtools.DecodeReference(ctx, &r.additionalManifests, buf, func(value *uniquelist.UniqueList[android.Path], buf *bytes.Reader) error {
			var val7 []android.Path
			var val8 int
			err = gobtools.DecodeInt(buf, &val8)
			if err != nil {
				return err
			}
			if val8 != -1 {
				val7 = make([]android.Path, val8)
				for val9 := 0; val9 < int(val8); val9++ {
					if val11, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val11 == nil {
						val7[val9] = nil
					} else {
						val7[val9] = val11.(android.Path)
					}
				}
			}
			*value = uniquelist.Make(val7)
			return nil
		})
		if err != nil {
			return err
		}
		r.additionalManifests = *tmp
	}

	if val13, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val13 == nil {
		r.rTxt = nil
	} else {
		r.rTxt = val13.(android.Path)
	}

	if val15, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val15 == nil {
		r.rJar = nil
	} else {
		r.rJar = val15.(android.Path)
	}

	if err = r.assets.Decode(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.usedResourceProcessor)
	if err != nil {
		return err
	}

	return err
}

var resourcesNodeGobRegId int16

func (r resourcesNode) GetTypeId() int16 {
	return resourcesNodeGobRegId
}

func (r AndroidLibraryInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error
	return err
}

func (r AndroidLibraryInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AndroidLibraryInfo")
	hasher.WriteInt(0)
	return nil
}

func (r *AndroidLibraryInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	return err
}

var AndroidLibraryInfoGobRegId int16

func (r AndroidLibraryInfo) GetTypeId() int16 {
	return AndroidLibraryInfoGobRegId
}

func (r AARImportInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error
	return err
}

func (r AARImportInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AARImportInfo")
	hasher.WriteInt(0)
	return nil
}

func (r *AARImportInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	return err
}

var AARImportInfoGobRegId int16

func (r AARImportInfo) GetTypeId() int16 {
	return AARImportInfoGobRegId
}

func (r JniPackageInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.JniPackages == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.JniPackages)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.JniPackages); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.JniPackages[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r JniPackageInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JniPackageInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.JniPackages))
	for val1 := 0; val1 < len(r.JniPackages); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.JniPackages[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.JniPackages[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.JniPackages[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.JniPackages[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.JniPackages[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *JniPackageInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.JniPackages = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.JniPackages[val4] = nil
			} else {
				r.JniPackages[val4] = val6.(android.Path)
			}
		}
	}

	return err
}

var JniPackageInfoGobRegId int16

func (r JniPackageInfo) GetTypeId() int16 {
	return JniPackageInfoGobRegId
}

func (r AARImportDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r AARImportDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AARImportDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *AARImportDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var AARImportDepInSameApexCheckerGobRegId int16

func (r AARImportDepInSameApexChecker) GetTypeId() int16 {
	return AARImportDepInSameApexCheckerGobRegId
}

func (r AARInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.Aar); err != nil {
		return err
	}
	return err
}

func (r AARInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AARInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Path")
	val1 := r.Aar == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Aar); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.Aar == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.Aar.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.Aar.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *AARInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.Aar = nil
	} else {
		r.Aar = val2.(android.Path)
	}

	return err
}

var AARInfoGobRegId int16

func (r AARInfo) GetTypeId() int16 {
	return AARInfoGobRegId
}

// end of aar.go

// begin of android_resources.go
func init() {
	rroDirGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(rroDir) })
}

func (r rroDir) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.path); err != nil {
		return err
	}

	if err = gobtools.EncodeInt(buf, int(r.overlayType)); err != nil {
		return err
	}
	return err
}

func (r rroDir) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.rroDir")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Path")
	val1 := r.path == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.path); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.path == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.path.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.path.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.overlayType")
	hasher.WriteString(":.int")
	hasher.WriteUint64(uint64(int(r.overlayType)))
	return nil
}

func (r *rroDir) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.path = nil
	} else {
		r.path = val2.(android.Path)
	}

	var val4 int
	err = gobtools.DecodeInt(buf, &val4)
	if err != nil {
		return err
	}
	r.overlayType = overlayType(val4)

	return err
}

var rroDirGobRegId int16

func (r rroDir) GetTypeId() int16 {
	return rroDirGobRegId
}

// end of android_resources.go

// begin of apkcerts.go
func init() {
	ApkCertInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApkCertInfo) })
	ApkCertsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApkCertsInfo) })
}

func (r ApkCertInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.ApkCertsFile); err != nil {
		return err
	}

	if err = r.Certificate.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.Name); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Test); err != nil {
		return err
	}
	return err
}

func (r ApkCertInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ApkCertInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":java.android.Path")
	val1 := r.ApkCertsFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ApkCertsFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ApkCertsFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.ApkCertsFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ApkCertsFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.Certificate.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.Name)
	hasher.WriteString(":.bool")
	if r.Test {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *ApkCertInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.ApkCertsFile = nil
	} else {
		r.ApkCertsFile = val2.(android.Path)
	}

	if err = r.Certificate.Decode(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.Name)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Test)
	if err != nil {
		return err
	}

	return err
}

var ApkCertInfoGobRegId int16

func (r ApkCertInfo) GetTypeId() int16 {
	return ApkCertInfoGobRegId
}

func (r ApkCertsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r); val1++ {
			if err = r[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ApkCertsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.[]ApkCertInfo")
	hasher.WriteInt(len(r))
	for val1 := 0; val1 < len(r); val1++ {
		if err := r[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *ApkCertsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		(*r) = make([]ApkCertInfo, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			if err = (*r)[val3].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var ApkCertsInfoGobRegId int16

func (r ApkCertsInfo) GetTypeId() int16 {
	return ApkCertsInfoGobRegId
}

// end of apkcerts.go

// begin of app.go
func init() {
	FlagsPackagesGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(FlagsPackages) })
	AppInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AppInfo) })
	CertificateGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(Certificate) })
	AppDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AppDepInSameApexChecker) })
	AndroidAppCertificateInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AndroidAppCertificateInfo) })
	BundleInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(BundleInfo) })
}

func (r FlagsPackages) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.AconfigTextFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.AconfigTextFiles)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.AconfigTextFiles); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.AconfigTextFiles[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r FlagsPackages) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.FlagsPackages")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.AconfigTextFiles))
	for val1 := 0; val1 < len(r.AconfigTextFiles); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.AconfigTextFiles[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.AconfigTextFiles[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.AconfigTextFiles[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.AconfigTextFiles[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.AconfigTextFiles[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *FlagsPackages) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.AconfigTextFiles = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.AconfigTextFiles[val4] = nil
			} else {
				r.AconfigTextFiles[val4] = val6.(android.Path)
			}
		}
	}

	return err
}

var FlagsPackagesGobRegId int16

func (r FlagsPackages) GetTypeId() int16 {
	return FlagsPackagesGobRegId
}

func (r AppInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeBool(buf, r.Updatable); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.TestHelperApp); err != nil {
		return err
	}

	if r.EmbeddedJNILibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.EmbeddedJNILibs)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.EmbeddedJNILibs); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.EmbeddedJNILibs[val1]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.MergedManifestFile); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Prebuilt); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.AppSet); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Privileged); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputFile); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.InstallApkName); err != nil {
		return err
	}

	if err = r.JacocoInfo.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.Certificate.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.PrivAppAllowlist.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.PreinstallAllowlist.Encode(ctx, buf); err != nil {
		return err
	}

	val2 := r.OverriddenManifestPackageName == nil
	if err = gobtools.EncodeBool(buf, val2); err != nil {
		return err
	}
	if !val2 {
		if err = gobtools.EncodeString(buf, (*r.OverriddenManifestPackageName)); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ApkCertsFile); err != nil {
		return err
	}

	if r.JniLibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.JniLibs)); err != nil {
			return err
		}
		for val3 := 0; val3 < len(r.JniLibs); val3++ {
			if err = r.JniLibs[val3].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.JniCoverageOutputs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.JniCoverageOutputs)); err != nil {
			return err
		}
		for val4 := 0; val4 < len(r.JniCoverageOutputs); val4++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.JniCoverageOutputs[val4]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.PackedAdditionalOutputs); err != nil {
		return err
	}
	return err
}

func (r AppInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AppInfo")
	hasher.WriteInt(18)
	hasher.WriteString(":.bool")
	if r.Updatable {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.bool")
	if r.TestHelperApp {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.EmbeddedJNILibs))
	for val1 := 0; val1 < len(r.EmbeddedJNILibs); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.EmbeddedJNILibs[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.EmbeddedJNILibs[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.EmbeddedJNILibs[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.EmbeddedJNILibs[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.EmbeddedJNILibs[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val5 := r.MergedManifestFile == nil
	if val5 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.MergedManifestFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val6 := r.MergedManifestFile == nil
				if val6 {
					hasher.WriteByte(0)
				} else {
					val7 := func(hasher *proptools.Hasher) error {
						return r.MergedManifestFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
						return err
					}
				}
			}
		} else {
			r.MergedManifestFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.bool")
	if r.Prebuilt {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.bool")
	if r.AppSet {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.bool")
	if r.Privileged {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":java.android.Path")
	val8 := r.OutputFile == nil
	if val8 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val9 := r.OutputFile == nil
				if val9 {
					hasher.WriteByte(0)
				} else {
					val10 := func(hasher *proptools.Hasher) error { return r.OutputFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val10); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.InstallApkName)
	if err := r.JacocoInfo.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.Certificate.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.PrivAppAllowlist.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.PreinstallAllowlist.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.*string")
	val11 := r.OverriddenManifestPackageName == nil
	if val11 {
		hasher.WriteByte(0)
	} else {
		val12 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.OverriddenManifestPackageName))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.OverriddenManifestPackageName)), val12); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Path")
	val13 := r.ApkCertsFile == nil
	if val13 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ApkCertsFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val14 := r.ApkCertsFile == nil
				if val14 {
					hasher.WriteByte(0)
				} else {
					val15 := func(hasher *proptools.Hasher) error { return r.ApkCertsFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val15); err != nil {
						return err
					}
				}
			}
		} else {
			r.ApkCertsFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.[]jniLib")
	hasher.WriteInt(len(r.JniLibs))
	for val16 := 0; val16 < len(r.JniLibs); val16++ {
		if err := r.JniLibs[val16].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.JniCoverageOutputs))
	for val17 := 0; val17 < len(r.JniCoverageOutputs); val17++ {
		hasher.WriteString("android/soong/android:android.Path")
		val18 := r.JniCoverageOutputs[val17] == nil
		if val18 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.JniCoverageOutputs[val17]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val19 := r.JniCoverageOutputs[val17] == nil
					if val19 {
						hasher.WriteByte(0)
					} else {
						val20 := func(hasher *proptools.Hasher) error {
							return r.JniCoverageOutputs[val17].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val20); err != nil {
							return err
						}
					}
				}
			} else {
				r.JniCoverageOutputs[val17].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val21 := r.PackedAdditionalOutputs == nil
	if val21 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.PackedAdditionalOutputs); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val22 := r.PackedAdditionalOutputs == nil
				if val22 {
					hasher.WriteByte(0)
				} else {
					val23 := func(hasher *proptools.Hasher) error {
						return r.PackedAdditionalOutputs.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val23); err != nil {
						return err
					}
				}
			}
		} else {
			r.PackedAdditionalOutputs.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *AppInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeBool(buf, &r.Updatable)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.TestHelperApp)
	if err != nil {
		return err
	}

	var val5 int
	err = gobtools.DecodeInt(buf, &val5)
	if err != nil {
		return err
	}
	if val5 != -1 {
		r.EmbeddedJNILibs = make([]android.Path, val5)
		for val6 := 0; val6 < int(val5); val6++ {
			if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val8 == nil {
				r.EmbeddedJNILibs[val6] = nil
			} else {
				r.EmbeddedJNILibs[val6] = val8.(android.Path)
			}
		}
	}

	if val10, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val10 == nil {
		r.MergedManifestFile = nil
	} else {
		r.MergedManifestFile = val10.(android.Path)
	}

	err = gobtools.DecodeBool(buf, &r.Prebuilt)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.AppSet)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Privileged)
	if err != nil {
		return err
	}

	if val15, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val15 == nil {
		r.OutputFile = nil
	} else {
		r.OutputFile = val15.(android.Path)
	}

	err = gobtools.DecodeString(buf, &r.InstallApkName)
	if err != nil {
		return err
	}

	if err = r.JacocoInfo.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.Certificate.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.PrivAppAllowlist.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.PreinstallAllowlist.Decode(ctx, buf); err != nil {
		return err
	}

	var val22 bool
	if err = gobtools.DecodeBool(buf, &val22); err != nil {
		return err
	}
	if !val22 {
		var val21 string
		err = gobtools.DecodeString(buf, &val21)
		if err != nil {
			return err
		}
		r.OverriddenManifestPackageName = &val21
	}

	if val25, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val25 == nil {
		r.ApkCertsFile = nil
	} else {
		r.ApkCertsFile = val25.(android.Path)
	}

	var val27 int
	err = gobtools.DecodeInt(buf, &val27)
	if err != nil {
		return err
	}
	if val27 != -1 {
		r.JniLibs = make([]jniLib, val27)
		for val28 := 0; val28 < int(val27); val28++ {
			if err = r.JniLibs[val28].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	var val32 int
	err = gobtools.DecodeInt(buf, &val32)
	if err != nil {
		return err
	}
	if val32 != -1 {
		r.JniCoverageOutputs = make([]android.Path, val32)
		for val33 := 0; val33 < int(val32); val33++ {
			if val35, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val35 == nil {
				r.JniCoverageOutputs[val33] = nil
			} else {
				r.JniCoverageOutputs[val33] = val35.(android.Path)
			}
		}
	}

	if val37, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val37 == nil {
		r.PackedAdditionalOutputs = nil
	} else {
		r.PackedAdditionalOutputs = val37.(android.Path)
	}

	return err
}

var AppInfoGobRegId int16

func (r AppInfo) GetTypeId() int16 {
	return AppInfoGobRegId
}

func (r Certificate) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.Pem); err != nil {
		return err
	}
	if err = gobtools.EncodeInterface(ctx, buf, r.Key); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.presigned); err != nil {
		return err
	}
	return err
}

func (r Certificate) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.Certificate")
	hasher.WriteInt(3)
	hasher.WriteString(":java.android.Path")
	val1 := r.Pem == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Pem); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.Pem == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.Pem.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.Pem.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.Key == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Key); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.Key == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error { return r.Key.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.Key.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.bool")
	if r.presigned {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *Certificate) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.Pem = nil
	} else {
		r.Pem = val2.(android.Path)
	}
	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.Key = nil
	} else {
		r.Key = val4.(android.Path)
	}

	err = gobtools.DecodeBool(buf, &r.presigned)
	if err != nil {
		return err
	}

	return err
}

var CertificateGobRegId int16

func (r Certificate) GetTypeId() int16 {
	return CertificateGobRegId
}

func (r AppDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r AppDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AppDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *AppDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var AppDepInSameApexCheckerGobRegId int16

func (r AppDepInSameApexChecker) GetTypeId() int16 {
	return AppDepInSameApexCheckerGobRegId
}

func (r AndroidAppCertificateInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.Certificate.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r AndroidAppCertificateInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AndroidAppCertificateInfo")
	hasher.WriteInt(1)
	if err := r.Certificate.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *AndroidAppCertificateInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.Certificate.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var AndroidAppCertificateInfoGobRegId int16

func (r AndroidAppCertificateInfo) GetTypeId() int16 {
	return AndroidAppCertificateInfoGobRegId
}

func (r BundleInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.Bundle); err != nil {
		return err
	}
	return err
}

func (r BundleInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.BundleInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Path")
	val1 := r.Bundle == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Bundle); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.Bundle == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.Bundle.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.Bundle.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *BundleInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.Bundle = nil
	} else {
		r.Bundle = val2.(android.Path)
	}

	return err
}

var BundleInfoGobRegId int16

func (r BundleInfo) GetTypeId() int16 {
	return BundleInfoGobRegId
}

// end of app.go

// begin of app_import.go
func init() {
	AppImportDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AppImportDepInSameApexChecker) })
}

func (r AppImportDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r AppImportDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AppImportDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *AppImportDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var AppImportDepInSameApexCheckerGobRegId int16

func (r AppImportDepInSameApexChecker) GetTypeId() int16 {
	return AppImportDepInSameApexCheckerGobRegId
}

// end of app_import.go

// begin of base.go
func init() {
	OptionalDexJarPathGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(OptionalDexJarPath) })
	JavaDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaDepInSameApexChecker) })
	JarJarProviderDataGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JarJarProviderData) })
}

func (r OptionalDexJarPath) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeBool(buf, r.isSet); err != nil {
		return err
	}

	if err = r.path.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r OptionalDexJarPath) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.OptionalDexJarPath")
	hasher.WriteInt(2)
	hasher.WriteString(":.bool")
	if r.isSet {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	if err := r.path.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *OptionalDexJarPath) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeBool(buf, &r.isSet)
	if err != nil {
		return err
	}

	if err = r.path.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var OptionalDexJarPathGobRegId int16

func (r OptionalDexJarPath) GetTypeId() int16 {
	return OptionalDexJarPathGobRegId
}

func (r JavaDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r JavaDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *JavaDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var JavaDepInSameApexCheckerGobRegId int16

func (r JavaDepInSameApexChecker) GetTypeId() int16 {
	return JavaDepInSameApexCheckerGobRegId
}

func (r JarJarProviderData) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.Rename == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Rename)); err != nil {
			return err
		}
		for val1, val2 := range r.Rename {
			if err = gobtools.EncodeString(buf, val1); err != nil {
				return err
			}
			if err = gobtools.EncodeString(buf, val2); err != nil {
				return err
			}
		}
	}
	return err
}

func (r JarJarProviderData) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JarJarProviderData")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.JarJarRename")
	hasher.WriteString(":.map[string]string")
	hasher.WriteInt(len(r.Rename))
	val1 := make([]string, 0, len(r.Rename))
	for val3 := range r.Rename {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":.string")
		hasher.WriteString(val2)
		hasher.WriteString(":.string")
		hasher.WriteString(r.Rename[val2])
	}
	return nil
}

func (r *JarJarProviderData) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.Rename = make(map[string]string, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 string
			var val5 string
			err = gobtools.DecodeString(buf, &val4)
			if err != nil {
				return err
			}
			err = gobtools.DecodeString(buf, &val5)
			if err != nil {
				return err
			}
			r.Rename[val4] = val5
		}
	}

	return err
}

var JarJarProviderDataGobRegId int16

func (r JarJarProviderData) GetTypeId() int16 {
	return JarJarProviderDataGobRegId
}

// end of base.go

// begin of bootclasspath.go
func init() {
	ApexVariantReferenceGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApexVariantReference) })
}

func (r ApexVariantReference) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BpPrintableBase.Encode(ctx, buf); err != nil {
		return err
	}

	val1 := r.Apex == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.Apex)); err != nil {
			return err
		}
	}

	val2 := r.Module == nil
	if err = gobtools.EncodeBool(buf, val2); err != nil {
		return err
	}
	if !val2 {
		if err = gobtools.EncodeString(buf, (*r.Module)); err != nil {
			return err
		}
	}
	return err
}

func (r ApexVariantReference) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ApexVariantReference")
	hasher.WriteInt(3)
	if err := r.BpPrintableBase.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.*string")
	val1 := r.Apex == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.Apex))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.Apex)), val2); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*string")
	val3 := r.Module == nil
	if val3 {
		hasher.WriteByte(0)
	} else {
		val4 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.Module))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.Module)), val4); err != nil {
			return err
		}
	}
	return nil
}

func (r *ApexVariantReference) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BpPrintableBase.Decode(ctx, buf); err != nil {
		return err
	}

	var val3 bool
	if err = gobtools.DecodeBool(buf, &val3); err != nil {
		return err
	}
	if !val3 {
		var val2 string
		err = gobtools.DecodeString(buf, &val2)
		if err != nil {
			return err
		}
		r.Apex = &val2
	}

	var val6 bool
	if err = gobtools.DecodeBool(buf, &val6); err != nil {
		return err
	}
	if !val6 {
		var val5 string
		err = gobtools.DecodeString(buf, &val5)
		if err != nil {
			return err
		}
		r.Module = &val5
	}

	return err
}

var ApexVariantReferenceGobRegId int16

func (r ApexVariantReference) GetTypeId() int16 {
	return ApexVariantReferenceGobRegId
}

// end of bootclasspath.go

// begin of bootclasspath_fragment.go
func init() {
	BootclasspathFragmentInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(BootclasspathFragmentInfo) })
	BootclasspathFragmentApexContentInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(BootclasspathFragmentApexContentInfo) })
	BootclasspathFragmentDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(BootclasspathFragmentDepInSameApexChecker) })
	ClasspathFragmentValidationInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ClasspathFragmentValidationInfo) })
}

func (r BootclasspathFragmentInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.ImageName == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.ImageName)); err != nil {
			return err
		}
	}

	if r.Contents == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Contents)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.Contents); val2++ {
			if err = gobtools.EncodeString(buf, r.Contents[val2]); err != nil {
				return err
			}
		}
	}

	if r.ApiStubLibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ApiStubLibs)); err != nil {
			return err
		}
		for val3 := 0; val3 < len(r.ApiStubLibs); val3++ {
			if err = gobtools.EncodeString(buf, r.ApiStubLibs[val3]); err != nil {
				return err
			}
		}
	}

	if r.CorePlatformApiStubLibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.CorePlatformApiStubLibs)); err != nil {
			return err
		}
		for val4 := 0; val4 < len(r.CorePlatformApiStubLibs); val4++ {
			if err = gobtools.EncodeString(buf, r.CorePlatformApiStubLibs[val4]); err != nil {
				return err
			}
		}
	}

	if r.Fragments == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Fragments)); err != nil {
			return err
		}
		for val5 := 0; val5 < len(r.Fragments); val5++ {
			if err = r.Fragments[val5].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ProfilePathOnHost); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.DexPreoptProfileGuided); err != nil {
		return err
	}
	return err
}

func (r BootclasspathFragmentInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.BootclasspathFragmentInfo")
	hasher.WriteInt(7)
	hasher.WriteString(":.*string")
	val1 := r.ImageName == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.ImageName))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ImageName)), val2); err != nil {
			return err
		}
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.Contents))
	for val3 := 0; val3 < len(r.Contents); val3++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.Contents[val3])
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.ApiStubLibs))
	for val4 := 0; val4 < len(r.ApiStubLibs); val4++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.ApiStubLibs[val4])
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.CorePlatformApiStubLibs))
	for val5 := 0; val5 < len(r.CorePlatformApiStubLibs); val5++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.CorePlatformApiStubLibs[val5])
	}
	hasher.WriteString(":.[]ApexVariantReference")
	hasher.WriteInt(len(r.Fragments))
	for val6 := 0; val6 < len(r.Fragments); val6++ {
		if err := r.Fragments[val6].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.ProfilePathOnHost == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ProfilePathOnHost); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.ProfilePathOnHost == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error {
						return r.ProfilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.ProfilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.bool")
	if r.DexPreoptProfileGuided {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *BootclasspathFragmentInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 string
		err = gobtools.DecodeString(buf, &val1)
		if err != nil {
			return err
		}
		r.ImageName = &val1
	}

	var val5 int
	err = gobtools.DecodeInt(buf, &val5)
	if err != nil {
		return err
	}
	if val5 != -1 {
		r.Contents = make([]string, val5)
		for val6 := 0; val6 < int(val5); val6++ {
			err = gobtools.DecodeString(buf, &r.Contents[val6])
			if err != nil {
				return err
			}
		}
	}

	var val9 int
	err = gobtools.DecodeInt(buf, &val9)
	if err != nil {
		return err
	}
	if val9 != -1 {
		r.ApiStubLibs = make([]string, val9)
		for val10 := 0; val10 < int(val9); val10++ {
			err = gobtools.DecodeString(buf, &r.ApiStubLibs[val10])
			if err != nil {
				return err
			}
		}
	}

	var val13 int
	err = gobtools.DecodeInt(buf, &val13)
	if err != nil {
		return err
	}
	if val13 != -1 {
		r.CorePlatformApiStubLibs = make([]string, val13)
		for val14 := 0; val14 < int(val13); val14++ {
			err = gobtools.DecodeString(buf, &r.CorePlatformApiStubLibs[val14])
			if err != nil {
				return err
			}
		}
	}

	var val17 int
	err = gobtools.DecodeInt(buf, &val17)
	if err != nil {
		return err
	}
	if val17 != -1 {
		r.Fragments = make([]ApexVariantReference, val17)
		for val18 := 0; val18 < int(val17); val18++ {
			if err = r.Fragments[val18].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if val21, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val21 == nil {
		r.ProfilePathOnHost = nil
	} else {
		r.ProfilePathOnHost = val21.(android.Path)
	}

	err = gobtools.DecodeBool(buf, &r.DexPreoptProfileGuided)
	if err != nil {
		return err
	}

	return err
}

var BootclasspathFragmentInfoGobRegId int16

func (r BootclasspathFragmentInfo) GetTypeId() int16 {
	return BootclasspathFragmentInfoGobRegId
}

func (r BootclasspathFragmentApexContentInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.contentModuleDexJarPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.contentModuleDexJarPaths)); err != nil {
			return err
		}
		for val1, val2 := range r.contentModuleDexJarPaths {
			if err = gobtools.EncodeString(buf, val1); err != nil {
				return err
			}
			if err = gobtools.EncodeInterface(ctx, buf, val2); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.profilePathOnHost); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.profileInstallPathInApex); err != nil {
		return err
	}
	return err
}

func (r BootclasspathFragmentApexContentInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.BootclasspathFragmentApexContentInfo")
	hasher.WriteInt(3)
	hasher.WriteString(":java.bootDexJarByModule")
	hasher.WriteString(":.map[string]android.Path")
	hasher.WriteInt(len(r.contentModuleDexJarPaths))
	val1 := make([]string, 0, len(r.contentModuleDexJarPaths))
	for val3 := range r.contentModuleDexJarPaths {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":.string")
		hasher.WriteString(val2)
		hasher.WriteString(":java.android.Path")
		val4 := r.contentModuleDexJarPaths[val2] == nil
		if val4 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.contentModuleDexJarPaths[val2]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val5 := r.contentModuleDexJarPaths[val2] == nil
					if val5 {
						hasher.WriteByte(0)
					} else {
						val6 := func(hasher *proptools.Hasher) error {
							return r.contentModuleDexJarPaths[val2].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
							return err
						}
					}
				}
			} else {
				r.contentModuleDexJarPaths[val2].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.profilePathOnHost == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.profilePathOnHost); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.profilePathOnHost == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error {
						return r.profilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.profilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.profileInstallPathInApex)
	return nil
}

func (r *BootclasspathFragmentApexContentInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.contentModuleDexJarPaths = make(map[string]android.Path, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 string
			var val5 android.Path
			err = gobtools.DecodeString(buf, &val4)
			if err != nil {
				return err
			}
			if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val8 == nil {
				val5 = nil
			} else {
				val5 = val8.(android.Path)
			}
			r.contentModuleDexJarPaths[val4] = val5
		}
	}

	if val10, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val10 == nil {
		r.profilePathOnHost = nil
	} else {
		r.profilePathOnHost = val10.(android.Path)
	}

	err = gobtools.DecodeString(buf, &r.profileInstallPathInApex)
	if err != nil {
		return err
	}

	return err
}

var BootclasspathFragmentApexContentInfoGobRegId int16

func (r BootclasspathFragmentApexContentInfo) GetTypeId() int16 {
	return BootclasspathFragmentApexContentInfoGobRegId
}

func (r BootclasspathFragmentDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r BootclasspathFragmentDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.BootclasspathFragmentDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *BootclasspathFragmentDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var BootclasspathFragmentDepInSameApexCheckerGobRegId int16

func (r BootclasspathFragmentDepInSameApexChecker) GetTypeId() int16 {
	return BootclasspathFragmentDepInSameApexCheckerGobRegId
}

func (r ClasspathFragmentValidationInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeString(buf, r.ClasspathFragmentModuleName); err != nil {
		return err
	}

	if r.UnknownJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.UnknownJars)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.UnknownJars); val1++ {
			if err = gobtools.EncodeString(buf, r.UnknownJars[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ClasspathFragmentValidationInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ClasspathFragmentValidationInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":.string")
	hasher.WriteString(r.ClasspathFragmentModuleName)
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.UnknownJars))
	for val1 := 0; val1 < len(r.UnknownJars); val1++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.UnknownJars[val1])
	}
	return nil
}

func (r *ClasspathFragmentValidationInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeString(buf, &r.ClasspathFragmentModuleName)
	if err != nil {
		return err
	}

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.UnknownJars = make([]string, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			err = gobtools.DecodeString(buf, &r.UnknownJars[val4])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var ClasspathFragmentValidationInfoGobRegId int16

func (r ClasspathFragmentValidationInfo) GetTypeId() int16 {
	return ClasspathFragmentValidationInfoGobRegId
}

// end of bootclasspath_fragment.go

// begin of classpath_fragment.go
func init() {
	ClasspathFragmentProtoContentInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ClasspathFragmentProtoContentInfo) })
}

func (r ClasspathFragmentProtoContentInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeBool(buf, r.ClasspathFragmentProtoGenerated); err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoContents.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoOutput.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoInstallDir.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r ClasspathFragmentProtoContentInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ClasspathFragmentProtoContentInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":.bool")
	if r.ClasspathFragmentProtoGenerated {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	if err := r.ClasspathFragmentProtoContents.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.ClasspathFragmentProtoOutput.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.ClasspathFragmentProtoInstallDir.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *ClasspathFragmentProtoContentInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeBool(buf, &r.ClasspathFragmentProtoGenerated)
	if err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoContents.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoOutput.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.ClasspathFragmentProtoInstallDir.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var ClasspathFragmentProtoContentInfoGobRegId int16

func (r ClasspathFragmentProtoContentInfo) GetTypeId() int16 {
	return ClasspathFragmentProtoContentInfoGobRegId
}

// end of classpath_fragment.go

// begin of dex.go
func init() {
	ProguardInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ProguardInfo) })
	ProguardInfosGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ProguardInfos) })
}

func (r ProguardInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeString(buf, r.ModuleName); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.Class); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ProguardDictionary); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ProguardUsageZip); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ClassesJar); err != nil {
		return err
	}
	return err
}

func (r ProguardInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ProguardInfo")
	hasher.WriteInt(5)
	hasher.WriteString(":.string")
	hasher.WriteString(r.ModuleName)
	hasher.WriteString(":.string")
	hasher.WriteString(r.Class)
	hasher.WriteString(":java.android.Path")
	val1 := r.ProguardDictionary == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ProguardDictionary); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ProguardDictionary == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.ProguardDictionary.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ProguardDictionary.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.ProguardUsageZip == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ProguardUsageZip); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.ProguardUsageZip == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.ProguardUsageZip.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.ProguardUsageZip.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.ClassesJar == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ClassesJar); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.ClassesJar == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error { return r.ClassesJar.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.ClassesJar.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *ProguardInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeString(buf, &r.ModuleName)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.Class)
	if err != nil {
		return err
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.ProguardDictionary = nil
	} else {
		r.ProguardDictionary = val4.(android.Path)
	}

	if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val6 == nil {
		r.ProguardUsageZip = nil
	} else {
		r.ProguardUsageZip = val6.(android.Path)
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.ClassesJar = nil
	} else {
		r.ClassesJar = val8.(android.Path)
	}

	return err
}

var ProguardInfoGobRegId int16

func (r ProguardInfo) GetTypeId() int16 {
	return ProguardInfoGobRegId
}

func (r ProguardInfos) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r); val1++ {
			if err = r[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ProguardInfos) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.[]ProguardInfo")
	hasher.WriteInt(len(r))
	for val1 := 0; val1 < len(r); val1++ {
		if err := r[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *ProguardInfos) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		(*r) = make([]ProguardInfo, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			if err = (*r)[val3].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var ProguardInfosGobRegId int16

func (r ProguardInfos) GetTypeId() int16 {
	return ProguardInfosGobRegId
}

// end of dex.go

// begin of dexpreopt.go
func init() {
	DexpreopterInstallGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(DexpreopterInstall) })
}

func (r DexpreopterInstall) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputPathOnHost); err != nil {
		return err
	}

	if err = r.InstallDirOnDevice.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.InstallFileOnDevice); err != nil {
		return err
	}
	return err
}

func (r DexpreopterInstall) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.DexpreopterInstall")
	hasher.WriteInt(3)
	hasher.WriteString(":java.android.Path")
	val1 := r.OutputPathOnHost == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputPathOnHost); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.OutputPathOnHost == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.OutputPathOnHost.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputPathOnHost.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.InstallDirOnDevice.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.InstallFileOnDevice)
	return nil
}

func (r *DexpreopterInstall) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.OutputPathOnHost = nil
	} else {
		r.OutputPathOnHost = val2.(android.Path)
	}

	if err = r.InstallDirOnDevice.Decode(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.InstallFileOnDevice)
	if err != nil {
		return err
	}

	return err
}

var DexpreopterInstallGobRegId int16

func (r DexpreopterInstall) GetTypeId() int16 {
	return DexpreopterInstallGobRegId
}

// end of dexpreopt.go

// begin of dexpreopt_bootjars.go
func init() {
	artBootImageHostInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(artBootImageHostInfo) })
	profileInstallInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(profileInstallInfo) })
}

func (r artBootImageHostInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.installs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.installs)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.installs); val1++ {
			if err = r.installs[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r artBootImageHostInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.artBootImageHostInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.RuleBuilderInstalls")
	hasher.WriteString(":.[]RuleBuilderInstall")
	hasher.WriteInt(len(r.installs))
	for val1 := 0; val1 < len(r.installs); val1++ {
		if err := r.installs[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *artBootImageHostInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.installs = make([]android.RuleBuilderInstall, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if err = r.installs[val4].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var artBootImageHostInfoGobRegId int16

func (r artBootImageHostInfo) GetTypeId() int16 {
	return artBootImageHostInfoGobRegId
}

func (r profileInstallInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.profileInstalls == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.profileInstalls)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.profileInstalls); val1++ {
			if err = r.profileInstalls[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if err = r.profileLicenseMetadataFile.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r profileInstallInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.profileInstallInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.RuleBuilderInstalls")
	hasher.WriteString(":.[]RuleBuilderInstall")
	hasher.WriteInt(len(r.profileInstalls))
	for val1 := 0; val1 < len(r.profileInstalls); val1++ {
		if err := r.profileInstalls[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	if err := r.profileLicenseMetadataFile.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *profileInstallInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.profileInstalls = make([]android.RuleBuilderInstall, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if err = r.profileInstalls[val4].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if err = r.profileLicenseMetadataFile.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var profileInstallInfoGobRegId int16

func (r profileInstallInfo) GetTypeId() int16 {
	return profileInstallInfoGobRegId
}

// end of dexpreopt_bootjars.go

// begin of droiddoc.go
func init() {
	ExportedDroiddocDirInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ExportedDroiddocDirInfo) })
}

func (r ExportedDroiddocDirInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.Deps == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Deps)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.Deps); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.Deps[val1]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.Dir); err != nil {
		return err
	}
	return err
}

func (r ExportedDroiddocDirInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ExportedDroiddocDirInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.Deps))
	for val1 := 0; val1 < len(r.Deps); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.Deps[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.Deps[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.Deps[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error { return r.Deps[val1].(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.Deps[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val5 := r.Dir == nil
	if val5 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Dir); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val6 := r.Dir == nil
				if val6 {
					hasher.WriteByte(0)
				} else {
					val7 := func(hasher *proptools.Hasher) error { return r.Dir.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
						return err
					}
				}
			}
		} else {
			r.Dir.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *ExportedDroiddocDirInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.Deps = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.Deps[val4] = nil
			} else {
				r.Deps[val4] = val6.(android.Path)
			}
		}
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.Dir = nil
	} else {
		r.Dir = val8.(android.Path)
	}

	return err
}

var ExportedDroiddocDirInfoGobRegId int16

func (r ExportedDroiddocDirInfo) GetTypeId() int16 {
	return ExportedDroiddocDirInfoGobRegId
}

// end of droiddoc.go

// begin of droidstubs.go
func init() {
	StubsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(StubsInfo) })
	DroidStubsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(DroidStubsInfo) })
	StubsSrcInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(StubsSrcInfo) })
	UpdateApiInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(UpdateApiInfo) })
}

func (r StubsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.ApiVersionsXml); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.AnnotationsZip); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ApiFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.RemovedApiFile); err != nil {
		return err
	}
	return err
}

func (r StubsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.StubsInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":java.android.Path")
	val1 := r.ApiVersionsXml == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ApiVersionsXml); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ApiVersionsXml == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.ApiVersionsXml.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ApiVersionsXml.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.AnnotationsZip == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.AnnotationsZip); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.AnnotationsZip == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.AnnotationsZip.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.AnnotationsZip.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.ApiFile == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.ApiFile == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error { return r.ApiFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.ApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val10 := r.RemovedApiFile == nil
	if val10 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.RemovedApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val11 := r.RemovedApiFile == nil
				if val11 {
					hasher.WriteByte(0)
				} else {
					val12 := func(hasher *proptools.Hasher) error {
						return r.RemovedApiFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val12); err != nil {
						return err
					}
				}
			}
		} else {
			r.RemovedApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *StubsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.ApiVersionsXml = nil
	} else {
		r.ApiVersionsXml = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.AnnotationsZip = nil
	} else {
		r.AnnotationsZip = val4.(android.Path)
	}

	if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val6 == nil {
		r.ApiFile = nil
	} else {
		r.ApiFile = val6.(android.Path)
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.RemovedApiFile = nil
	} else {
		r.RemovedApiFile = val8.(android.Path)
	}

	return err
}

var StubsInfoGobRegId int16

func (r StubsInfo) GetTypeId() int16 {
	return StubsInfoGobRegId
}

func (r DroidStubsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.CheckedInApiFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.CheckedInRemovedApiFile); err != nil {
		return err
	}

	if r.AconfigProtoFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.AconfigProtoFiles)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.AconfigProtoFiles); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.AconfigProtoFiles[val1]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.CurrentApiTimestamp); err != nil {
		return err
	}

	if err = r.EverythingStubsInfo.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.ExportableStubsInfo.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r DroidStubsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.DroidStubsInfo")
	hasher.WriteInt(6)
	hasher.WriteString(":java.android.Path")
	val1 := r.CheckedInApiFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.CheckedInApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.CheckedInApiFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.CheckedInApiFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.CheckedInApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.CheckedInRemovedApiFile == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.CheckedInRemovedApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.CheckedInRemovedApiFile == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.CheckedInRemovedApiFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.CheckedInRemovedApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.AconfigProtoFiles))
	for val7 := 0; val7 < len(r.AconfigProtoFiles); val7++ {
		hasher.WriteString("android/soong/android:android.Path")
		val8 := r.AconfigProtoFiles[val7] == nil
		if val8 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.AconfigProtoFiles[val7]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val9 := r.AconfigProtoFiles[val7] == nil
					if val9 {
						hasher.WriteByte(0)
					} else {
						val10 := func(hasher *proptools.Hasher) error {
							return r.AconfigProtoFiles[val7].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val10); err != nil {
							return err
						}
					}
				}
			} else {
				r.AconfigProtoFiles[val7].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val11 := r.CurrentApiTimestamp == nil
	if val11 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.CurrentApiTimestamp); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val12 := r.CurrentApiTimestamp == nil
				if val12 {
					hasher.WriteByte(0)
				} else {
					val13 := func(hasher *proptools.Hasher) error {
						return r.CurrentApiTimestamp.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val13); err != nil {
						return err
					}
				}
			}
		} else {
			r.CurrentApiTimestamp.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.EverythingStubsInfo.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.ExportableStubsInfo.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *DroidStubsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.CheckedInApiFile = nil
	} else {
		r.CheckedInApiFile = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.CheckedInRemovedApiFile = nil
	} else {
		r.CheckedInRemovedApiFile = val4.(android.Path)
	}

	var val7 int
	err = gobtools.DecodeInt(buf, &val7)
	if err != nil {
		return err
	}
	if val7 != -1 {
		r.AconfigProtoFiles = make([]android.Path, val7)
		for val8 := 0; val8 < int(val7); val8++ {
			if val10, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val10 == nil {
				r.AconfigProtoFiles[val8] = nil
			} else {
				r.AconfigProtoFiles[val8] = val10.(android.Path)
			}
		}
	}

	if val12, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val12 == nil {
		r.CurrentApiTimestamp = nil
	} else {
		r.CurrentApiTimestamp = val12.(android.Path)
	}

	if err = r.EverythingStubsInfo.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.ExportableStubsInfo.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var DroidStubsInfoGobRegId int16

func (r DroidStubsInfo) GetTypeId() int16 {
	return DroidStubsInfoGobRegId
}

func (r StubsSrcInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.EverythingStubsSrcJar); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ExportableStubsSrcJar); err != nil {
		return err
	}
	return err
}

func (r StubsSrcInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.StubsSrcInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Path")
	val1 := r.EverythingStubsSrcJar == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.EverythingStubsSrcJar); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.EverythingStubsSrcJar == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.EverythingStubsSrcJar.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.EverythingStubsSrcJar.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.ExportableStubsSrcJar == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ExportableStubsSrcJar); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.ExportableStubsSrcJar == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.ExportableStubsSrcJar.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.ExportableStubsSrcJar.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *StubsSrcInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.EverythingStubsSrcJar = nil
	} else {
		r.EverythingStubsSrcJar = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.ExportableStubsSrcJar = nil
	} else {
		r.ExportableStubsSrcJar = val4.(android.Path)
	}

	return err
}

var StubsSrcInfoGobRegId int16

func (r StubsSrcInfo) GetTypeId() int16 {
	return StubsSrcInfoGobRegId
}

func (r UpdateApiInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeString(buf, r.Name); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.SourceApiFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.GeneratedApiFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.SourceRemovedFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.GeneratedRemovedFile); err != nil {
		return err
	}
	return err
}

func (r UpdateApiInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.UpdateApiInfo")
	hasher.WriteInt(5)
	hasher.WriteString(":.string")
	hasher.WriteString(r.Name)
	hasher.WriteString(":java.android.Path")
	val1 := r.SourceApiFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.SourceApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.SourceApiFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.SourceApiFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.SourceApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.GeneratedApiFile == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.GeneratedApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.GeneratedApiFile == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.GeneratedApiFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.GeneratedApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.SourceRemovedFile == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.SourceRemovedFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.SourceRemovedFile == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error {
						return r.SourceRemovedFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.SourceRemovedFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val10 := r.GeneratedRemovedFile == nil
	if val10 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.GeneratedRemovedFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val11 := r.GeneratedRemovedFile == nil
				if val11 {
					hasher.WriteByte(0)
				} else {
					val12 := func(hasher *proptools.Hasher) error {
						return r.GeneratedRemovedFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val12); err != nil {
						return err
					}
				}
			}
		} else {
			r.GeneratedRemovedFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *UpdateApiInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeString(buf, &r.Name)
	if err != nil {
		return err
	}

	if val3, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val3 == nil {
		r.SourceApiFile = nil
	} else {
		r.SourceApiFile = val3.(android.Path)
	}

	if val5, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val5 == nil {
		r.GeneratedApiFile = nil
	} else {
		r.GeneratedApiFile = val5.(android.Path)
	}

	if val7, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val7 == nil {
		r.SourceRemovedFile = nil
	} else {
		r.SourceRemovedFile = val7.(android.Path)
	}

	if val9, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val9 == nil {
		r.GeneratedRemovedFile = nil
	} else {
		r.GeneratedRemovedFile = val9.(android.Path)
	}

	return err
}

var UpdateApiInfoGobRegId int16

func (r UpdateApiInfo) GetTypeId() int16 {
	return UpdateApiInfoGobRegId
}

// end of droidstubs.go

// begin of fuzz.go
func init() {
	JavaFuzzTestInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaFuzzTestInfo) })
}

func (r JavaFuzzTestInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.JniFilePaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.JniFilePaths)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.JniFilePaths); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.JniFilePaths[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r JavaFuzzTestInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaFuzzTestInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.JniFilePaths))
	for val1 := 0; val1 < len(r.JniFilePaths); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.JniFilePaths[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.JniFilePaths[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.JniFilePaths[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.JniFilePaths[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.JniFilePaths[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *JavaFuzzTestInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.JniFilePaths = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.JniFilePaths[val4] = nil
			} else {
				r.JniFilePaths[val4] = val6.(android.Path)
			}
		}
	}

	return err
}

var JavaFuzzTestInfoGobRegId int16

func (r JavaFuzzTestInfo) GetTypeId() int16 {
	return JavaFuzzTestInfoGobRegId
}

// end of fuzz.go

// begin of hiddenapi_modular.go
func init() {
	HiddenAPIScopeGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(HiddenAPIScope) })
	FlagFilesByCategoryGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(FlagFilesByCategory) })
	HiddenAPIInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(HiddenAPIInfo) })
	HiddenAPIInfoForSdkGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(HiddenAPIInfoForSdk) })
	ModuleStubDexJarsGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ModuleStubDexJars) })
	HiddenAPIPropertyInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(HiddenAPIPropertyInfo) })
	HiddenAPIFlagOutputGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(HiddenAPIFlagOutput) })
	SignatureCsvSubsetGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SignatureCsvSubset) })
	SignatureCsvSubsetsGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SignatureCsvSubsets) })
}

func (r HiddenAPIScope) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeString(buf, r.name); err != nil {
		return err
	}

	if err = gobtools.EncodeInt(buf, int(r.sdkKind)); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.hiddenAPIListOption); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.nonUpdatableSourceModule); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.nonUpdatableFromTextModule); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.nonUpdatablePrebuiltModule); err != nil {
		return err
	}
	return err
}

func (r HiddenAPIScope) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.HiddenAPIScope")
	hasher.WriteInt(6)
	hasher.WriteString(":.string")
	hasher.WriteString(r.name)
	hasher.WriteString(":java.android.SdkKind")
	hasher.WriteString(":.int")
	hasher.WriteUint64(uint64(int(r.sdkKind)))
	hasher.WriteString(":.string")
	hasher.WriteString(r.hiddenAPIListOption)
	hasher.WriteString(":.string")
	hasher.WriteString(r.nonUpdatableSourceModule)
	hasher.WriteString(":.string")
	hasher.WriteString(r.nonUpdatableFromTextModule)
	hasher.WriteString(":.string")
	hasher.WriteString(r.nonUpdatablePrebuiltModule)
	return nil
}

func (r *HiddenAPIScope) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeString(buf, &r.name)
	if err != nil {
		return err
	}

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	r.sdkKind = android.SdkKind(val3)

	err = gobtools.DecodeString(buf, &r.hiddenAPIListOption)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.nonUpdatableSourceModule)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.nonUpdatableFromTextModule)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.nonUpdatablePrebuiltModule)
	if err != nil {
		return err
	}

	return err
}

var HiddenAPIScopeGobRegId int16

func (r HiddenAPIScope) GetTypeId() int16 {
	return HiddenAPIScopeGobRegId
}

func (r FlagFilesByCategory) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1, val2 := range r {
			if err = gobtools.EncodeInt(buf, int(val1)); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
		}
	}
	return err
}

func (r FlagFilesByCategory) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.map[hiddenAPIFlagFileCategory]android.Paths")
	hasher.WriteInt(len(r))
	val1 := make([]hiddenAPIFlagFileCategory, 0, len(r))
	for val3 := range r {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":java.hiddenAPIFlagFileCategory")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val2)))
		hasher.WriteString(":java.android.Paths")
		hasher.WriteString(":.[]Path")
		hasher.WriteInt(len(r[val2]))
		for val4 := 0; val4 < len(r[val2]); val4++ {
			hasher.WriteString("android/soong/android:android.Path")
			val5 := r[val2][val4] == nil
			if val5 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r[val2][val4]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val6 := r[val2][val4] == nil
						if val6 {
							hasher.WriteByte(0)
						} else {
							val7 := func(hasher *proptools.Hasher) error { return r[val2][val4].(proptools.CustomHash).CustomHash(hasher) }
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
								return err
							}
						}
					}
				} else {
					r[val2][val4].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	return nil
}

func (r *FlagFilesByCategory) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val1 int
	err = gobtools.DecodeInt(buf, &val1)
	if err != nil {
		return err
	}
	if val1 != -1 {
		(*r) = make(map[hiddenAPIFlagFileCategory]android.Paths, val1)
		for val2 := 0; val2 < int(val1); val2++ {
			var val3 hiddenAPIFlagFileCategory
			var val4 android.Paths
			var val6 int
			err = gobtools.DecodeInt(buf, &val6)
			if err != nil {
				return err
			}
			val3 = hiddenAPIFlagFileCategory(val6)
			var val10 int
			err = gobtools.DecodeInt(buf, &val10)
			if err != nil {
				return err
			}
			if val10 != -1 {
				val4 = make([]android.Path, val10)
				for val11 := 0; val11 < int(val10); val11++ {
					if val13, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val13 == nil {
						val4[val11] = nil
					} else {
						val4[val11] = val13.(android.Path)
					}
				}
			}
			(*r)[val3] = val4
		}
	}

	return err
}

var FlagFilesByCategoryGobRegId int16

func (r FlagFilesByCategory) GetTypeId() int16 {
	return FlagFilesByCategoryGobRegId
}

func (r HiddenAPIInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.FlagFilesByCategory == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.FlagFilesByCategory)); err != nil {
			return err
		}
		for val1, val2 := range r.FlagFilesByCategory {
			if err = gobtools.EncodeInt(buf, int(val1)); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
		}
	}

	if r.TransitiveStubDexJarsByScope == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.TransitiveStubDexJarsByScope)); err != nil {
			return err
		}
		for val4, val5 := range r.TransitiveStubDexJarsByScope {
			if err = gobtools.EncodeString(buf, val4); err != nil {
				return err
			}
			if val5 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val5)); err != nil {
					return err
				}
				for val6, val7 := range val5 {
					if err = gobtools.EncodeString(buf, val6); err != nil {
						return err
					}
					if err = gobtools.EncodeInterface(ctx, buf, val7); err != nil {
						return err
					}
				}
			}
		}
	}

	if err = r.HiddenAPIFlagOutput.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r HiddenAPIInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.HiddenAPIInfo")
	hasher.WriteInt(3)
	hasher.WriteString(":java.FlagFilesByCategory")
	hasher.WriteString(":.map[hiddenAPIFlagFileCategory]android.Paths")
	hasher.WriteInt(len(r.FlagFilesByCategory))
	val1 := make([]hiddenAPIFlagFileCategory, 0, len(r.FlagFilesByCategory))
	for val3 := range r.FlagFilesByCategory {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":java.hiddenAPIFlagFileCategory")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val2)))
		hasher.WriteString(":java.android.Paths")
		hasher.WriteString(":.[]Path")
		hasher.WriteInt(len(r.FlagFilesByCategory[val2]))
		for val4 := 0; val4 < len(r.FlagFilesByCategory[val2]); val4++ {
			hasher.WriteString("android/soong/android:android.Path")
			val5 := r.FlagFilesByCategory[val2][val4] == nil
			if val5 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r.FlagFilesByCategory[val2][val4]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val6 := r.FlagFilesByCategory[val2][val4] == nil
						if val6 {
							hasher.WriteByte(0)
						} else {
							val7 := func(hasher *proptools.Hasher) error {
								return r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
							}
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
								return err
							}
						}
					}
				} else {
					r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	hasher.WriteString(":java.StubDexJarsByModule")
	hasher.WriteString(":.map[string]ModuleStubDexJars")
	hasher.WriteInt(len(r.TransitiveStubDexJarsByScope))
	val8 := make([]string, 0, len(r.TransitiveStubDexJarsByScope))
	for val10 := range r.TransitiveStubDexJarsByScope {
		val8 = append(val8, val10)
	}
	proptools.SortOrdered(val8)
	for _, val9 := range val8 {
		hasher.WriteString(":.string")
		hasher.WriteString(val9)
		hasher.WriteString(":java.ModuleStubDexJars")
		hasher.WriteString(":.map[string]android.Path")
		hasher.WriteInt(len(r.TransitiveStubDexJarsByScope[val9]))
		val11 := make([]string, 0, len(r.TransitiveStubDexJarsByScope[val9]))
		for val13 := range r.TransitiveStubDexJarsByScope[val9] {
			val11 = append(val11, val13)
		}
		proptools.SortOrdered(val11)
		for _, val12 := range val11 {
			hasher.WriteString(":.string")
			hasher.WriteString(val12)
			hasher.WriteString(":java.android.Path")
			val14 := r.TransitiveStubDexJarsByScope[val9][val12] == nil
			if val14 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r.TransitiveStubDexJarsByScope[val9][val12]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val15 := r.TransitiveStubDexJarsByScope[val9][val12] == nil
						if val15 {
							hasher.WriteByte(0)
						} else {
							val16 := func(hasher *proptools.Hasher) error {
								return r.TransitiveStubDexJarsByScope[val9][val12].(proptools.CustomHash).CustomHash(hasher)
							}
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val16); err != nil {
								return err
							}
						}
					}
				} else {
					r.TransitiveStubDexJarsByScope[val9][val12].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	if err := r.HiddenAPIFlagOutput.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *HiddenAPIInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.FlagFilesByCategory = make(map[hiddenAPIFlagFileCategory]android.Paths, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 hiddenAPIFlagFileCategory
			var val5 android.Paths
			var val7 int
			err = gobtools.DecodeInt(buf, &val7)
			if err != nil {
				return err
			}
			val4 = hiddenAPIFlagFileCategory(val7)
			var val11 int
			err = gobtools.DecodeInt(buf, &val11)
			if err != nil {
				return err
			}
			if val11 != -1 {
				val5 = make([]android.Path, val11)
				for val12 := 0; val12 < int(val11); val12++ {
					if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val14 == nil {
						val5[val12] = nil
					} else {
						val5[val12] = val14.(android.Path)
					}
				}
			}
			r.FlagFilesByCategory[val4] = val5
		}
	}

	var val16 int
	err = gobtools.DecodeInt(buf, &val16)
	if err != nil {
		return err
	}
	if val16 != -1 {
		r.TransitiveStubDexJarsByScope = make(map[string]ModuleStubDexJars, val16)
		for val17 := 0; val17 < int(val16); val17++ {
			var val18 string
			var val19 ModuleStubDexJars
			err = gobtools.DecodeString(buf, &val18)
			if err != nil {
				return err
			}
			var val22 int
			err = gobtools.DecodeInt(buf, &val22)
			if err != nil {
				return err
			}
			if val22 != -1 {
				val19 = make(map[string]android.Path, val22)
				for val23 := 0; val23 < int(val22); val23++ {
					var val24 string
					var val25 android.Path
					err = gobtools.DecodeString(buf, &val24)
					if err != nil {
						return err
					}
					if val28, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val28 == nil {
						val25 = nil
					} else {
						val25 = val28.(android.Path)
					}
					val19[val24] = val25
				}
			}
			r.TransitiveStubDexJarsByScope[val18] = val19
		}
	}

	if err = r.HiddenAPIFlagOutput.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var HiddenAPIInfoGobRegId int16

func (r HiddenAPIInfo) GetTypeId() int16 {
	return HiddenAPIInfoGobRegId
}

func (r HiddenAPIInfoForSdk) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.FlagFilesByCategory == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.FlagFilesByCategory)); err != nil {
			return err
		}
		for val1, val2 := range r.FlagFilesByCategory {
			if err = gobtools.EncodeInt(buf, int(val1)); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
		}
	}

	if err = r.HiddenAPIFlagOutput.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r HiddenAPIInfoForSdk) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.HiddenAPIInfoForSdk")
	hasher.WriteInt(2)
	hasher.WriteString(":java.FlagFilesByCategory")
	hasher.WriteString(":.map[hiddenAPIFlagFileCategory]android.Paths")
	hasher.WriteInt(len(r.FlagFilesByCategory))
	val1 := make([]hiddenAPIFlagFileCategory, 0, len(r.FlagFilesByCategory))
	for val3 := range r.FlagFilesByCategory {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":java.hiddenAPIFlagFileCategory")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val2)))
		hasher.WriteString(":java.android.Paths")
		hasher.WriteString(":.[]Path")
		hasher.WriteInt(len(r.FlagFilesByCategory[val2]))
		for val4 := 0; val4 < len(r.FlagFilesByCategory[val2]); val4++ {
			hasher.WriteString("android/soong/android:android.Path")
			val5 := r.FlagFilesByCategory[val2][val4] == nil
			if val5 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r.FlagFilesByCategory[val2][val4]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val6 := r.FlagFilesByCategory[val2][val4] == nil
						if val6 {
							hasher.WriteByte(0)
						} else {
							val7 := func(hasher *proptools.Hasher) error {
								return r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
							}
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
								return err
							}
						}
					}
				} else {
					r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	if err := r.HiddenAPIFlagOutput.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *HiddenAPIInfoForSdk) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.FlagFilesByCategory = make(map[hiddenAPIFlagFileCategory]android.Paths, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 hiddenAPIFlagFileCategory
			var val5 android.Paths
			var val7 int
			err = gobtools.DecodeInt(buf, &val7)
			if err != nil {
				return err
			}
			val4 = hiddenAPIFlagFileCategory(val7)
			var val11 int
			err = gobtools.DecodeInt(buf, &val11)
			if err != nil {
				return err
			}
			if val11 != -1 {
				val5 = make([]android.Path, val11)
				for val12 := 0; val12 < int(val11); val12++ {
					if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val14 == nil {
						val5[val12] = nil
					} else {
						val5[val12] = val14.(android.Path)
					}
				}
			}
			r.FlagFilesByCategory[val4] = val5
		}
	}

	if err = r.HiddenAPIFlagOutput.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var HiddenAPIInfoForSdkGobRegId int16

func (r HiddenAPIInfoForSdk) GetTypeId() int16 {
	return HiddenAPIInfoForSdkGobRegId
}

func (r ModuleStubDexJars) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1, val2 := range r {
			if err = gobtools.EncodeString(buf, val1); err != nil {
				return err
			}
			if err = gobtools.EncodeInterface(ctx, buf, val2); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ModuleStubDexJars) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.map[string]android.Path")
	hasher.WriteInt(len(r))
	val1 := make([]string, 0, len(r))
	for val3 := range r {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":.string")
		hasher.WriteString(val2)
		hasher.WriteString(":java.android.Path")
		val4 := r[val2] == nil
		if val4 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r[val2]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val5 := r[val2] == nil
					if val5 {
						hasher.WriteByte(0)
					} else {
						val6 := func(hasher *proptools.Hasher) error { return r[val2].(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
							return err
						}
					}
				}
			} else {
				r[val2].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *ModuleStubDexJars) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val1 int
	err = gobtools.DecodeInt(buf, &val1)
	if err != nil {
		return err
	}
	if val1 != -1 {
		(*r) = make(map[string]android.Path, val1)
		for val2 := 0; val2 < int(val1); val2++ {
			var val3 string
			var val4 android.Path
			err = gobtools.DecodeString(buf, &val3)
			if err != nil {
				return err
			}
			if val7, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val7 == nil {
				val4 = nil
			} else {
				val4 = val7.(android.Path)
			}
			(*r)[val3] = val4
		}
	}

	return err
}

var ModuleStubDexJarsGobRegId int16

func (r ModuleStubDexJars) GetTypeId() int16 {
	return ModuleStubDexJarsGobRegId
}

func (r HiddenAPIPropertyInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.FlagFilesByCategory == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.FlagFilesByCategory)); err != nil {
			return err
		}
		for val1, val2 := range r.FlagFilesByCategory {
			if err = gobtools.EncodeInt(buf, int(val1)); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
		}
	}

	if r.PackagePrefixes == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.PackagePrefixes)); err != nil {
			return err
		}
		for val4 := 0; val4 < len(r.PackagePrefixes); val4++ {
			if err = gobtools.EncodeString(buf, r.PackagePrefixes[val4]); err != nil {
				return err
			}
		}
	}

	if r.SinglePackages == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.SinglePackages)); err != nil {
			return err
		}
		for val5 := 0; val5 < len(r.SinglePackages); val5++ {
			if err = gobtools.EncodeString(buf, r.SinglePackages[val5]); err != nil {
				return err
			}
		}
	}

	if r.SplitPackages == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.SplitPackages)); err != nil {
			return err
		}
		for val6 := 0; val6 < len(r.SplitPackages); val6++ {
			if err = gobtools.EncodeString(buf, r.SplitPackages[val6]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r HiddenAPIPropertyInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.HiddenAPIPropertyInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":java.FlagFilesByCategory")
	hasher.WriteString(":.map[hiddenAPIFlagFileCategory]android.Paths")
	hasher.WriteInt(len(r.FlagFilesByCategory))
	val1 := make([]hiddenAPIFlagFileCategory, 0, len(r.FlagFilesByCategory))
	for val3 := range r.FlagFilesByCategory {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":java.hiddenAPIFlagFileCategory")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val2)))
		hasher.WriteString(":java.android.Paths")
		hasher.WriteString(":.[]Path")
		hasher.WriteInt(len(r.FlagFilesByCategory[val2]))
		for val4 := 0; val4 < len(r.FlagFilesByCategory[val2]); val4++ {
			hasher.WriteString("android/soong/android:android.Path")
			val5 := r.FlagFilesByCategory[val2][val4] == nil
			if val5 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r.FlagFilesByCategory[val2][val4]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val6 := r.FlagFilesByCategory[val2][val4] == nil
						if val6 {
							hasher.WriteByte(0)
						} else {
							val7 := func(hasher *proptools.Hasher) error {
								return r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
							}
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
								return err
							}
						}
					}
				} else {
					r.FlagFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.PackagePrefixes))
	for val8 := 0; val8 < len(r.PackagePrefixes); val8++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.PackagePrefixes[val8])
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.SinglePackages))
	for val9 := 0; val9 < len(r.SinglePackages); val9++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.SinglePackages[val9])
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.SplitPackages))
	for val10 := 0; val10 < len(r.SplitPackages); val10++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.SplitPackages[val10])
	}
	return nil
}

func (r *HiddenAPIPropertyInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.FlagFilesByCategory = make(map[hiddenAPIFlagFileCategory]android.Paths, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 hiddenAPIFlagFileCategory
			var val5 android.Paths
			var val7 int
			err = gobtools.DecodeInt(buf, &val7)
			if err != nil {
				return err
			}
			val4 = hiddenAPIFlagFileCategory(val7)
			var val11 int
			err = gobtools.DecodeInt(buf, &val11)
			if err != nil {
				return err
			}
			if val11 != -1 {
				val5 = make([]android.Path, val11)
				for val12 := 0; val12 < int(val11); val12++ {
					if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val14 == nil {
						val5[val12] = nil
					} else {
						val5[val12] = val14.(android.Path)
					}
				}
			}
			r.FlagFilesByCategory[val4] = val5
		}
	}

	var val16 int
	err = gobtools.DecodeInt(buf, &val16)
	if err != nil {
		return err
	}
	if val16 != -1 {
		r.PackagePrefixes = make([]string, val16)
		for val17 := 0; val17 < int(val16); val17++ {
			err = gobtools.DecodeString(buf, &r.PackagePrefixes[val17])
			if err != nil {
				return err
			}
		}
	}

	var val20 int
	err = gobtools.DecodeInt(buf, &val20)
	if err != nil {
		return err
	}
	if val20 != -1 {
		r.SinglePackages = make([]string, val20)
		for val21 := 0; val21 < int(val20); val21++ {
			err = gobtools.DecodeString(buf, &r.SinglePackages[val21])
			if err != nil {
				return err
			}
		}
	}

	var val24 int
	err = gobtools.DecodeInt(buf, &val24)
	if err != nil {
		return err
	}
	if val24 != -1 {
		r.SplitPackages = make([]string, val24)
		for val25 := 0; val25 < int(val24); val25++ {
			err = gobtools.DecodeString(buf, &r.SplitPackages[val25])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var HiddenAPIPropertyInfoGobRegId int16

func (r HiddenAPIPropertyInfo) GetTypeId() int16 {
	return HiddenAPIPropertyInfoGobRegId
}

func (r HiddenAPIFlagOutput) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.AnnotationFlagsPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.MetadataPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.IndexPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.StubFlagsPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.AllFlagsPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.SignaturePatternsPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.FilteredStubFlagsPath); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.FilteredFlagsPath); err != nil {
		return err
	}
	return err
}

func (r HiddenAPIFlagOutput) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.HiddenAPIFlagOutput")
	hasher.WriteInt(8)
	hasher.WriteString(":java.android.Path")
	val1 := r.AnnotationFlagsPath == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.AnnotationFlagsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.AnnotationFlagsPath == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.AnnotationFlagsPath.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.AnnotationFlagsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.MetadataPath == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.MetadataPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.MetadataPath == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error { return r.MetadataPath.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.MetadataPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.IndexPath == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.IndexPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.IndexPath == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error { return r.IndexPath.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.IndexPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val10 := r.StubFlagsPath == nil
	if val10 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.StubFlagsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val11 := r.StubFlagsPath == nil
				if val11 {
					hasher.WriteByte(0)
				} else {
					val12 := func(hasher *proptools.Hasher) error { return r.StubFlagsPath.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val12); err != nil {
						return err
					}
				}
			}
		} else {
			r.StubFlagsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val13 := r.AllFlagsPath == nil
	if val13 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.AllFlagsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val14 := r.AllFlagsPath == nil
				if val14 {
					hasher.WriteByte(0)
				} else {
					val15 := func(hasher *proptools.Hasher) error { return r.AllFlagsPath.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val15); err != nil {
						return err
					}
				}
			}
		} else {
			r.AllFlagsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val16 := r.SignaturePatternsPath == nil
	if val16 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.SignaturePatternsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val17 := r.SignaturePatternsPath == nil
				if val17 {
					hasher.WriteByte(0)
				} else {
					val18 := func(hasher *proptools.Hasher) error {
						return r.SignaturePatternsPath.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val18); err != nil {
						return err
					}
				}
			}
		} else {
			r.SignaturePatternsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val19 := r.FilteredStubFlagsPath == nil
	if val19 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.FilteredStubFlagsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val20 := r.FilteredStubFlagsPath == nil
				if val20 {
					hasher.WriteByte(0)
				} else {
					val21 := func(hasher *proptools.Hasher) error {
						return r.FilteredStubFlagsPath.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val21); err != nil {
						return err
					}
				}
			}
		} else {
			r.FilteredStubFlagsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val22 := r.FilteredFlagsPath == nil
	if val22 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.FilteredFlagsPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val23 := r.FilteredFlagsPath == nil
				if val23 {
					hasher.WriteByte(0)
				} else {
					val24 := func(hasher *proptools.Hasher) error {
						return r.FilteredFlagsPath.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val24); err != nil {
						return err
					}
				}
			}
		} else {
			r.FilteredFlagsPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *HiddenAPIFlagOutput) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.AnnotationFlagsPath = nil
	} else {
		r.AnnotationFlagsPath = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.MetadataPath = nil
	} else {
		r.MetadataPath = val4.(android.Path)
	}

	if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val6 == nil {
		r.IndexPath = nil
	} else {
		r.IndexPath = val6.(android.Path)
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.StubFlagsPath = nil
	} else {
		r.StubFlagsPath = val8.(android.Path)
	}

	if val10, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val10 == nil {
		r.AllFlagsPath = nil
	} else {
		r.AllFlagsPath = val10.(android.Path)
	}

	if val12, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val12 == nil {
		r.SignaturePatternsPath = nil
	} else {
		r.SignaturePatternsPath = val12.(android.Path)
	}

	if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val14 == nil {
		r.FilteredStubFlagsPath = nil
	} else {
		r.FilteredStubFlagsPath = val14.(android.Path)
	}

	if val16, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val16 == nil {
		r.FilteredFlagsPath = nil
	} else {
		r.FilteredFlagsPath = val16.(android.Path)
	}

	return err
}

var HiddenAPIFlagOutputGobRegId int16

func (r HiddenAPIFlagOutput) GetTypeId() int16 {
	return HiddenAPIFlagOutputGobRegId
}

func (r SignatureCsvSubset) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.CsvFile); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.SignaturePatternsFile); err != nil {
		return err
	}
	return err
}

func (r SignatureCsvSubset) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SignatureCsvSubset")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Path")
	val1 := r.CsvFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.CsvFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.CsvFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.CsvFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.CsvFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.SignaturePatternsFile == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.SignaturePatternsFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.SignaturePatternsFile == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.SignaturePatternsFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.SignaturePatternsFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *SignatureCsvSubset) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.CsvFile = nil
	} else {
		r.CsvFile = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.SignaturePatternsFile = nil
	} else {
		r.SignaturePatternsFile = val4.(android.Path)
	}

	return err
}

var SignatureCsvSubsetGobRegId int16

func (r SignatureCsvSubset) GetTypeId() int16 {
	return SignatureCsvSubsetGobRegId
}

func (r SignatureCsvSubsets) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r); val1++ {
			if err = r[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r SignatureCsvSubsets) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.[]SignatureCsvSubset")
	hasher.WriteInt(len(r))
	for val1 := 0; val1 < len(r); val1++ {
		if err := r[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *SignatureCsvSubsets) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		(*r) = make([]SignatureCsvSubset, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			if err = (*r)[val3].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var SignatureCsvSubsetsGobRegId int16

func (r SignatureCsvSubsets) GetTypeId() int16 {
	return SignatureCsvSubsetsGobRegId
}

// end of hiddenapi_modular.go

// begin of hiddenapi_monolithic.go
func init() {
	MonolithicHiddenAPIInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(MonolithicHiddenAPIInfo) })
}

func (r MonolithicHiddenAPIInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.FlagsFilesByCategory == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.FlagsFilesByCategory)); err != nil {
			return err
		}
		for val1, val2 := range r.FlagsFilesByCategory {
			if err = gobtools.EncodeInt(buf, int(val1)); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					if err = gobtools.EncodeInterface(ctx, buf, val2[val3]); err != nil {
						return err
					}
				}
			}
		}
	}

	if r.AnnotationFlagsPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.AnnotationFlagsPaths)); err != nil {
			return err
		}
		for val4 := 0; val4 < len(r.AnnotationFlagsPaths); val4++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.AnnotationFlagsPaths[val4]); err != nil {
				return err
			}
		}
	}

	if r.MetadataPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.MetadataPaths)); err != nil {
			return err
		}
		for val5 := 0; val5 < len(r.MetadataPaths); val5++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.MetadataPaths[val5]); err != nil {
				return err
			}
		}
	}

	if r.IndexPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.IndexPaths)); err != nil {
			return err
		}
		for val6 := 0; val6 < len(r.IndexPaths); val6++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.IndexPaths[val6]); err != nil {
				return err
			}
		}
	}

	if r.StubFlagSubsets == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.StubFlagSubsets)); err != nil {
			return err
		}
		for val7 := 0; val7 < len(r.StubFlagSubsets); val7++ {
			if err = r.StubFlagSubsets[val7].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.FlagSubsets == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.FlagSubsets)); err != nil {
			return err
		}
		for val8 := 0; val8 < len(r.FlagSubsets); val8++ {
			if err = r.FlagSubsets[val8].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.ClassesJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ClassesJars)); err != nil {
			return err
		}
		for val9 := 0; val9 < len(r.ClassesJars); val9++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ClassesJars[val9]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r MonolithicHiddenAPIInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.MonolithicHiddenAPIInfo")
	hasher.WriteInt(7)
	hasher.WriteString(":java.FlagFilesByCategory")
	hasher.WriteString(":.map[hiddenAPIFlagFileCategory]android.Paths")
	hasher.WriteInt(len(r.FlagsFilesByCategory))
	val1 := make([]hiddenAPIFlagFileCategory, 0, len(r.FlagsFilesByCategory))
	for val3 := range r.FlagsFilesByCategory {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":java.hiddenAPIFlagFileCategory")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val2)))
		hasher.WriteString(":java.android.Paths")
		hasher.WriteString(":.[]Path")
		hasher.WriteInt(len(r.FlagsFilesByCategory[val2]))
		for val4 := 0; val4 < len(r.FlagsFilesByCategory[val2]); val4++ {
			hasher.WriteString("android/soong/android:android.Path")
			val5 := r.FlagsFilesByCategory[val2][val4] == nil
			if val5 {
				hasher.WriteByte(0)
			} else {
				if v := reflect.ValueOf(r.FlagsFilesByCategory[val2][val4]); v.Kind() == reflect.Ptr {
					if v.IsNil() {
						panic(fmt.Errorf("nil pointer is not supported in interface"))
					} else {
						val6 := r.FlagsFilesByCategory[val2][val4] == nil
						if val6 {
							hasher.WriteByte(0)
						} else {
							val7 := func(hasher *proptools.Hasher) error {
								return r.FlagsFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
							}
							if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
								return err
							}
						}
					}
				} else {
					r.FlagsFilesByCategory[val2][val4].(proptools.CustomHash).CustomHash(hasher)
				}
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.AnnotationFlagsPaths))
	for val8 := 0; val8 < len(r.AnnotationFlagsPaths); val8++ {
		hasher.WriteString("android/soong/android:android.Path")
		val9 := r.AnnotationFlagsPaths[val8] == nil
		if val9 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.AnnotationFlagsPaths[val8]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val10 := r.AnnotationFlagsPaths[val8] == nil
					if val10 {
						hasher.WriteByte(0)
					} else {
						val11 := func(hasher *proptools.Hasher) error {
							return r.AnnotationFlagsPaths[val8].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val11); err != nil {
							return err
						}
					}
				}
			} else {
				r.AnnotationFlagsPaths[val8].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.MetadataPaths))
	for val12 := 0; val12 < len(r.MetadataPaths); val12++ {
		hasher.WriteString("android/soong/android:android.Path")
		val13 := r.MetadataPaths[val12] == nil
		if val13 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.MetadataPaths[val12]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val14 := r.MetadataPaths[val12] == nil
					if val14 {
						hasher.WriteByte(0)
					} else {
						val15 := func(hasher *proptools.Hasher) error {
							return r.MetadataPaths[val12].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val15); err != nil {
							return err
						}
					}
				}
			} else {
				r.MetadataPaths[val12].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.IndexPaths))
	for val16 := 0; val16 < len(r.IndexPaths); val16++ {
		hasher.WriteString("android/soong/android:android.Path")
		val17 := r.IndexPaths[val16] == nil
		if val17 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.IndexPaths[val16]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val18 := r.IndexPaths[val16] == nil
					if val18 {
						hasher.WriteByte(0)
					} else {
						val19 := func(hasher *proptools.Hasher) error {
							return r.IndexPaths[val16].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val19); err != nil {
							return err
						}
					}
				}
			} else {
				r.IndexPaths[val16].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.SignatureCsvSubsets")
	hasher.WriteString(":.[]SignatureCsvSubset")
	hasher.WriteInt(len(r.StubFlagSubsets))
	for val20 := 0; val20 < len(r.StubFlagSubsets); val20++ {
		if err := r.StubFlagSubsets[val20].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.SignatureCsvSubsets")
	hasher.WriteString(":.[]SignatureCsvSubset")
	hasher.WriteInt(len(r.FlagSubsets))
	for val21 := 0; val21 < len(r.FlagSubsets); val21++ {
		if err := r.FlagSubsets[val21].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ClassesJars))
	for val22 := 0; val22 < len(r.ClassesJars); val22++ {
		hasher.WriteString("android/soong/android:android.Path")
		val23 := r.ClassesJars[val22] == nil
		if val23 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ClassesJars[val22]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val24 := r.ClassesJars[val22] == nil
					if val24 {
						hasher.WriteByte(0)
					} else {
						val25 := func(hasher *proptools.Hasher) error {
							return r.ClassesJars[val22].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val25); err != nil {
							return err
						}
					}
				}
			} else {
				r.ClassesJars[val22].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *MonolithicHiddenAPIInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.FlagsFilesByCategory = make(map[hiddenAPIFlagFileCategory]android.Paths, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			var val4 hiddenAPIFlagFileCategory
			var val5 android.Paths
			var val7 int
			err = gobtools.DecodeInt(buf, &val7)
			if err != nil {
				return err
			}
			val4 = hiddenAPIFlagFileCategory(val7)
			var val11 int
			err = gobtools.DecodeInt(buf, &val11)
			if err != nil {
				return err
			}
			if val11 != -1 {
				val5 = make([]android.Path, val11)
				for val12 := 0; val12 < int(val11); val12++ {
					if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
						return err
					} else if val14 == nil {
						val5[val12] = nil
					} else {
						val5[val12] = val14.(android.Path)
					}
				}
			}
			r.FlagsFilesByCategory[val4] = val5
		}
	}

	var val17 int
	err = gobtools.DecodeInt(buf, &val17)
	if err != nil {
		return err
	}
	if val17 != -1 {
		r.AnnotationFlagsPaths = make([]android.Path, val17)
		for val18 := 0; val18 < int(val17); val18++ {
			if val20, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val20 == nil {
				r.AnnotationFlagsPaths[val18] = nil
			} else {
				r.AnnotationFlagsPaths[val18] = val20.(android.Path)
			}
		}
	}

	var val23 int
	err = gobtools.DecodeInt(buf, &val23)
	if err != nil {
		return err
	}
	if val23 != -1 {
		r.MetadataPaths = make([]android.Path, val23)
		for val24 := 0; val24 < int(val23); val24++ {
			if val26, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val26 == nil {
				r.MetadataPaths[val24] = nil
			} else {
				r.MetadataPaths[val24] = val26.(android.Path)
			}
		}
	}

	var val29 int
	err = gobtools.DecodeInt(buf, &val29)
	if err != nil {
		return err
	}
	if val29 != -1 {
		r.IndexPaths = make([]android.Path, val29)
		for val30 := 0; val30 < int(val29); val30++ {
			if val32, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val32 == nil {
				r.IndexPaths[val30] = nil
			} else {
				r.IndexPaths[val30] = val32.(android.Path)
			}
		}
	}

	var val35 int
	err = gobtools.DecodeInt(buf, &val35)
	if err != nil {
		return err
	}
	if val35 != -1 {
		r.StubFlagSubsets = make([]SignatureCsvSubset, val35)
		for val36 := 0; val36 < int(val35); val36++ {
			if err = r.StubFlagSubsets[val36].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	var val40 int
	err = gobtools.DecodeInt(buf, &val40)
	if err != nil {
		return err
	}
	if val40 != -1 {
		r.FlagSubsets = make([]SignatureCsvSubset, val40)
		for val41 := 0; val41 < int(val40); val41++ {
			if err = r.FlagSubsets[val41].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	var val45 int
	err = gobtools.DecodeInt(buf, &val45)
	if err != nil {
		return err
	}
	if val45 != -1 {
		r.ClassesJars = make([]android.Path, val45)
		for val46 := 0; val46 < int(val45); val46++ {
			if val48, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val48 == nil {
				r.ClassesJars[val46] = nil
			} else {
				r.ClassesJars[val46] = val48.(android.Path)
			}
		}
	}

	return err
}

var MonolithicHiddenAPIInfoGobRegId int16

func (r MonolithicHiddenAPIInfo) GetTypeId() int16 {
	return MonolithicHiddenAPIInfoGobRegId
}

// end of hiddenapi_monolithic.go

// begin of jacoco.go
func init() {
	JacocoInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JacocoInfo) })
	JacocoInfosGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JacocoInfos) })
}

func (r JacocoInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.ReportClassesFile); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.Class); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.ModuleName); err != nil {
		return err
	}
	return err
}

func (r JacocoInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JacocoInfo")
	hasher.WriteInt(3)
	hasher.WriteString(":java.android.Path")
	val1 := r.ReportClassesFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ReportClassesFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ReportClassesFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.ReportClassesFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ReportClassesFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.Class)
	hasher.WriteString(":.string")
	hasher.WriteString(r.ModuleName)
	return nil
}

func (r *JacocoInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.ReportClassesFile = nil
	} else {
		r.ReportClassesFile = val2.(android.Path)
	}

	err = gobtools.DecodeString(buf, &r.Class)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.ModuleName)
	if err != nil {
		return err
	}

	return err
}

var JacocoInfoGobRegId int16

func (r JacocoInfo) GetTypeId() int16 {
	return JacocoInfoGobRegId
}

func (r JacocoInfos) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r); val1++ {
			if err = r[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r JacocoInfos) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":.[]JacocoInfo")
	hasher.WriteInt(len(r))
	for val1 := 0; val1 < len(r); val1++ {
		if err := r[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *JacocoInfos) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		(*r) = make([]JacocoInfo, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			if err = (*r)[val3].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var JacocoInfosGobRegId int16

func (r JacocoInfos) GetTypeId() int16 {
	return JacocoInfosGobRegId
}

// end of jacoco.go

// begin of java.go
func init() {
	ProguardSpecInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ProguardSpecInfo) })
	AndroidLibraryDependencyInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(AndroidLibraryDependencyInfo) })
	UsesLibraryDependencyInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(UsesLibraryDependencyInfo) })
	ProvidesUsesLibInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ProvidesUsesLibInfo) })
	ModuleWithSdkDepInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ModuleWithSdkDepInfo) })
	ApexDependencyInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApexDependencyInfo) })
	JavaInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaInfo) })
	DexpreopterInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(DexpreopterInfo) })
	JavaLibraryInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaLibraryInfo) })
	JavaDexImportInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaDexImportInfo) })
	SyspropPublicStubInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SyspropPublicStubInfo) })
	jniLibGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(jniLib) })
	JavaTestInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaTestInfo) })
	JavaApiImportInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaApiImportInfo) })
	JavaImportDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaImportDepInSameApexChecker) })
}

func (r ProguardSpecInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeBool(buf, r.Export_proguard_flags_files); err != nil {
		return err
	}

	if err = r.ProguardFlagsFiles.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.IncludedProguardFlagsFiles.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.UnconditionallyExportedProguardFlags.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.IncludedUnconditionallyExportedProguardFlags.EncodeInterface(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r ProguardSpecInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ProguardSpecInfo")
	hasher.WriteInt(5)
	hasher.WriteString(":.bool")
	if r.Export_proguard_flags_files {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	val5 := func(hasher *proptools.Hasher, val1 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val2 := val1 == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val1); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := val1 == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error { return val1.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				val1.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.ProguardFlagsFiles.Hash(hasher, "android.Path", val5); err != nil {
		return err
	}
	val10 := func(hasher *proptools.Hasher, val6 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val7 := val6 == nil
		if val7 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val6); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val8 := val6 == nil
					if val8 {
						hasher.WriteByte(0)
					} else {
						val9 := func(hasher *proptools.Hasher) error { return val6.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
							return err
						}
					}
				}
			} else {
				val6.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.IncludedProguardFlagsFiles.Hash(hasher, "android.Path", val10); err != nil {
		return err
	}
	val15 := func(hasher *proptools.Hasher, val11 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val12 := val11 == nil
		if val12 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val11); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val13 := val11 == nil
					if val13 {
						hasher.WriteByte(0)
					} else {
						val14 := func(hasher *proptools.Hasher) error { return val11.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val14); err != nil {
							return err
						}
					}
				}
			} else {
				val11.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.UnconditionallyExportedProguardFlags.Hash(hasher, "android.Path", val15); err != nil {
		return err
	}
	val20 := func(hasher *proptools.Hasher, val16 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val17 := val16 == nil
		if val17 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val16); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val18 := val16 == nil
					if val18 {
						hasher.WriteByte(0)
					} else {
						val19 := func(hasher *proptools.Hasher) error { return val16.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val19); err != nil {
							return err
						}
					}
				}
			} else {
				val16.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.IncludedUnconditionallyExportedProguardFlags.Hash(hasher, "android.Path", val20); err != nil {
		return err
	}
	return nil
}

func (r *ProguardSpecInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeBool(buf, &r.Export_proguard_flags_files)
	if err != nil {
		return err
	}

	if err = r.ProguardFlagsFiles.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.IncludedProguardFlagsFiles.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.UnconditionallyExportedProguardFlags.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.IncludedUnconditionallyExportedProguardFlags.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	return err
}

var ProguardSpecInfoGobRegId int16

func (r ProguardSpecInfo) GetTypeId() int16 {
	return ProguardSpecInfoGobRegId
}

func (r AndroidLibraryDependencyInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.ExportPackage); err != nil {
		return err
	}

	if err = r.ResourcesNodeDepSet.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.RRODirsDepSet.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.ManifestsDepSet.EncodeInterface(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r AndroidLibraryDependencyInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.AndroidLibraryDependencyInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":java.android.Path")
	val1 := r.ExportPackage == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ExportPackage); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ExportPackage == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.ExportPackage.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ExportPackage.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	val5 := func(hasher *proptools.Hasher, val4 resourcesNode) error {
		if err := val4.CustomHash(hasher); err != nil {
			return err
		}
		return nil
	}
	if err := r.ResourcesNodeDepSet.Hash(hasher, "resourcesNode", val5); err != nil {
		return err
	}
	val7 := func(hasher *proptools.Hasher, val6 rroDir) error {
		if err := val6.CustomHash(hasher); err != nil {
			return err
		}
		return nil
	}
	if err := r.RRODirsDepSet.Hash(hasher, "rroDir", val7); err != nil {
		return err
	}
	val12 := func(hasher *proptools.Hasher, val8 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val9 := val8 == nil
		if val9 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val8); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val10 := val8 == nil
					if val10 {
						hasher.WriteByte(0)
					} else {
						val11 := func(hasher *proptools.Hasher) error { return val8.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val11); err != nil {
							return err
						}
					}
				}
			} else {
				val8.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.ManifestsDepSet.Hash(hasher, "android.Path", val12); err != nil {
		return err
	}
	return nil
}

func (r *AndroidLibraryDependencyInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.ExportPackage = nil
	} else {
		r.ExportPackage = val2.(android.Path)
	}

	if err = r.ResourcesNodeDepSet.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.RRODirsDepSet.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.ManifestsDepSet.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	return err
}

var AndroidLibraryDependencyInfoGobRegId int16

func (r AndroidLibraryDependencyInfo) GetTypeId() int16 {
	return AndroidLibraryDependencyInfoGobRegId
}

func (r UsesLibraryDependencyInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.DexJarInstallPath); err != nil {
		return err
	}

	if r.ClassLoaderContexts == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ClassLoaderContexts)); err != nil {
			return err
		}
		for val1, val2 := range r.ClassLoaderContexts {
			if err = gobtools.EncodeInt(buf, val1); err != nil {
				return err
			}
			if val2 == nil {
				if err = gobtools.EncodeInt(buf, -1); err != nil {
					return err
				}
			} else {
				if err = gobtools.EncodeInt(buf, len(val2)); err != nil {
					return err
				}
				for val3 := 0; val3 < len(val2); val3++ {
					val4 := val2[val3] == nil
					if err = gobtools.EncodeBool(buf, val4); err != nil {
						return err
					}
					if !val4 {
						if err = (*val2[val3]).Encode(ctx, buf); err != nil {
							return err
						}
					}
				}
			}
		}
	}
	return err
}

func (r UsesLibraryDependencyInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.UsesLibraryDependencyInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Path")
	val1 := r.DexJarInstallPath == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.DexJarInstallPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.DexJarInstallPath == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.DexJarInstallPath.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.DexJarInstallPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.dexpreopt.ClassLoaderContextMap")
	hasher.WriteString(":.map[int][]*ClassLoaderContext")
	hasher.WriteInt(len(r.ClassLoaderContexts))
	val4 := make([]int, 0, len(r.ClassLoaderContexts))
	for val6 := range r.ClassLoaderContexts {
		val4 = append(val4, val6)
	}
	proptools.SortOrdered(val4)
	for _, val5 := range val4 {
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(val5))
		hasher.WriteString(":.[]*ClassLoaderContext")
		hasher.WriteInt(len(r.ClassLoaderContexts[val5]))
		for val7 := 0; val7 < len(r.ClassLoaderContexts[val5]); val7++ {
			hasher.WriteString(":.*ClassLoaderContext")
			val8 := r.ClassLoaderContexts[val5][val7] == nil
			if val8 {
				hasher.WriteByte(0)
			} else {
				val9 := func(hasher *proptools.Hasher) error {
					if err := (*r.ClassLoaderContexts[val5][val7]).CustomHash(hasher); err != nil {
						return err
					}
					return nil
				}
				if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ClassLoaderContexts[val5][val7])), val9); err != nil {
					return err
				}
			}
		}
	}
	return nil
}

func (r *UsesLibraryDependencyInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.DexJarInstallPath = nil
	} else {
		r.DexJarInstallPath = val2.(android.Path)
	}

	var val4 int
	err = gobtools.DecodeInt(buf, &val4)
	if err != nil {
		return err
	}
	if val4 != -1 {
		r.ClassLoaderContexts = make(map[int][]*dexpreopt.ClassLoaderContext, val4)
		for val5 := 0; val5 < int(val4); val5++ {
			var val6 int
			var val7 []*dexpreopt.ClassLoaderContext
			err = gobtools.DecodeInt(buf, &val6)
			if err != nil {
				return err
			}
			var val10 int
			err = gobtools.DecodeInt(buf, &val10)
			if err != nil {
				return err
			}
			if val10 != -1 {
				val7 = make([]*dexpreopt.ClassLoaderContext, val10)
				for val11 := 0; val11 < int(val10); val11++ {
					var val13 bool
					if err = gobtools.DecodeBool(buf, &val13); err != nil {
						return err
					}
					if !val13 {
						var val12 dexpreopt.ClassLoaderContext
						if err = val12.Decode(ctx, buf); err != nil {
							return err
						}
						val7[val11] = &val12
					}
				}
			}
			r.ClassLoaderContexts[val6] = val7
		}
	}

	return err
}

var UsesLibraryDependencyInfoGobRegId int16

func (r UsesLibraryDependencyInfo) GetTypeId() int16 {
	return UsesLibraryDependencyInfoGobRegId
}

func (r ProvidesUsesLibInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.ProvidesUsesLib == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.ProvidesUsesLib)); err != nil {
			return err
		}
	}
	return err
}

func (r ProvidesUsesLibInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ProvidesUsesLibInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.*string")
	val1 := r.ProvidesUsesLib == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.ProvidesUsesLib))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ProvidesUsesLib)), val2); err != nil {
			return err
		}
	}
	return nil
}

func (r *ProvidesUsesLibInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 string
		err = gobtools.DecodeString(buf, &val1)
		if err != nil {
			return err
		}
		r.ProvidesUsesLib = &val1
	}

	return err
}

var ProvidesUsesLibInfoGobRegId int16

func (r ProvidesUsesLibInfo) GetTypeId() int16 {
	return ProvidesUsesLibInfoGobRegId
}

func (r ModuleWithSdkDepInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInt(buf, int(r.SdkLinkType)); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Stubs); err != nil {
		return err
	}
	return err
}

func (r ModuleWithSdkDepInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ModuleWithSdkDepInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.sdkLinkType")
	hasher.WriteString(":.int")
	hasher.WriteUint64(uint64(int(r.SdkLinkType)))
	hasher.WriteString(":.bool")
	if r.Stubs {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *ModuleWithSdkDepInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	r.SdkLinkType = sdkLinkType(val2)

	err = gobtools.DecodeBool(buf, &r.Stubs)
	if err != nil {
		return err
	}

	return err
}

var ModuleWithSdkDepInfoGobRegId int16

func (r ModuleWithSdkDepInfo) GetTypeId() int16 {
	return ModuleWithSdkDepInfoGobRegId
}

func (r ApexDependencyInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.HeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.HeaderJars)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.HeaderJars); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.HeaderJars[val1]); err != nil {
				return err
			}
		}
	}

	if r.ImplementationAndResourcesJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ImplementationAndResourcesJars)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.ImplementationAndResourcesJars); val2++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ImplementationAndResourcesJars[val2]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ApexDependencyInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ApexDependencyInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.HeaderJars))
	for val1 := 0; val1 < len(r.HeaderJars); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.HeaderJars[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.HeaderJars[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.HeaderJars[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ImplementationAndResourcesJars))
	for val5 := 0; val5 < len(r.ImplementationAndResourcesJars); val5++ {
		hasher.WriteString("android/soong/android:android.Path")
		val6 := r.ImplementationAndResourcesJars[val5] == nil
		if val6 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ImplementationAndResourcesJars[val5]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val7 := r.ImplementationAndResourcesJars[val5] == nil
					if val7 {
						hasher.WriteByte(0)
					} else {
						val8 := func(hasher *proptools.Hasher) error {
							return r.ImplementationAndResourcesJars[val5].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val8); err != nil {
							return err
						}
					}
				}
			} else {
				r.ImplementationAndResourcesJars[val5].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *ApexDependencyInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.HeaderJars = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.HeaderJars[val4] = nil
			} else {
				r.HeaderJars[val4] = val6.(android.Path)
			}
		}
	}

	var val9 int
	err = gobtools.DecodeInt(buf, &val9)
	if err != nil {
		return err
	}
	if val9 != -1 {
		r.ImplementationAndResourcesJars = make([]android.Path, val9)
		for val10 := 0; val10 < int(val9); val10++ {
			if val12, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val12 == nil {
				r.ImplementationAndResourcesJars[val10] = nil
			} else {
				r.ImplementationAndResourcesJars[val10] = val12.(android.Path)
			}
		}
	}

	return err
}

var ApexDependencyInfoGobRegId int16

func (r ApexDependencyInfo) GetTypeId() int16 {
	return ApexDependencyInfoGobRegId
}

func (r JavaInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.HeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.HeaderJars)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.HeaderJars); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.HeaderJars[val1]); err != nil {
				return err
			}
		}
	}

	if r.RepackagedHeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.RepackagedHeaderJars)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.RepackagedHeaderJars); val2++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.RepackagedHeaderJars[val2]); err != nil {
				return err
			}
		}
	}

	if r.LocalHeaderJarsPreJarjar == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.LocalHeaderJarsPreJarjar)); err != nil {
			return err
		}
		for val3 := 0; val3 < len(r.LocalHeaderJarsPreJarjar); val3++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.LocalHeaderJarsPreJarjar[val3]); err != nil {
				return err
			}
		}
	}

	if err = r.TransitiveLibsHeaderJarsForR8.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsHeaderJarsForR8.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsHeaderJars.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsImplementationJars.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsResourceJars.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if r.ImplementationAndResourcesJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ImplementationAndResourcesJars)); err != nil {
			return err
		}
		for val4 := 0; val4 < len(r.ImplementationAndResourcesJars); val4++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ImplementationAndResourcesJars[val4]); err != nil {
				return err
			}
		}
	}

	if r.ImplementationJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ImplementationJars)); err != nil {
			return err
		}
		for val5 := 0; val5 < len(r.ImplementationJars); val5++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ImplementationJars[val5]); err != nil {
				return err
			}
		}
	}

	if r.ResourceJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ResourceJars)); err != nil {
			return err
		}
		for val6 := 0; val6 < len(r.ResourceJars); val6++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ResourceJars[val6]); err != nil {
				return err
			}
		}
	}

	if r.LocalHeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.LocalHeaderJars)); err != nil {
			return err
		}
		for val7 := 0; val7 < len(r.LocalHeaderJars); val7++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.LocalHeaderJars[val7]); err != nil {
				return err
			}
		}
	}

	if r.KotlinHeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.KotlinHeaderJars)); err != nil {
			return err
		}
		for val8 := 0; val8 < len(r.KotlinHeaderJars); val8++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.KotlinHeaderJars[val8]); err != nil {
				return err
			}
		}
	}

	if r.AidlIncludeDirs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.AidlIncludeDirs)); err != nil {
			return err
		}
		for val9 := 0; val9 < len(r.AidlIncludeDirs); val9++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.AidlIncludeDirs[val9]); err != nil {
				return err
			}
		}
	}

	if r.SrcJarArgs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.SrcJarArgs)); err != nil {
			return err
		}
		for val10 := 0; val10 < len(r.SrcJarArgs); val10++ {
			if err = gobtools.EncodeString(buf, r.SrcJarArgs[val10]); err != nil {
				return err
			}
		}
	}

	if r.SrcJarDeps == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.SrcJarDeps)); err != nil {
			return err
		}
		for val11 := 0; val11 < len(r.SrcJarDeps); val11++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.SrcJarDeps[val11]); err != nil {
				return err
			}
		}
	}

	if r.KSnapshotFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.KSnapshotFiles)); err != nil {
			return err
		}
		for val12, val13 := range r.KSnapshotFiles {
			if err = gobtools.EncodeString(buf, val12); err != nil {
				return err
			}
			if err = gobtools.EncodeInterface(ctx, buf, val13); err != nil {
				return err
			}
		}
	}

	if err = r.TransitiveSrcFiles.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if r.ExportedPlugins == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ExportedPlugins)); err != nil {
			return err
		}
		for val14 := 0; val14 < len(r.ExportedPlugins); val14++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ExportedPlugins[val14]); err != nil {
				return err
			}
		}
	}

	if r.ExportedPluginClasses == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ExportedPluginClasses)); err != nil {
			return err
		}
		for val15 := 0; val15 < len(r.ExportedPluginClasses); val15++ {
			if err = gobtools.EncodeString(buf, r.ExportedPluginClasses[val15]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeBool(buf, r.ExportedPluginDisableTurbine); err != nil {
		return err
	}

	if err = r.JacocoInfo.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeInt(buf, int(r.StubsLinkType)); err != nil {
		return err
	}

	if r.AconfigIntermediateCacheOutputPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.AconfigIntermediateCacheOutputPaths)); err != nil {
			return err
		}
		for val16 := 0; val16 < len(r.AconfigIntermediateCacheOutputPaths); val16++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.AconfigIntermediateCacheOutputPaths[val16]); err != nil {
				return err
			}
		}
	}

	if err = r.SdkVersion.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputFile); err != nil {
		return err
	}

	if r.ExtraOutputFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ExtraOutputFiles)); err != nil {
			return err
		}
		for val17 := 0; val17 < len(r.ExtraOutputFiles); val17++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ExtraOutputFiles[val17]); err != nil {
				return err
			}
		}
	}

	val18 := r.AndroidLibraryDependencyInfo == nil
	if err = gobtools.EncodeBool(buf, val18); err != nil {
		return err
	}
	if !val18 {
		if err = (*r.AndroidLibraryDependencyInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	val19 := r.UsesLibraryDependencyInfo == nil
	if err = gobtools.EncodeBool(buf, val19); err != nil {
		return err
	}
	if !val19 {
		if err = (*r.UsesLibraryDependencyInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	val20 := r.ProvidesUsesLibInfo == nil
	if err = gobtools.EncodeBool(buf, val20); err != nil {
		return err
	}
	if !val20 {
		if err = (*r.ProvidesUsesLibInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	if r.MissingOptionalUsesLibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.MissingOptionalUsesLibs)); err != nil {
			return err
		}
		for val21 := 0; val21 < len(r.MissingOptionalUsesLibs); val21++ {
			if err = gobtools.EncodeString(buf, r.MissingOptionalUsesLibs[val21]); err != nil {
				return err
			}
		}
	}

	val22 := r.ModuleWithSdkDepInfo == nil
	if err = gobtools.EncodeBool(buf, val22); err != nil {
		return err
	}
	if !val22 {
		if err = (*r.ModuleWithSdkDepInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	if err = r.DexJarFile.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.InstallFile); err != nil {
		return err
	}

	if err = r.BootDexJarPath.Encode(ctx, buf); err != nil {
		return err
	}

	if r.HiddenapiClassesJarPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.HiddenapiClassesJarPaths)); err != nil {
			return err
		}
		for val23 := 0; val23 < len(r.HiddenapiClassesJarPaths); val23++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.HiddenapiClassesJarPaths[val23]); err != nil {
				return err
			}
		}
	}

	val24 := r.UncompressDexState == nil
	if err = gobtools.EncodeBool(buf, val24); err != nil {
		return err
	}
	if !val24 {
		if err = gobtools.EncodeBool(buf, (*r.UncompressDexState)); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeBool(buf, r.Active); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.BuiltInstalled); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ConfigPath); err != nil {
		return err
	}

	if r.LogtagsSrcs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.LogtagsSrcs)); err != nil {
			return err
		}
		for val25 := 0; val25 < len(r.LogtagsSrcs); val25++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.LogtagsSrcs[val25]); err != nil {
				return err
			}
		}
	}

	if err = r.ProguardDictionary.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.ProguardUsageZip.Encode(ctx, buf); err != nil {
		return err
	}

	if r.LinterReports == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.LinterReports)); err != nil {
			return err
		}
		for val26 := 0; val26 < len(r.LinterReports); val26++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.LinterReports[val26]); err != nil {
				return err
			}
		}
	}

	if err = r.HostdexInstallFile.Encode(ctx, buf); err != nil {
		return err
	}

	if r.GeneratedSrcjars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.GeneratedSrcjars)); err != nil {
			return err
		}
		for val27 := 0; val27 < len(r.GeneratedSrcjars); val27++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.GeneratedSrcjars[val27]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeBool(buf, r.ProfileGuided); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.Stem); err != nil {
		return err
	}

	if err = r.DexJarBuildPath.Encode(ctx, buf); err != nil {
		return err
	}

	val28 := r.DexpreopterInfo == nil
	if err = gobtools.EncodeBool(buf, val28); err != nil {
		return err
	}
	if !val28 {
		if err = (*r.DexpreopterInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	if r.XrefJavaFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.XrefJavaFiles)); err != nil {
			return err
		}
		for val29 := 0; val29 < len(r.XrefJavaFiles); val29++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.XrefJavaFiles[val29]); err != nil {
				return err
			}
		}
	}

	if r.XrefKotlinFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.XrefKotlinFiles)); err != nil {
			return err
		}
		for val30 := 0; val30 < len(r.XrefKotlinFiles); val30++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.XrefKotlinFiles[val30]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeBool(buf, r.HasOverrideMinSdkVersion); err != nil {
		return err
	}

	val31 := r.CompileDex == nil
	if err = gobtools.EncodeBool(buf, val31); err != nil {
		return err
	}
	if !val31 {
		if err = gobtools.EncodeBool(buf, (*r.CompileDex)); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeString(buf, r.SystemModules); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Installable); err != nil {
		return err
	}

	val32 := r.ApexDependencyInfo == nil
	if err = gobtools.EncodeBool(buf, val32); err != nil {
		return err
	}
	if !val32 {
		if err = (*r.ApexDependencyInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}

	if err = r.MaxSdkVersion.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r JavaInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaInfo")
	hasher.WriteInt(58)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.HeaderJars))
	for val1 := 0; val1 < len(r.HeaderJars); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.HeaderJars[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.HeaderJars[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.HeaderJars[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.RepackagedHeaderJars))
	for val5 := 0; val5 < len(r.RepackagedHeaderJars); val5++ {
		hasher.WriteString("android/soong/android:android.Path")
		val6 := r.RepackagedHeaderJars[val5] == nil
		if val6 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.RepackagedHeaderJars[val5]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val7 := r.RepackagedHeaderJars[val5] == nil
					if val7 {
						hasher.WriteByte(0)
					} else {
						val8 := func(hasher *proptools.Hasher) error {
							return r.RepackagedHeaderJars[val5].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val8); err != nil {
							return err
						}
					}
				}
			} else {
				r.RepackagedHeaderJars[val5].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.LocalHeaderJarsPreJarjar))
	for val9 := 0; val9 < len(r.LocalHeaderJarsPreJarjar); val9++ {
		hasher.WriteString("android/soong/android:android.Path")
		val10 := r.LocalHeaderJarsPreJarjar[val9] == nil
		if val10 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.LocalHeaderJarsPreJarjar[val9]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val11 := r.LocalHeaderJarsPreJarjar[val9] == nil
					if val11 {
						hasher.WriteByte(0)
					} else {
						val12 := func(hasher *proptools.Hasher) error {
							return r.LocalHeaderJarsPreJarjar[val9].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val12); err != nil {
							return err
						}
					}
				}
			} else {
				r.LocalHeaderJarsPreJarjar[val9].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	val17 := func(hasher *proptools.Hasher, val13 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val14 := val13 == nil
		if val14 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val13); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val15 := val13 == nil
					if val15 {
						hasher.WriteByte(0)
					} else {
						val16 := func(hasher *proptools.Hasher) error { return val13.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val16); err != nil {
							return err
						}
					}
				}
			} else {
				val13.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveLibsHeaderJarsForR8.Hash(hasher, "android.Path", val17); err != nil {
		return err
	}
	val22 := func(hasher *proptools.Hasher, val18 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val19 := val18 == nil
		if val19 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val18); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val20 := val18 == nil
					if val20 {
						hasher.WriteByte(0)
					} else {
						val21 := func(hasher *proptools.Hasher) error { return val18.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val21); err != nil {
							return err
						}
					}
				}
			} else {
				val18.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveStaticLibsHeaderJarsForR8.Hash(hasher, "android.Path", val22); err != nil {
		return err
	}
	val27 := func(hasher *proptools.Hasher, val23 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val24 := val23 == nil
		if val24 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val23); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val25 := val23 == nil
					if val25 {
						hasher.WriteByte(0)
					} else {
						val26 := func(hasher *proptools.Hasher) error { return val23.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val26); err != nil {
							return err
						}
					}
				}
			} else {
				val23.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveStaticLibsHeaderJars.Hash(hasher, "android.Path", val27); err != nil {
		return err
	}
	val32 := func(hasher *proptools.Hasher, val28 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val29 := val28 == nil
		if val29 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val28); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val30 := val28 == nil
					if val30 {
						hasher.WriteByte(0)
					} else {
						val31 := func(hasher *proptools.Hasher) error { return val28.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val31); err != nil {
							return err
						}
					}
				}
			} else {
				val28.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveStaticLibsImplementationJars.Hash(hasher, "android.Path", val32); err != nil {
		return err
	}
	val37 := func(hasher *proptools.Hasher, val33 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val34 := val33 == nil
		if val34 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val33); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val35 := val33 == nil
					if val35 {
						hasher.WriteByte(0)
					} else {
						val36 := func(hasher *proptools.Hasher) error { return val33.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val36); err != nil {
							return err
						}
					}
				}
			} else {
				val33.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveStaticLibsResourceJars.Hash(hasher, "android.Path", val37); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ImplementationAndResourcesJars))
	for val38 := 0; val38 < len(r.ImplementationAndResourcesJars); val38++ {
		hasher.WriteString("android/soong/android:android.Path")
		val39 := r.ImplementationAndResourcesJars[val38] == nil
		if val39 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ImplementationAndResourcesJars[val38]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val40 := r.ImplementationAndResourcesJars[val38] == nil
					if val40 {
						hasher.WriteByte(0)
					} else {
						val41 := func(hasher *proptools.Hasher) error {
							return r.ImplementationAndResourcesJars[val38].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val41); err != nil {
							return err
						}
					}
				}
			} else {
				r.ImplementationAndResourcesJars[val38].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ImplementationJars))
	for val42 := 0; val42 < len(r.ImplementationJars); val42++ {
		hasher.WriteString("android/soong/android:android.Path")
		val43 := r.ImplementationJars[val42] == nil
		if val43 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ImplementationJars[val42]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val44 := r.ImplementationJars[val42] == nil
					if val44 {
						hasher.WriteByte(0)
					} else {
						val45 := func(hasher *proptools.Hasher) error {
							return r.ImplementationJars[val42].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val45); err != nil {
							return err
						}
					}
				}
			} else {
				r.ImplementationJars[val42].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ResourceJars))
	for val46 := 0; val46 < len(r.ResourceJars); val46++ {
		hasher.WriteString("android/soong/android:android.Path")
		val47 := r.ResourceJars[val46] == nil
		if val47 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ResourceJars[val46]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val48 := r.ResourceJars[val46] == nil
					if val48 {
						hasher.WriteByte(0)
					} else {
						val49 := func(hasher *proptools.Hasher) error {
							return r.ResourceJars[val46].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val49); err != nil {
							return err
						}
					}
				}
			} else {
				r.ResourceJars[val46].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.LocalHeaderJars))
	for val50 := 0; val50 < len(r.LocalHeaderJars); val50++ {
		hasher.WriteString("android/soong/android:android.Path")
		val51 := r.LocalHeaderJars[val50] == nil
		if val51 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.LocalHeaderJars[val50]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val52 := r.LocalHeaderJars[val50] == nil
					if val52 {
						hasher.WriteByte(0)
					} else {
						val53 := func(hasher *proptools.Hasher) error {
							return r.LocalHeaderJars[val50].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val53); err != nil {
							return err
						}
					}
				}
			} else {
				r.LocalHeaderJars[val50].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.KotlinHeaderJars))
	for val54 := 0; val54 < len(r.KotlinHeaderJars); val54++ {
		hasher.WriteString("android/soong/android:android.Path")
		val55 := r.KotlinHeaderJars[val54] == nil
		if val55 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.KotlinHeaderJars[val54]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val56 := r.KotlinHeaderJars[val54] == nil
					if val56 {
						hasher.WriteByte(0)
					} else {
						val57 := func(hasher *proptools.Hasher) error {
							return r.KotlinHeaderJars[val54].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val57); err != nil {
							return err
						}
					}
				}
			} else {
				r.KotlinHeaderJars[val54].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.AidlIncludeDirs))
	for val58 := 0; val58 < len(r.AidlIncludeDirs); val58++ {
		hasher.WriteString("android/soong/android:android.Path")
		val59 := r.AidlIncludeDirs[val58] == nil
		if val59 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.AidlIncludeDirs[val58]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val60 := r.AidlIncludeDirs[val58] == nil
					if val60 {
						hasher.WriteByte(0)
					} else {
						val61 := func(hasher *proptools.Hasher) error {
							return r.AidlIncludeDirs[val58].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val61); err != nil {
							return err
						}
					}
				}
			} else {
				r.AidlIncludeDirs[val58].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.SrcJarArgs))
	for val62 := 0; val62 < len(r.SrcJarArgs); val62++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.SrcJarArgs[val62])
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.SrcJarDeps))
	for val63 := 0; val63 < len(r.SrcJarDeps); val63++ {
		hasher.WriteString("android/soong/android:android.Path")
		val64 := r.SrcJarDeps[val63] == nil
		if val64 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.SrcJarDeps[val63]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val65 := r.SrcJarDeps[val63] == nil
					if val65 {
						hasher.WriteByte(0)
					} else {
						val66 := func(hasher *proptools.Hasher) error {
							return r.SrcJarDeps[val63].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val66); err != nil {
							return err
						}
					}
				}
			} else {
				r.SrcJarDeps[val63].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.map[string]android.Path")
	hasher.WriteInt(len(r.KSnapshotFiles))
	val67 := make([]string, 0, len(r.KSnapshotFiles))
	for val69 := range r.KSnapshotFiles {
		val67 = append(val67, val69)
	}
	proptools.SortOrdered(val67)
	for _, val68 := range val67 {
		hasher.WriteString(":.string")
		hasher.WriteString(val68)
		hasher.WriteString(":java.android.Path")
		val70 := r.KSnapshotFiles[val68] == nil
		if val70 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.KSnapshotFiles[val68]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val71 := r.KSnapshotFiles[val68] == nil
					if val71 {
						hasher.WriteByte(0)
					} else {
						val72 := func(hasher *proptools.Hasher) error {
							return r.KSnapshotFiles[val68].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val72); err != nil {
							return err
						}
					}
				}
			} else {
				r.KSnapshotFiles[val68].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	val77 := func(hasher *proptools.Hasher, val73 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val74 := val73 == nil
		if val74 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val73); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val75 := val73 == nil
					if val75 {
						hasher.WriteByte(0)
					} else {
						val76 := func(hasher *proptools.Hasher) error { return val73.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val76); err != nil {
							return err
						}
					}
				}
			} else {
				val73.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveSrcFiles.Hash(hasher, "android.Path", val77); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ExportedPlugins))
	for val78 := 0; val78 < len(r.ExportedPlugins); val78++ {
		hasher.WriteString("android/soong/android:android.Path")
		val79 := r.ExportedPlugins[val78] == nil
		if val79 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ExportedPlugins[val78]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val80 := r.ExportedPlugins[val78] == nil
					if val80 {
						hasher.WriteByte(0)
					} else {
						val81 := func(hasher *proptools.Hasher) error {
							return r.ExportedPlugins[val78].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val81); err != nil {
							return err
						}
					}
				}
			} else {
				r.ExportedPlugins[val78].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.ExportedPluginClasses))
	for val82 := 0; val82 < len(r.ExportedPluginClasses); val82++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.ExportedPluginClasses[val82])
	}
	hasher.WriteString(":.bool")
	if r.ExportedPluginDisableTurbine {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	if err := r.JacocoInfo.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.StubsLinkType")
	hasher.WriteString(":.int")
	hasher.WriteUint64(uint64(int(r.StubsLinkType)))
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.AconfigIntermediateCacheOutputPaths))
	for val83 := 0; val83 < len(r.AconfigIntermediateCacheOutputPaths); val83++ {
		hasher.WriteString("android/soong/android:android.Path")
		val84 := r.AconfigIntermediateCacheOutputPaths[val83] == nil
		if val84 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.AconfigIntermediateCacheOutputPaths[val83]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val85 := r.AconfigIntermediateCacheOutputPaths[val83] == nil
					if val85 {
						hasher.WriteByte(0)
					} else {
						val86 := func(hasher *proptools.Hasher) error {
							return r.AconfigIntermediateCacheOutputPaths[val83].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val86); err != nil {
							return err
						}
					}
				}
			} else {
				r.AconfigIntermediateCacheOutputPaths[val83].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	if err := r.SdkVersion.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Path")
	val87 := r.OutputFile == nil
	if val87 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val88 := r.OutputFile == nil
				if val88 {
					hasher.WriteByte(0)
				} else {
					val89 := func(hasher *proptools.Hasher) error { return r.OutputFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val89); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ExtraOutputFiles))
	for val90 := 0; val90 < len(r.ExtraOutputFiles); val90++ {
		hasher.WriteString("android/soong/android:android.Path")
		val91 := r.ExtraOutputFiles[val90] == nil
		if val91 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ExtraOutputFiles[val90]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val92 := r.ExtraOutputFiles[val90] == nil
					if val92 {
						hasher.WriteByte(0)
					} else {
						val93 := func(hasher *proptools.Hasher) error {
							return r.ExtraOutputFiles[val90].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val93); err != nil {
							return err
						}
					}
				}
			} else {
				r.ExtraOutputFiles[val90].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.*AndroidLibraryDependencyInfo")
	val94 := r.AndroidLibraryDependencyInfo == nil
	if val94 {
		hasher.WriteByte(0)
	} else {
		val95 := func(hasher *proptools.Hasher) error {
			if err := (*r.AndroidLibraryDependencyInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.AndroidLibraryDependencyInfo)), val95); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*UsesLibraryDependencyInfo")
	val96 := r.UsesLibraryDependencyInfo == nil
	if val96 {
		hasher.WriteByte(0)
	} else {
		val97 := func(hasher *proptools.Hasher) error {
			if err := (*r.UsesLibraryDependencyInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.UsesLibraryDependencyInfo)), val97); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*ProvidesUsesLibInfo")
	val98 := r.ProvidesUsesLibInfo == nil
	if val98 {
		hasher.WriteByte(0)
	} else {
		val99 := func(hasher *proptools.Hasher) error {
			if err := (*r.ProvidesUsesLibInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ProvidesUsesLibInfo)), val99); err != nil {
			return err
		}
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.MissingOptionalUsesLibs))
	for val100 := 0; val100 < len(r.MissingOptionalUsesLibs); val100++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.MissingOptionalUsesLibs[val100])
	}
	hasher.WriteString(":.*ModuleWithSdkDepInfo")
	val101 := r.ModuleWithSdkDepInfo == nil
	if val101 {
		hasher.WriteByte(0)
	} else {
		val102 := func(hasher *proptools.Hasher) error {
			if err := (*r.ModuleWithSdkDepInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ModuleWithSdkDepInfo)), val102); err != nil {
			return err
		}
	}
	if err := r.DexJarFile.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Path")
	val103 := r.InstallFile == nil
	if val103 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.InstallFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val104 := r.InstallFile == nil
				if val104 {
					hasher.WriteByte(0)
				} else {
					val105 := func(hasher *proptools.Hasher) error { return r.InstallFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val105); err != nil {
						return err
					}
				}
			}
		} else {
			r.InstallFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.BootDexJarPath.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.HiddenapiClassesJarPaths))
	for val106 := 0; val106 < len(r.HiddenapiClassesJarPaths); val106++ {
		hasher.WriteString("android/soong/android:android.Path")
		val107 := r.HiddenapiClassesJarPaths[val106] == nil
		if val107 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.HiddenapiClassesJarPaths[val106]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val108 := r.HiddenapiClassesJarPaths[val106] == nil
					if val108 {
						hasher.WriteByte(0)
					} else {
						val109 := func(hasher *proptools.Hasher) error {
							return r.HiddenapiClassesJarPaths[val106].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val109); err != nil {
							return err
						}
					}
				}
			} else {
				r.HiddenapiClassesJarPaths[val106].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.*bool")
	val110 := r.UncompressDexState == nil
	if val110 {
		hasher.WriteByte(0)
	} else {
		val111 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.bool")
			if *r.UncompressDexState {
				hasher.WriteByte(1)
			} else {
				hasher.WriteByte(0)
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.UncompressDexState)), val111); err != nil {
			return err
		}
	}
	hasher.WriteString(":.bool")
	if r.Active {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.BuiltInstalled)
	hasher.WriteString(":java.android.WritablePath")
	val112 := r.ConfigPath == nil
	if val112 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ConfigPath); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val113 := r.ConfigPath == nil
				if val113 {
					hasher.WriteByte(0)
				} else {
					val114 := func(hasher *proptools.Hasher) error { return r.ConfigPath.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val114); err != nil {
						return err
					}
				}
			}
		} else {
			r.ConfigPath.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.LogtagsSrcs))
	for val115 := 0; val115 < len(r.LogtagsSrcs); val115++ {
		hasher.WriteString("android/soong/android:android.Path")
		val116 := r.LogtagsSrcs[val115] == nil
		if val116 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.LogtagsSrcs[val115]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val117 := r.LogtagsSrcs[val115] == nil
					if val117 {
						hasher.WriteByte(0)
					} else {
						val118 := func(hasher *proptools.Hasher) error {
							return r.LogtagsSrcs[val115].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val118); err != nil {
							return err
						}
					}
				}
			} else {
				r.LogtagsSrcs[val115].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	if err := r.ProguardDictionary.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.ProguardUsageZip.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.LinterReports))
	for val119 := 0; val119 < len(r.LinterReports); val119++ {
		hasher.WriteString("android/soong/android:android.Path")
		val120 := r.LinterReports[val119] == nil
		if val120 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.LinterReports[val119]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val121 := r.LinterReports[val119] == nil
					if val121 {
						hasher.WriteByte(0)
					} else {
						val122 := func(hasher *proptools.Hasher) error {
							return r.LinterReports[val119].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val122); err != nil {
							return err
						}
					}
				}
			} else {
				r.LinterReports[val119].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	if err := r.HostdexInstallFile.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.[]android.Path")
	hasher.WriteInt(len(r.GeneratedSrcjars))
	for val123 := 0; val123 < len(r.GeneratedSrcjars); val123++ {
		hasher.WriteString(":java.android.Path")
		val124 := r.GeneratedSrcjars[val123] == nil
		if val124 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.GeneratedSrcjars[val123]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val125 := r.GeneratedSrcjars[val123] == nil
					if val125 {
						hasher.WriteByte(0)
					} else {
						val126 := func(hasher *proptools.Hasher) error {
							return r.GeneratedSrcjars[val123].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val126); err != nil {
							return err
						}
					}
				}
			} else {
				r.GeneratedSrcjars[val123].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.bool")
	if r.ProfileGuided {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.Stem)
	if err := r.DexJarBuildPath.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.*DexpreopterInfo")
	val127 := r.DexpreopterInfo == nil
	if val127 {
		hasher.WriteByte(0)
	} else {
		val128 := func(hasher *proptools.Hasher) error {
			if err := (*r.DexpreopterInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.DexpreopterInfo)), val128); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.XrefJavaFiles))
	for val129 := 0; val129 < len(r.XrefJavaFiles); val129++ {
		hasher.WriteString("android/soong/android:android.Path")
		val130 := r.XrefJavaFiles[val129] == nil
		if val130 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.XrefJavaFiles[val129]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val131 := r.XrefJavaFiles[val129] == nil
					if val131 {
						hasher.WriteByte(0)
					} else {
						val132 := func(hasher *proptools.Hasher) error {
							return r.XrefJavaFiles[val129].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val132); err != nil {
							return err
						}
					}
				}
			} else {
				r.XrefJavaFiles[val129].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.XrefKotlinFiles))
	for val133 := 0; val133 < len(r.XrefKotlinFiles); val133++ {
		hasher.WriteString("android/soong/android:android.Path")
		val134 := r.XrefKotlinFiles[val133] == nil
		if val134 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.XrefKotlinFiles[val133]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val135 := r.XrefKotlinFiles[val133] == nil
					if val135 {
						hasher.WriteByte(0)
					} else {
						val136 := func(hasher *proptools.Hasher) error {
							return r.XrefKotlinFiles[val133].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val136); err != nil {
							return err
						}
					}
				}
			} else {
				r.XrefKotlinFiles[val133].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.bool")
	if r.HasOverrideMinSdkVersion {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.*bool")
	val137 := r.CompileDex == nil
	if val137 {
		hasher.WriteByte(0)
	} else {
		val138 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.bool")
			if *r.CompileDex {
				hasher.WriteByte(1)
			} else {
				hasher.WriteByte(0)
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.CompileDex)), val138); err != nil {
			return err
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.SystemModules)
	hasher.WriteString(":.bool")
	if r.Installable {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.*ApexDependencyInfo")
	val139 := r.ApexDependencyInfo == nil
	if val139 {
		hasher.WriteByte(0)
	} else {
		val140 := func(hasher *proptools.Hasher) error {
			if err := (*r.ApexDependencyInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ApexDependencyInfo)), val140); err != nil {
			return err
		}
	}
	if err := r.MaxSdkVersion.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *JavaInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.HeaderJars = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.HeaderJars[val4] = nil
			} else {
				r.HeaderJars[val4] = val6.(android.Path)
			}
		}
	}

	var val9 int
	err = gobtools.DecodeInt(buf, &val9)
	if err != nil {
		return err
	}
	if val9 != -1 {
		r.RepackagedHeaderJars = make([]android.Path, val9)
		for val10 := 0; val10 < int(val9); val10++ {
			if val12, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val12 == nil {
				r.RepackagedHeaderJars[val10] = nil
			} else {
				r.RepackagedHeaderJars[val10] = val12.(android.Path)
			}
		}
	}

	var val15 int
	err = gobtools.DecodeInt(buf, &val15)
	if err != nil {
		return err
	}
	if val15 != -1 {
		r.LocalHeaderJarsPreJarjar = make([]android.Path, val15)
		for val16 := 0; val16 < int(val15); val16++ {
			if val18, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val18 == nil {
				r.LocalHeaderJarsPreJarjar[val16] = nil
			} else {
				r.LocalHeaderJarsPreJarjar[val16] = val18.(android.Path)
			}
		}
	}

	if err = r.TransitiveLibsHeaderJarsForR8.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsHeaderJarsForR8.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsHeaderJars.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsImplementationJars.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveStaticLibsResourceJars.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	var val26 int
	err = gobtools.DecodeInt(buf, &val26)
	if err != nil {
		return err
	}
	if val26 != -1 {
		r.ImplementationAndResourcesJars = make([]android.Path, val26)
		for val27 := 0; val27 < int(val26); val27++ {
			if val29, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val29 == nil {
				r.ImplementationAndResourcesJars[val27] = nil
			} else {
				r.ImplementationAndResourcesJars[val27] = val29.(android.Path)
			}
		}
	}

	var val32 int
	err = gobtools.DecodeInt(buf, &val32)
	if err != nil {
		return err
	}
	if val32 != -1 {
		r.ImplementationJars = make([]android.Path, val32)
		for val33 := 0; val33 < int(val32); val33++ {
			if val35, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val35 == nil {
				r.ImplementationJars[val33] = nil
			} else {
				r.ImplementationJars[val33] = val35.(android.Path)
			}
		}
	}

	var val38 int
	err = gobtools.DecodeInt(buf, &val38)
	if err != nil {
		return err
	}
	if val38 != -1 {
		r.ResourceJars = make([]android.Path, val38)
		for val39 := 0; val39 < int(val38); val39++ {
			if val41, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val41 == nil {
				r.ResourceJars[val39] = nil
			} else {
				r.ResourceJars[val39] = val41.(android.Path)
			}
		}
	}

	var val44 int
	err = gobtools.DecodeInt(buf, &val44)
	if err != nil {
		return err
	}
	if val44 != -1 {
		r.LocalHeaderJars = make([]android.Path, val44)
		for val45 := 0; val45 < int(val44); val45++ {
			if val47, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val47 == nil {
				r.LocalHeaderJars[val45] = nil
			} else {
				r.LocalHeaderJars[val45] = val47.(android.Path)
			}
		}
	}

	var val50 int
	err = gobtools.DecodeInt(buf, &val50)
	if err != nil {
		return err
	}
	if val50 != -1 {
		r.KotlinHeaderJars = make([]android.Path, val50)
		for val51 := 0; val51 < int(val50); val51++ {
			if val53, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val53 == nil {
				r.KotlinHeaderJars[val51] = nil
			} else {
				r.KotlinHeaderJars[val51] = val53.(android.Path)
			}
		}
	}

	var val56 int
	err = gobtools.DecodeInt(buf, &val56)
	if err != nil {
		return err
	}
	if val56 != -1 {
		r.AidlIncludeDirs = make([]android.Path, val56)
		for val57 := 0; val57 < int(val56); val57++ {
			if val59, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val59 == nil {
				r.AidlIncludeDirs[val57] = nil
			} else {
				r.AidlIncludeDirs[val57] = val59.(android.Path)
			}
		}
	}

	var val61 int
	err = gobtools.DecodeInt(buf, &val61)
	if err != nil {
		return err
	}
	if val61 != -1 {
		r.SrcJarArgs = make([]string, val61)
		for val62 := 0; val62 < int(val61); val62++ {
			err = gobtools.DecodeString(buf, &r.SrcJarArgs[val62])
			if err != nil {
				return err
			}
		}
	}

	var val66 int
	err = gobtools.DecodeInt(buf, &val66)
	if err != nil {
		return err
	}
	if val66 != -1 {
		r.SrcJarDeps = make([]android.Path, val66)
		for val67 := 0; val67 < int(val66); val67++ {
			if val69, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val69 == nil {
				r.SrcJarDeps[val67] = nil
			} else {
				r.SrcJarDeps[val67] = val69.(android.Path)
			}
		}
	}

	var val70 int
	err = gobtools.DecodeInt(buf, &val70)
	if err != nil {
		return err
	}
	if val70 != -1 {
		r.KSnapshotFiles = make(map[string]android.Path, val70)
		for val71 := 0; val71 < int(val70); val71++ {
			var val72 string
			var val73 android.Path
			err = gobtools.DecodeString(buf, &val72)
			if err != nil {
				return err
			}
			if val76, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val76 == nil {
				val73 = nil
			} else {
				val73 = val76.(android.Path)
			}
			r.KSnapshotFiles[val72] = val73
		}
	}

	if err = r.TransitiveSrcFiles.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	var val80 int
	err = gobtools.DecodeInt(buf, &val80)
	if err != nil {
		return err
	}
	if val80 != -1 {
		r.ExportedPlugins = make([]android.Path, val80)
		for val81 := 0; val81 < int(val80); val81++ {
			if val83, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val83 == nil {
				r.ExportedPlugins[val81] = nil
			} else {
				r.ExportedPlugins[val81] = val83.(android.Path)
			}
		}
	}

	var val85 int
	err = gobtools.DecodeInt(buf, &val85)
	if err != nil {
		return err
	}
	if val85 != -1 {
		r.ExportedPluginClasses = make([]string, val85)
		for val86 := 0; val86 < int(val85); val86++ {
			err = gobtools.DecodeString(buf, &r.ExportedPluginClasses[val86])
			if err != nil {
				return err
			}
		}
	}

	err = gobtools.DecodeBool(buf, &r.ExportedPluginDisableTurbine)
	if err != nil {
		return err
	}

	if err = r.JacocoInfo.Decode(ctx, buf); err != nil {
		return err
	}

	var val91 int
	err = gobtools.DecodeInt(buf, &val91)
	if err != nil {
		return err
	}
	r.StubsLinkType = StubsLinkType(val91)

	var val95 int
	err = gobtools.DecodeInt(buf, &val95)
	if err != nil {
		return err
	}
	if val95 != -1 {
		r.AconfigIntermediateCacheOutputPaths = make([]android.Path, val95)
		for val96 := 0; val96 < int(val95); val96++ {
			if val98, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val98 == nil {
				r.AconfigIntermediateCacheOutputPaths[val96] = nil
			} else {
				r.AconfigIntermediateCacheOutputPaths[val96] = val98.(android.Path)
			}
		}
	}

	if err = r.SdkVersion.Decode(ctx, buf); err != nil {
		return err
	}

	if val101, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val101 == nil {
		r.OutputFile = nil
	} else {
		r.OutputFile = val101.(android.Path)
	}

	var val104 int
	err = gobtools.DecodeInt(buf, &val104)
	if err != nil {
		return err
	}
	if val104 != -1 {
		r.ExtraOutputFiles = make([]android.Path, val104)
		for val105 := 0; val105 < int(val104); val105++ {
			if val107, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val107 == nil {
				r.ExtraOutputFiles[val105] = nil
			} else {
				r.ExtraOutputFiles[val105] = val107.(android.Path)
			}
		}
	}

	var val109 bool
	if err = gobtools.DecodeBool(buf, &val109); err != nil {
		return err
	}
	if !val109 {
		var val108 AndroidLibraryDependencyInfo
		if err = val108.Decode(ctx, buf); err != nil {
			return err
		}
		r.AndroidLibraryDependencyInfo = &val108
	}

	var val112 bool
	if err = gobtools.DecodeBool(buf, &val112); err != nil {
		return err
	}
	if !val112 {
		var val111 UsesLibraryDependencyInfo
		if err = val111.Decode(ctx, buf); err != nil {
			return err
		}
		r.UsesLibraryDependencyInfo = &val111
	}

	var val115 bool
	if err = gobtools.DecodeBool(buf, &val115); err != nil {
		return err
	}
	if !val115 {
		var val114 ProvidesUsesLibInfo
		if err = val114.Decode(ctx, buf); err != nil {
			return err
		}
		r.ProvidesUsesLibInfo = &val114
	}

	var val118 int
	err = gobtools.DecodeInt(buf, &val118)
	if err != nil {
		return err
	}
	if val118 != -1 {
		r.MissingOptionalUsesLibs = make([]string, val118)
		for val119 := 0; val119 < int(val118); val119++ {
			err = gobtools.DecodeString(buf, &r.MissingOptionalUsesLibs[val119])
			if err != nil {
				return err
			}
		}
	}

	var val122 bool
	if err = gobtools.DecodeBool(buf, &val122); err != nil {
		return err
	}
	if !val122 {
		var val121 ModuleWithSdkDepInfo
		if err = val121.Decode(ctx, buf); err != nil {
			return err
		}
		r.ModuleWithSdkDepInfo = &val121
	}

	if err = r.DexJarFile.Decode(ctx, buf); err != nil {
		return err
	}

	if val126, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val126 == nil {
		r.InstallFile = nil
	} else {
		r.InstallFile = val126.(android.Path)
	}

	if err = r.BootDexJarPath.Decode(ctx, buf); err != nil {
		return err
	}

	var val130 int
	err = gobtools.DecodeInt(buf, &val130)
	if err != nil {
		return err
	}
	if val130 != -1 {
		r.HiddenapiClassesJarPaths = make([]android.Path, val130)
		for val131 := 0; val131 < int(val130); val131++ {
			if val133, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val133 == nil {
				r.HiddenapiClassesJarPaths[val131] = nil
			} else {
				r.HiddenapiClassesJarPaths[val131] = val133.(android.Path)
			}
		}
	}

	var val135 bool
	if err = gobtools.DecodeBool(buf, &val135); err != nil {
		return err
	}
	if !val135 {
		var val134 bool
		err = gobtools.DecodeBool(buf, &val134)
		if err != nil {
			return err
		}
		r.UncompressDexState = &val134
	}

	err = gobtools.DecodeBool(buf, &r.Active)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.BuiltInstalled)
	if err != nil {
		return err
	}

	if val140, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val140 == nil {
		r.ConfigPath = nil
	} else {
		r.ConfigPath = val140.(android.WritablePath)
	}

	var val143 int
	err = gobtools.DecodeInt(buf, &val143)
	if err != nil {
		return err
	}
	if val143 != -1 {
		r.LogtagsSrcs = make([]android.Path, val143)
		for val144 := 0; val144 < int(val143); val144++ {
			if val146, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val146 == nil {
				r.LogtagsSrcs[val144] = nil
			} else {
				r.LogtagsSrcs[val144] = val146.(android.Path)
			}
		}
	}

	if err = r.ProguardDictionary.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.ProguardUsageZip.Decode(ctx, buf); err != nil {
		return err
	}

	var val151 int
	err = gobtools.DecodeInt(buf, &val151)
	if err != nil {
		return err
	}
	if val151 != -1 {
		r.LinterReports = make([]android.Path, val151)
		for val152 := 0; val152 < int(val151); val152++ {
			if val154, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val154 == nil {
				r.LinterReports[val152] = nil
			} else {
				r.LinterReports[val152] = val154.(android.Path)
			}
		}
	}

	if err = r.HostdexInstallFile.Decode(ctx, buf); err != nil {
		return err
	}

	var val157 int
	err = gobtools.DecodeInt(buf, &val157)
	if err != nil {
		return err
	}
	if val157 != -1 {
		r.GeneratedSrcjars = make([]android.Path, val157)
		for val158 := 0; val158 < int(val157); val158++ {
			if val160, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val160 == nil {
				r.GeneratedSrcjars[val158] = nil
			} else {
				r.GeneratedSrcjars[val158] = val160.(android.Path)
			}
		}
	}

	err = gobtools.DecodeBool(buf, &r.ProfileGuided)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.Stem)
	if err != nil {
		return err
	}

	if err = r.DexJarBuildPath.Decode(ctx, buf); err != nil {
		return err
	}

	var val165 bool
	if err = gobtools.DecodeBool(buf, &val165); err != nil {
		return err
	}
	if !val165 {
		var val164 DexpreopterInfo
		if err = val164.Decode(ctx, buf); err != nil {
			return err
		}
		r.DexpreopterInfo = &val164
	}

	var val169 int
	err = gobtools.DecodeInt(buf, &val169)
	if err != nil {
		return err
	}
	if val169 != -1 {
		r.XrefJavaFiles = make([]android.Path, val169)
		for val170 := 0; val170 < int(val169); val170++ {
			if val172, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val172 == nil {
				r.XrefJavaFiles[val170] = nil
			} else {
				r.XrefJavaFiles[val170] = val172.(android.Path)
			}
		}
	}

	var val175 int
	err = gobtools.DecodeInt(buf, &val175)
	if err != nil {
		return err
	}
	if val175 != -1 {
		r.XrefKotlinFiles = make([]android.Path, val175)
		for val176 := 0; val176 < int(val175); val176++ {
			if val178, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val178 == nil {
				r.XrefKotlinFiles[val176] = nil
			} else {
				r.XrefKotlinFiles[val176] = val178.(android.Path)
			}
		}
	}

	err = gobtools.DecodeBool(buf, &r.HasOverrideMinSdkVersion)
	if err != nil {
		return err
	}

	var val181 bool
	if err = gobtools.DecodeBool(buf, &val181); err != nil {
		return err
	}
	if !val181 {
		var val180 bool
		err = gobtools.DecodeBool(buf, &val180)
		if err != nil {
			return err
		}
		r.CompileDex = &val180
	}

	err = gobtools.DecodeString(buf, &r.SystemModules)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Installable)
	if err != nil {
		return err
	}

	var val186 bool
	if err = gobtools.DecodeBool(buf, &val186); err != nil {
		return err
	}
	if !val186 {
		var val185 ApexDependencyInfo
		if err = val185.Decode(ctx, buf); err != nil {
			return err
		}
		r.ApexDependencyInfo = &val185
	}

	if err = r.MaxSdkVersion.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var JavaInfoGobRegId int16

func (r JavaInfo) GetTypeId() int16 {
	return JavaInfoGobRegId
}

func (r DexpreopterInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputProfilePathOnHost); err != nil {
		return err
	}

	if r.ApexSystemServerDexpreoptInstalls == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ApexSystemServerDexpreoptInstalls)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.ApexSystemServerDexpreoptInstalls); val1++ {
			if err = r.ApexSystemServerDexpreoptInstalls[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.ApexSystemServerDexJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ApexSystemServerDexJars)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.ApexSystemServerDexJars); val2++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.ApexSystemServerDexJars[val2]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r DexpreopterInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.DexpreopterInfo")
	hasher.WriteInt(3)
	hasher.WriteString(":java.android.Path")
	val1 := r.OutputProfilePathOnHost == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputProfilePathOnHost); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.OutputProfilePathOnHost == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.OutputProfilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputProfilePathOnHost.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.[]DexpreopterInstall")
	hasher.WriteInt(len(r.ApexSystemServerDexpreoptInstalls))
	for val4 := 0; val4 < len(r.ApexSystemServerDexpreoptInstalls); val4++ {
		if err := r.ApexSystemServerDexpreoptInstalls[val4].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.ApexSystemServerDexJars))
	for val5 := 0; val5 < len(r.ApexSystemServerDexJars); val5++ {
		hasher.WriteString("android/soong/android:android.Path")
		val6 := r.ApexSystemServerDexJars[val5] == nil
		if val6 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.ApexSystemServerDexJars[val5]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val7 := r.ApexSystemServerDexJars[val5] == nil
					if val7 {
						hasher.WriteByte(0)
					} else {
						val8 := func(hasher *proptools.Hasher) error {
							return r.ApexSystemServerDexJars[val5].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val8); err != nil {
							return err
						}
					}
				}
			} else {
				r.ApexSystemServerDexJars[val5].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	return nil
}

func (r *DexpreopterInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.OutputProfilePathOnHost = nil
	} else {
		r.OutputProfilePathOnHost = val2.(android.Path)
	}

	var val4 int
	err = gobtools.DecodeInt(buf, &val4)
	if err != nil {
		return err
	}
	if val4 != -1 {
		r.ApexSystemServerDexpreoptInstalls = make([]DexpreopterInstall, val4)
		for val5 := 0; val5 < int(val4); val5++ {
			if err = r.ApexSystemServerDexpreoptInstalls[val5].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	var val9 int
	err = gobtools.DecodeInt(buf, &val9)
	if err != nil {
		return err
	}
	if val9 != -1 {
		r.ApexSystemServerDexJars = make([]android.Path, val9)
		for val10 := 0; val10 < int(val9); val10++ {
			if val12, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val12 == nil {
				r.ApexSystemServerDexJars[val10] = nil
			} else {
				r.ApexSystemServerDexJars[val10] = val12.(android.Path)
			}
		}
	}

	return err
}

var DexpreopterInfoGobRegId int16

func (r DexpreopterInfo) GetTypeId() int16 {
	return DexpreopterInfoGobRegId
}

func (r JavaLibraryInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeBool(buf, r.Prebuilt); err != nil {
		return err
	}

	if r.PermittedPackages == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.PermittedPackages)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.PermittedPackages); val1++ {
			if err = gobtools.EncodeString(buf, r.PermittedPackages[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r JavaLibraryInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaLibraryInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":.bool")
	if r.Prebuilt {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.PermittedPackages))
	for val1 := 0; val1 < len(r.PermittedPackages); val1++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.PermittedPackages[val1])
	}
	return nil
}

func (r *JavaLibraryInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeBool(buf, &r.Prebuilt)
	if err != nil {
		return err
	}

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.PermittedPackages = make([]string, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			err = gobtools.DecodeString(buf, &r.PermittedPackages[val4])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var JavaLibraryInfoGobRegId int16

func (r JavaLibraryInfo) GetTypeId() int16 {
	return JavaLibraryInfoGobRegId
}

func (r JavaDexImportInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error
	return err
}

func (r JavaDexImportInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaDexImportInfo")
	hasher.WriteInt(0)
	return nil
}

func (r *JavaDexImportInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	return err
}

var JavaDexImportInfoGobRegId int16

func (r JavaDexImportInfo) GetTypeId() int16 {
	return JavaDexImportInfoGobRegId
}

func (r SyspropPublicStubInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.JavaInfo == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = (*r.JavaInfo).Encode(ctx, buf); err != nil {
			return err
		}
	}
	return err
}

func (r SyspropPublicStubInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SyspropPublicStubInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.*JavaInfo")
	val1 := r.JavaInfo == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			if err := (*r.JavaInfo).CustomHash(hasher); err != nil {
				return err
			}
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.JavaInfo)), val2); err != nil {
			return err
		}
	}
	return nil
}

func (r *SyspropPublicStubInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 JavaInfo
		if err = val1.Decode(ctx, buf); err != nil {
			return err
		}
		r.JavaInfo = &val1
	}

	return err
}

var SyspropPublicStubInfoGobRegId int16

func (r SyspropPublicStubInfo) GetTypeId() int16 {
	return SyspropPublicStubInfoGobRegId
}

func (r jniLib) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeString(buf, r.name); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.path); err != nil {
		return err
	}

	if err = r.target.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.coverageFile.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.unstrippedFile); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.partition); err != nil {
		return err
	}

	if r.installPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.installPaths)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.installPaths); val1++ {
			if err = r.installPaths[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r jniLib) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.jniLib")
	hasher.WriteInt(7)
	hasher.WriteString(":.string")
	hasher.WriteString(r.name)
	hasher.WriteString(":java.android.Path")
	val1 := r.path == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.path); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.path == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.path.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.path.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.target.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.coverageFile.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.unstrippedFile == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.unstrippedFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.unstrippedFile == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error {
						return r.unstrippedFile.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.unstrippedFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.partition)
	hasher.WriteString(":java.android.InstallPaths")
	hasher.WriteString(":.[]InstallPath")
	hasher.WriteInt(len(r.installPaths))
	for val7 := 0; val7 < len(r.installPaths); val7++ {
		if err := r.installPaths[val7].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *jniLib) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeString(buf, &r.name)
	if err != nil {
		return err
	}

	if val3, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val3 == nil {
		r.path = nil
	} else {
		r.path = val3.(android.Path)
	}

	if err = r.target.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.coverageFile.Decode(ctx, buf); err != nil {
		return err
	}

	if val7, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val7 == nil {
		r.unstrippedFile = nil
	} else {
		r.unstrippedFile = val7.(android.Path)
	}

	err = gobtools.DecodeString(buf, &r.partition)
	if err != nil {
		return err
	}

	var val11 int
	err = gobtools.DecodeInt(buf, &val11)
	if err != nil {
		return err
	}
	if val11 != -1 {
		r.installPaths = make([]android.InstallPath, val11)
		for val12 := 0; val12 < int(val11); val12++ {
			if err = r.installPaths[val12].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var jniLibGobRegId int16

func (r jniLib) GetTypeId() int16 {
	return jniLibGobRegId
}

func (r JavaTestInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.TestConfig); err != nil {
		return err
	}
	return err
}

func (r JavaTestInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaTestInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":java.android.Path")
	val1 := r.TestConfig == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.TestConfig); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.TestConfig == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.TestConfig.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.TestConfig.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *JavaTestInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.TestConfig = nil
	} else {
		r.TestConfig = val2.(android.Path)
	}

	return err
}

var JavaTestInfoGobRegId int16

func (r JavaTestInfo) GetTypeId() int16 {
	return JavaTestInfoGobRegId
}

func (r JavaApiImportInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.ApiFile); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.ApiSurface); err != nil {
		return err
	}
	return err
}

func (r JavaApiImportInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaApiImportInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":java.android.Path")
	val1 := r.ApiFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ApiFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.ApiFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.ApiFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.ApiFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.ApiSurface)
	return nil
}

func (r *JavaApiImportInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.ApiFile = nil
	} else {
		r.ApiFile = val2.(android.Path)
	}

	err = gobtools.DecodeString(buf, &r.ApiSurface)
	if err != nil {
		return err
	}

	return err
}

var JavaApiImportInfoGobRegId int16

func (r JavaApiImportInfo) GetTypeId() int16 {
	return JavaApiImportInfoGobRegId
}

func (r JavaImportDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r JavaImportDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaImportDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *JavaImportDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var JavaImportDepInSameApexCheckerGobRegId int16

func (r JavaImportDepInSameApexChecker) GetTypeId() int16 {
	return JavaImportDepInSameApexCheckerGobRegId
}

// end of java.go

// begin of lint.go
func init() {
	LintInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(LintInfo) })
	ModuleLintReportZipsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ModuleLintReportZipsInfo) })
}

func (r LintInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.HTML); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.Text); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.XML); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.ReferenceBaseline); err != nil {
		return err
	}

	if err = r.TransitiveHTML.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveText.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveXML.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveBaseline.EncodeInterface(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r LintInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.LintInfo")
	hasher.WriteInt(8)
	hasher.WriteString(":java.android.Path")
	val1 := r.HTML == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.HTML); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.HTML == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.HTML.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.HTML.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.Text == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.Text); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.Text == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error { return r.Text.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.Text.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.XML == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.XML); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.XML == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error { return r.XML.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.XML.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val10 := r.ReferenceBaseline == nil
	if val10 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.ReferenceBaseline); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val11 := r.ReferenceBaseline == nil
				if val11 {
					hasher.WriteByte(0)
				} else {
					val12 := func(hasher *proptools.Hasher) error {
						return r.ReferenceBaseline.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val12); err != nil {
						return err
					}
				}
			}
		} else {
			r.ReferenceBaseline.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	val17 := func(hasher *proptools.Hasher, val13 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val14 := val13 == nil
		if val14 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val13); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val15 := val13 == nil
					if val15 {
						hasher.WriteByte(0)
					} else {
						val16 := func(hasher *proptools.Hasher) error { return val13.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val16); err != nil {
							return err
						}
					}
				}
			} else {
				val13.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveHTML.Hash(hasher, "android.Path", val17); err != nil {
		return err
	}
	val22 := func(hasher *proptools.Hasher, val18 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val19 := val18 == nil
		if val19 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val18); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val20 := val18 == nil
					if val20 {
						hasher.WriteByte(0)
					} else {
						val21 := func(hasher *proptools.Hasher) error { return val18.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val21); err != nil {
							return err
						}
					}
				}
			} else {
				val18.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveText.Hash(hasher, "android.Path", val22); err != nil {
		return err
	}
	val27 := func(hasher *proptools.Hasher, val23 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val24 := val23 == nil
		if val24 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val23); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val25 := val23 == nil
					if val25 {
						hasher.WriteByte(0)
					} else {
						val26 := func(hasher *proptools.Hasher) error { return val23.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val26); err != nil {
							return err
						}
					}
				}
			} else {
				val23.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveXML.Hash(hasher, "android.Path", val27); err != nil {
		return err
	}
	val32 := func(hasher *proptools.Hasher, val28 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val29 := val28 == nil
		if val29 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val28); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val30 := val28 == nil
					if val30 {
						hasher.WriteByte(0)
					} else {
						val31 := func(hasher *proptools.Hasher) error { return val28.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val31); err != nil {
							return err
						}
					}
				}
			} else {
				val28.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveBaseline.Hash(hasher, "android.Path", val32); err != nil {
		return err
	}
	return nil
}

func (r *LintInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.HTML = nil
	} else {
		r.HTML = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.Text = nil
	} else {
		r.Text = val4.(android.Path)
	}

	if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val6 == nil {
		r.XML = nil
	} else {
		r.XML = val6.(android.Path)
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.ReferenceBaseline = nil
	} else {
		r.ReferenceBaseline = val8.(android.Path)
	}

	if err = r.TransitiveHTML.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveText.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveXML.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.TransitiveBaseline.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	return err
}

var LintInfoGobRegId int16

func (r LintInfo) GetTypeId() int16 {
	return LintInfoGobRegId
}

func (r ModuleLintReportZipsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.HtmlZip); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.TextZip); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.XmlZip); err != nil {
		return err
	}
	return err
}

func (r ModuleLintReportZipsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ModuleLintReportZipsInfo")
	hasher.WriteInt(3)
	hasher.WriteString(":java.android.Path")
	val1 := r.HtmlZip == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.HtmlZip); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.HtmlZip == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.HtmlZip.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.HtmlZip.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val4 := r.TextZip == nil
	if val4 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.TextZip); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val5 := r.TextZip == nil
				if val5 {
					hasher.WriteByte(0)
				} else {
					val6 := func(hasher *proptools.Hasher) error { return r.TextZip.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val6); err != nil {
						return err
					}
				}
			}
		} else {
			r.TextZip.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Path")
	val7 := r.XmlZip == nil
	if val7 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.XmlZip); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val8 := r.XmlZip == nil
				if val8 {
					hasher.WriteByte(0)
				} else {
					val9 := func(hasher *proptools.Hasher) error { return r.XmlZip.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val9); err != nil {
						return err
					}
				}
			}
		} else {
			r.XmlZip.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	return nil
}

func (r *ModuleLintReportZipsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.HtmlZip = nil
	} else {
		r.HtmlZip = val2.(android.Path)
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.TextZip = nil
	} else {
		r.TextZip = val4.(android.Path)
	}

	if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val6 == nil {
		r.XmlZip = nil
	} else {
		r.XmlZip = val6.(android.Path)
	}

	return err
}

var ModuleLintReportZipsInfoGobRegId int16

func (r ModuleLintReportZipsInfo) GetTypeId() int16 {
	return ModuleLintReportZipsInfoGobRegId
}

// end of lint.go

// begin of platform_compat_config.go
func init() {
	PlatformCompatConfigInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(PlatformCompatConfigInfo) })
}

func (r PlatformCompatConfigInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.CompatConfig.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.SubDir); err != nil {
		return err
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.CompatConfigMetadata); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.IncludeInMergedXml); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Prebuilt); err != nil {
		return err
	}
	return err
}

func (r PlatformCompatConfigInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.PlatformCompatConfigInfo")
	hasher.WriteInt(5)
	if err := r.CompatConfig.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.SubDir)
	hasher.WriteString(":java.android.Path")
	val1 := r.CompatConfigMetadata == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.CompatConfigMetadata); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.CompatConfigMetadata == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error {
						return r.CompatConfigMetadata.(proptools.CustomHash).CustomHash(hasher)
					}
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.CompatConfigMetadata.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":.bool")
	if r.IncludeInMergedXml {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.bool")
	if r.Prebuilt {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *PlatformCompatConfigInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.CompatConfig.Decode(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.SubDir)
	if err != nil {
		return err
	}

	if val4, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val4 == nil {
		r.CompatConfigMetadata = nil
	} else {
		r.CompatConfigMetadata = val4.(android.Path)
	}

	err = gobtools.DecodeBool(buf, &r.IncludeInMergedXml)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Prebuilt)
	if err != nil {
		return err
	}

	return err
}

var PlatformCompatConfigInfoGobRegId int16

func (r PlatformCompatConfigInfo) GetTypeId() int16 {
	return PlatformCompatConfigInfoGobRegId
}

// end of platform_compat_config.go

// begin of plugin.go
func init() {
	JavaPluginInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(JavaPluginInfo) })
	KotlinPluginInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(KotlinPluginInfo) })
}

func (r JavaPluginInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.ProcessorClass == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.ProcessorClass)); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeBool(buf, r.GeneratesApi); err != nil {
		return err
	}
	return err
}

func (r JavaPluginInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.JavaPluginInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":.*string")
	val1 := r.ProcessorClass == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.ProcessorClass))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.ProcessorClass)), val2); err != nil {
			return err
		}
	}
	hasher.WriteString(":.bool")
	if r.GeneratesApi {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	return nil
}

func (r *JavaPluginInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 string
		err = gobtools.DecodeString(buf, &val1)
		if err != nil {
			return err
		}
		r.ProcessorClass = &val1
	}

	err = gobtools.DecodeBool(buf, &r.GeneratesApi)
	if err != nil {
		return err
	}

	return err
}

var JavaPluginInfoGobRegId int16

func (r JavaPluginInfo) GetTypeId() int16 {
	return JavaPluginInfoGobRegId
}

func (r KotlinPluginInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error
	return err
}

func (r KotlinPluginInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.KotlinPluginInfo")
	hasher.WriteInt(0)
	return nil
}

func (r *KotlinPluginInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	return err
}

var KotlinPluginInfoGobRegId int16

func (r KotlinPluginInfo) GetTypeId() int16 {
	return KotlinPluginInfoGobRegId
}

// end of plugin.go

// begin of ravenwood.go
func init() {
	ravenwoodLibgroupJniDepProviderInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ravenwoodLibgroupJniDepProviderInfo) })
	ravenwoodLibgroupInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ravenwoodLibgroupInfo) })
}

func (r ravenwoodLibgroupJniDepProviderInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.names == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.names)); err != nil {
			return err
		}
		for val1, val2 := range r.names {
			if err = gobtools.EncodeString(buf, val1); err != nil {
				return err
			}
			if err = gobtools.EncodeBool(buf, val2); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ravenwoodLibgroupJniDepProviderInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ravenwoodLibgroupJniDepProviderInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.map[string]bool")
	hasher.WriteInt(len(r.names))
	val1 := make([]string, 0, len(r.names))
	for val3 := range r.names {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":.string")
		hasher.WriteString(val2)
		hasher.WriteString(":.bool")
		if r.names[val2] {
			hasher.WriteByte(1)
		} else {
			hasher.WriteByte(0)
		}
	}
	return nil
}

func (r *ravenwoodLibgroupJniDepProviderInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val1 int
	err = gobtools.DecodeInt(buf, &val1)
	if err != nil {
		return err
	}
	if val1 != -1 {
		r.names = make(map[string]bool, val1)
		for val2 := 0; val2 < int(val1); val2++ {
			var val3 string
			var val4 bool
			err = gobtools.DecodeString(buf, &val3)
			if err != nil {
				return err
			}
			err = gobtools.DecodeBool(buf, &val4)
			if err != nil {
				return err
			}
			r.names[val3] = val4
		}
	}

	return err
}

var ravenwoodLibgroupJniDepProviderInfoGobRegId int16

func (r ravenwoodLibgroupJniDepProviderInfo) GetTypeId() int16 {
	return ravenwoodLibgroupJniDepProviderInfoGobRegId
}

func (r ravenwoodLibgroupInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.libs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.libs)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.libs); val1++ {
			if err = gobtools.EncodeString(buf, r.libs[val1]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r ravenwoodLibgroupInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ravenwoodLibgroupInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.libs))
	for val1 := 0; val1 < len(r.libs); val1++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.libs[val1])
	}
	return nil
}

func (r *ravenwoodLibgroupInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.libs = make([]string, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			err = gobtools.DecodeString(buf, &r.libs[val3])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var ravenwoodLibgroupInfoGobRegId int16

func (r ravenwoodLibgroupInfo) GetTypeId() int16 {
	return ravenwoodLibgroupInfoGobRegId
}

// end of ravenwood.go

// begin of robolectric.go
func init() {
	RobolectricRuntimesInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(RobolectricRuntimesInfo) })
}

func (r RobolectricRuntimesInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.Runtimes == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Runtimes)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.Runtimes); val1++ {
			if err = r.Runtimes[val1].Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r RobolectricRuntimesInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.RobolectricRuntimesInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.[]android.InstallPath")
	hasher.WriteInt(len(r.Runtimes))
	for val1 := 0; val1 < len(r.Runtimes); val1++ {
		if err := r.Runtimes[val1].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *RobolectricRuntimesInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.Runtimes = make([]android.InstallPath, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			if err = r.Runtimes[val3].Decode(ctx, buf); err != nil {
				return err
			}
		}
	}

	return err
}

var RobolectricRuntimesInfoGobRegId int16

func (r RobolectricRuntimesInfo) GetTypeId() int16 {
	return RobolectricRuntimesInfoGobRegId
}

// end of robolectric.go

// begin of rro.go
func init() {
	RuntimeResourceOverlayInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(RuntimeResourceOverlayInfo) })
}

func (r RuntimeResourceOverlayInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputFile); err != nil {
		return err
	}

	if err = r.Certificate.Encode(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.Theme); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.OverriddenManifestPackageName); err != nil {
		return err
	}
	return err
}

func (r RuntimeResourceOverlayInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.RuntimeResourceOverlayInfo")
	hasher.WriteInt(4)
	hasher.WriteString(":java.android.Path")
	val1 := r.OutputFile == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputFile); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val2 := r.OutputFile == nil
				if val2 {
					hasher.WriteByte(0)
				} else {
					val3 := func(hasher *proptools.Hasher) error { return r.OutputFile.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val3); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputFile.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	if err := r.Certificate.CustomHash(hasher); err != nil {
		return err
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.Theme)
	hasher.WriteString(":.string")
	hasher.WriteString(r.OverriddenManifestPackageName)
	return nil
}

func (r *RuntimeResourceOverlayInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if val2, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val2 == nil {
		r.OutputFile = nil
	} else {
		r.OutputFile = val2.(android.Path)
	}

	if err = r.Certificate.Decode(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.Theme)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.OverriddenManifestPackageName)
	if err != nil {
		return err
	}

	return err
}

var RuntimeResourceOverlayInfoGobRegId int16

func (r RuntimeResourceOverlayInfo) GetTypeId() int16 {
	return RuntimeResourceOverlayInfoGobRegId
}

// end of rro.go

// begin of sdk_library.go
func init() {
	SdkLibraryComponentDependencyInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SdkLibraryComponentDependencyInfo) })
	ApiScopePathsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApiScopePathsInfo) })
	ApiScopePropsInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ApiScopePropsInfo) })
	SdkLibraryInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SdkLibraryInfo) })
	SdkLibraryDepInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SdkLibraryDepInSameApexChecker) })
	SdkLibraryImportDepIsInSameApexCheckerGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SdkLibraryImportDepIsInSameApexChecker) })
}

func (r SdkLibraryComponentDependencyInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.OptionalSdkLibraryImplementation == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.OptionalSdkLibraryImplementation)); err != nil {
			return err
		}
	}

	val2 := r.SdkLibraryName == nil
	if err = gobtools.EncodeBool(buf, val2); err != nil {
		return err
	}
	if !val2 {
		if err = gobtools.EncodeString(buf, (*r.SdkLibraryName)); err != nil {
			return err
		}
	}
	return err
}

func (r SdkLibraryComponentDependencyInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SdkLibraryComponentDependencyInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":.*string")
	val1 := r.OptionalSdkLibraryImplementation == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.OptionalSdkLibraryImplementation))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.OptionalSdkLibraryImplementation)), val2); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*string")
	val3 := r.SdkLibraryName == nil
	if val3 {
		hasher.WriteByte(0)
	} else {
		val4 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.SdkLibraryName))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.SdkLibraryName)), val4); err != nil {
			return err
		}
	}
	return nil
}

func (r *SdkLibraryComponentDependencyInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 string
		err = gobtools.DecodeString(buf, &val1)
		if err != nil {
			return err
		}
		r.OptionalSdkLibraryImplementation = &val1
	}

	var val5 bool
	if err = gobtools.DecodeBool(buf, &val5); err != nil {
		return err
	}
	if !val5 {
		var val4 string
		err = gobtools.DecodeString(buf, &val4)
		if err != nil {
			return err
		}
		r.SdkLibraryName = &val4
	}

	return err
}

var SdkLibraryComponentDependencyInfoGobRegId int16

func (r SdkLibraryComponentDependencyInfo) GetTypeId() int16 {
	return SdkLibraryComponentDependencyInfoGobRegId
}

func (r ApiScopePathsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.StubsImplPath == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.StubsImplPath)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.StubsImplPath); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.StubsImplPath[val1]); err != nil {
				return err
			}
		}
	}

	if err = r.CurrentApiFilePath.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.RemovedApiFilePath.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.StubsSrcJar.Encode(ctx, buf); err != nil {
		return err
	}

	if err = r.AnnotationsZip.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r ApiScopePathsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ApiScopePathsInfo")
	hasher.WriteInt(5)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.StubsImplPath))
	for val1 := 0; val1 < len(r.StubsImplPath); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.StubsImplPath[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.StubsImplPath[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.StubsImplPath[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.StubsImplPath[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.StubsImplPath[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	if err := r.CurrentApiFilePath.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.RemovedApiFilePath.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.StubsSrcJar.CustomHash(hasher); err != nil {
		return err
	}
	if err := r.AnnotationsZip.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *ApiScopePathsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.StubsImplPath = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.StubsImplPath[val4] = nil
			} else {
				r.StubsImplPath[val4] = val6.(android.Path)
			}
		}
	}

	if err = r.CurrentApiFilePath.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.RemovedApiFilePath.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.StubsSrcJar.Decode(ctx, buf); err != nil {
		return err
	}

	if err = r.AnnotationsZip.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var ApiScopePathsInfoGobRegId int16

func (r ApiScopePathsInfo) GetTypeId() int16 {
	return ApiScopePathsInfoGobRegId
}

func (r ApiScopePropsInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	val1 := r.SdkVersion == nil
	if err = gobtools.EncodeBool(buf, val1); err != nil {
		return err
	}
	if !val1 {
		if err = gobtools.EncodeString(buf, (*r.SdkVersion)); err != nil {
			return err
		}
	}
	return err
}

func (r ApiScopePropsInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.ApiScopePropsInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.*string")
	val1 := r.SdkVersion == nil
	if val1 {
		hasher.WriteByte(0)
	} else {
		val2 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.SdkVersion))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.SdkVersion)), val2); err != nil {
			return err
		}
	}
	return nil
}

func (r *ApiScopePropsInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 bool
	if err = gobtools.DecodeBool(buf, &val2); err != nil {
		return err
	}
	if !val2 {
		var val1 string
		err = gobtools.DecodeString(buf, &val1)
		if err != nil {
			return err
		}
		r.SdkVersion = &val1
	}

	return err
}

var ApiScopePropsInfoGobRegId int16

func (r ApiScopePropsInfo) GetTypeId() int16 {
	return ApiScopePropsInfoGobRegId
}

func (r SdkLibraryInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.GeneratingLibs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.GeneratingLibs)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.GeneratingLibs); val1++ {
			if err = gobtools.EncodeString(buf, r.GeneratingLibs[val1]); err != nil {
				return err
			}
		}
	}

	if r.EverythingStubDexJarPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.EverythingStubDexJarPaths)); err != nil {
			return err
		}
		for val2, val3 := range r.EverythingStubDexJarPaths {
			if err = gobtools.EncodeInt(buf, int(val2)); err != nil {
				return err
			}
			if err = val3.Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.ExportableStubDexJarPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ExportableStubDexJarPaths)); err != nil {
			return err
		}
		for val4, val5 := range r.ExportableStubDexJarPaths {
			if err = gobtools.EncodeInt(buf, int(val4)); err != nil {
				return err
			}
			if err = val5.Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.RemovedTxtFiles == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.RemovedTxtFiles)); err != nil {
			return err
		}
		for val6, val7 := range r.RemovedTxtFiles {
			if err = gobtools.EncodeInt(buf, int(val6)); err != nil {
				return err
			}
			if err = val7.Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeBool(buf, r.SharedLibrary); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Prebuilt); err != nil {
		return err
	}

	if err = gobtools.EncodeString(buf, r.DistStem); err != nil {
		return err
	}

	if r.DoctagPaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.DoctagPaths)); err != nil {
			return err
		}
		for val8 := 0; val8 < len(r.DoctagPaths); val8++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.DoctagPaths[val8]); err != nil {
				return err
			}
		}
	}

	val9 := r.OnBootclasspathSince == nil
	if err = gobtools.EncodeBool(buf, val9); err != nil {
		return err
	}
	if !val9 {
		if err = gobtools.EncodeString(buf, (*r.OnBootclasspathSince)); err != nil {
			return err
		}
	}

	val10 := r.OnBootclasspathBefore == nil
	if err = gobtools.EncodeBool(buf, val10); err != nil {
		return err
	}
	if !val10 {
		if err = gobtools.EncodeString(buf, (*r.OnBootclasspathBefore)); err != nil {
			return err
		}
	}

	val11 := r.MinDeviceSdk == nil
	if err = gobtools.EncodeBool(buf, val11); err != nil {
		return err
	}
	if !val11 {
		if err = gobtools.EncodeString(buf, (*r.MinDeviceSdk)); err != nil {
			return err
		}
	}

	val12 := r.MaxDeviceSdk == nil
	if err = gobtools.EncodeBool(buf, val12); err != nil {
		return err
	}
	if !val12 {
		if err = gobtools.EncodeString(buf, (*r.MaxDeviceSdk)); err != nil {
			return err
		}
	}

	if err = gobtools.EncodeBool(buf, r.ImplLibProfileGuided); err != nil {
		return err
	}

	if r.ApiScopePaths == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ApiScopePaths)); err != nil {
			return err
		}
		for val13, val14 := range r.ApiScopePaths {
			if err = gobtools.EncodeString(buf, val13); err != nil {
				return err
			}
			if err = val14.Encode(ctx, buf); err != nil {
				return err
			}
		}
	}

	if r.ApiScopeProps == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.ApiScopeProps)); err != nil {
			return err
		}
		for val15, val16 := range r.ApiScopeProps {
			if err = gobtools.EncodeString(buf, val15); err != nil {
				return err
			}
			if err = val16.Encode(ctx, buf); err != nil {
				return err
			}
		}
	}
	return err
}

func (r SdkLibraryInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SdkLibraryInfo")
	hasher.WriteInt(15)
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.GeneratingLibs))
	for val1 := 0; val1 < len(r.GeneratingLibs); val1++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.GeneratingLibs[val1])
	}
	hasher.WriteString(":.map[android.SdkKind]OptionalDexJarPath")
	hasher.WriteInt(len(r.EverythingStubDexJarPaths))
	val2 := make([]android.SdkKind, 0, len(r.EverythingStubDexJarPaths))
	for val4 := range r.EverythingStubDexJarPaths {
		val2 = append(val2, val4)
	}
	proptools.SortOrdered(val2)
	for _, val3 := range val2 {
		hasher.WriteString(":java.android.SdkKind")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val3)))
		if err := r.EverythingStubDexJarPaths[val3].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":.map[android.SdkKind]OptionalDexJarPath")
	hasher.WriteInt(len(r.ExportableStubDexJarPaths))
	val5 := make([]android.SdkKind, 0, len(r.ExportableStubDexJarPaths))
	for val7 := range r.ExportableStubDexJarPaths {
		val5 = append(val5, val7)
	}
	proptools.SortOrdered(val5)
	for _, val6 := range val5 {
		hasher.WriteString(":java.android.SdkKind")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val6)))
		if err := r.ExportableStubDexJarPaths[val6].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":.map[android.SdkKind]android.OptionalPath")
	hasher.WriteInt(len(r.RemovedTxtFiles))
	val8 := make([]android.SdkKind, 0, len(r.RemovedTxtFiles))
	for val10 := range r.RemovedTxtFiles {
		val8 = append(val8, val10)
	}
	proptools.SortOrdered(val8)
	for _, val9 := range val8 {
		hasher.WriteString(":java.android.SdkKind")
		hasher.WriteString(":.int")
		hasher.WriteUint64(uint64(int(val9)))
		if err := r.RemovedTxtFiles[val9].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":.bool")
	if r.SharedLibrary {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.bool")
	if r.Prebuilt {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.string")
	hasher.WriteString(r.DistStem)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.DoctagPaths))
	for val11 := 0; val11 < len(r.DoctagPaths); val11++ {
		hasher.WriteString("android/soong/android:android.Path")
		val12 := r.DoctagPaths[val11] == nil
		if val12 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.DoctagPaths[val11]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val13 := r.DoctagPaths[val11] == nil
					if val13 {
						hasher.WriteByte(0)
					} else {
						val14 := func(hasher *proptools.Hasher) error {
							return r.DoctagPaths[val11].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val14); err != nil {
							return err
						}
					}
				}
			} else {
				r.DoctagPaths[val11].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":.*string")
	val15 := r.OnBootclasspathSince == nil
	if val15 {
		hasher.WriteByte(0)
	} else {
		val16 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.OnBootclasspathSince))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.OnBootclasspathSince)), val16); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*string")
	val17 := r.OnBootclasspathBefore == nil
	if val17 {
		hasher.WriteByte(0)
	} else {
		val18 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.OnBootclasspathBefore))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.OnBootclasspathBefore)), val18); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*string")
	val19 := r.MinDeviceSdk == nil
	if val19 {
		hasher.WriteByte(0)
	} else {
		val20 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.MinDeviceSdk))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.MinDeviceSdk)), val20); err != nil {
			return err
		}
	}
	hasher.WriteString(":.*string")
	val21 := r.MaxDeviceSdk == nil
	if val21 {
		hasher.WriteByte(0)
	} else {
		val22 := func(hasher *proptools.Hasher) error {
			hasher.WriteString(":.string")
			hasher.WriteString((*r.MaxDeviceSdk))
			return nil
		}
		if err := proptools.HashReference(hasher, uintptr(unsafe.Pointer(r.MaxDeviceSdk)), val22); err != nil {
			return err
		}
	}
	hasher.WriteString(":.bool")
	if r.ImplLibProfileGuided {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.map[string]ApiScopePathsInfo")
	hasher.WriteInt(len(r.ApiScopePaths))
	val23 := make([]string, 0, len(r.ApiScopePaths))
	for val25 := range r.ApiScopePaths {
		val23 = append(val23, val25)
	}
	proptools.SortOrdered(val23)
	for _, val24 := range val23 {
		hasher.WriteString(":.string")
		hasher.WriteString(val24)
		if err := r.ApiScopePaths[val24].CustomHash(hasher); err != nil {
			return err
		}
	}
	hasher.WriteString(":.map[string]ApiScopePropsInfo")
	hasher.WriteInt(len(r.ApiScopeProps))
	val26 := make([]string, 0, len(r.ApiScopeProps))
	for val28 := range r.ApiScopeProps {
		val26 = append(val26, val28)
	}
	proptools.SortOrdered(val26)
	for _, val27 := range val26 {
		hasher.WriteString(":.string")
		hasher.WriteString(val27)
		if err := r.ApiScopeProps[val27].CustomHash(hasher); err != nil {
			return err
		}
	}
	return nil
}

func (r *SdkLibraryInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.GeneratingLibs = make([]string, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			err = gobtools.DecodeString(buf, &r.GeneratingLibs[val3])
			if err != nil {
				return err
			}
		}
	}

	var val5 int
	err = gobtools.DecodeInt(buf, &val5)
	if err != nil {
		return err
	}
	if val5 != -1 {
		r.EverythingStubDexJarPaths = make(map[android.SdkKind]OptionalDexJarPath, val5)
		for val6 := 0; val6 < int(val5); val6++ {
			var val7 android.SdkKind
			var val8 OptionalDexJarPath
			var val10 int
			err = gobtools.DecodeInt(buf, &val10)
			if err != nil {
				return err
			}
			val7 = android.SdkKind(val10)
			if err = val8.Decode(ctx, buf); err != nil {
				return err
			}
			r.EverythingStubDexJarPaths[val7] = val8
		}
	}

	var val13 int
	err = gobtools.DecodeInt(buf, &val13)
	if err != nil {
		return err
	}
	if val13 != -1 {
		r.ExportableStubDexJarPaths = make(map[android.SdkKind]OptionalDexJarPath, val13)
		for val14 := 0; val14 < int(val13); val14++ {
			var val15 android.SdkKind
			var val16 OptionalDexJarPath
			var val18 int
			err = gobtools.DecodeInt(buf, &val18)
			if err != nil {
				return err
			}
			val15 = android.SdkKind(val18)
			if err = val16.Decode(ctx, buf); err != nil {
				return err
			}
			r.ExportableStubDexJarPaths[val15] = val16
		}
	}

	var val21 int
	err = gobtools.DecodeInt(buf, &val21)
	if err != nil {
		return err
	}
	if val21 != -1 {
		r.RemovedTxtFiles = make(map[android.SdkKind]android.OptionalPath, val21)
		for val22 := 0; val22 < int(val21); val22++ {
			var val23 android.SdkKind
			var val24 android.OptionalPath
			var val26 int
			err = gobtools.DecodeInt(buf, &val26)
			if err != nil {
				return err
			}
			val23 = android.SdkKind(val26)
			if err = val24.Decode(ctx, buf); err != nil {
				return err
			}
			r.RemovedTxtFiles[val23] = val24
		}
	}

	err = gobtools.DecodeBool(buf, &r.SharedLibrary)
	if err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Prebuilt)
	if err != nil {
		return err
	}

	err = gobtools.DecodeString(buf, &r.DistStem)
	if err != nil {
		return err
	}

	var val34 int
	err = gobtools.DecodeInt(buf, &val34)
	if err != nil {
		return err
	}
	if val34 != -1 {
		r.DoctagPaths = make([]android.Path, val34)
		for val35 := 0; val35 < int(val34); val35++ {
			if val37, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val37 == nil {
				r.DoctagPaths[val35] = nil
			} else {
				r.DoctagPaths[val35] = val37.(android.Path)
			}
		}
	}

	var val39 bool
	if err = gobtools.DecodeBool(buf, &val39); err != nil {
		return err
	}
	if !val39 {
		var val38 string
		err = gobtools.DecodeString(buf, &val38)
		if err != nil {
			return err
		}
		r.OnBootclasspathSince = &val38
	}

	var val42 bool
	if err = gobtools.DecodeBool(buf, &val42); err != nil {
		return err
	}
	if !val42 {
		var val41 string
		err = gobtools.DecodeString(buf, &val41)
		if err != nil {
			return err
		}
		r.OnBootclasspathBefore = &val41
	}

	var val45 bool
	if err = gobtools.DecodeBool(buf, &val45); err != nil {
		return err
	}
	if !val45 {
		var val44 string
		err = gobtools.DecodeString(buf, &val44)
		if err != nil {
			return err
		}
		r.MinDeviceSdk = &val44
	}

	var val48 bool
	if err = gobtools.DecodeBool(buf, &val48); err != nil {
		return err
	}
	if !val48 {
		var val47 string
		err = gobtools.DecodeString(buf, &val47)
		if err != nil {
			return err
		}
		r.MaxDeviceSdk = &val47
	}

	err = gobtools.DecodeBool(buf, &r.ImplLibProfileGuided)
	if err != nil {
		return err
	}

	var val51 int
	err = gobtools.DecodeInt(buf, &val51)
	if err != nil {
		return err
	}
	if val51 != -1 {
		r.ApiScopePaths = make(map[string]ApiScopePathsInfo, val51)
		for val52 := 0; val52 < int(val51); val52++ {
			var val53 string
			var val54 ApiScopePathsInfo
			err = gobtools.DecodeString(buf, &val53)
			if err != nil {
				return err
			}
			if err = val54.Decode(ctx, buf); err != nil {
				return err
			}
			r.ApiScopePaths[val53] = val54
		}
	}

	var val57 int
	err = gobtools.DecodeInt(buf, &val57)
	if err != nil {
		return err
	}
	if val57 != -1 {
		r.ApiScopeProps = make(map[string]ApiScopePropsInfo, val57)
		for val58 := 0; val58 < int(val57); val58++ {
			var val59 string
			var val60 ApiScopePropsInfo
			err = gobtools.DecodeString(buf, &val59)
			if err != nil {
				return err
			}
			if err = val60.Decode(ctx, buf); err != nil {
				return err
			}
			r.ApiScopeProps[val59] = val60
		}
	}

	return err
}

var SdkLibraryInfoGobRegId int16

func (r SdkLibraryInfo) GetTypeId() int16 {
	return SdkLibraryInfoGobRegId
}

func (r SdkLibraryDepInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r SdkLibraryDepInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SdkLibraryDepInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *SdkLibraryDepInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var SdkLibraryDepInSameApexCheckerGobRegId int16

func (r SdkLibraryDepInSameApexChecker) GetTypeId() int16 {
	return SdkLibraryDepInSameApexCheckerGobRegId
}

func (r SdkLibraryImportDepIsInSameApexChecker) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Encode(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r SdkLibraryImportDepIsInSameApexChecker) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SdkLibraryImportDepIsInSameApexChecker")
	hasher.WriteInt(1)
	if err := r.BaseDepInSameApexChecker.CustomHash(hasher); err != nil {
		return err
	}
	return nil
}

func (r *SdkLibraryImportDepIsInSameApexChecker) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	if err = r.BaseDepInSameApexChecker.Decode(ctx, buf); err != nil {
		return err
	}

	return err
}

var SdkLibraryImportDepIsInSameApexCheckerGobRegId int16

func (r SdkLibraryImportDepIsInSameApexChecker) GetTypeId() int16 {
	return SdkLibraryImportDepIsInSameApexCheckerGobRegId
}

// end of sdk_library.go

// begin of system_modules.go
func init() {
	SystemModulesProviderInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SystemModulesProviderInfo) })
}

func (r SystemModulesProviderInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.HeaderJars == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.HeaderJars)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.HeaderJars); val1++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.HeaderJars[val1]); err != nil {
				return err
			}
		}
	}

	if err = gobtools.EncodeInterface(ctx, buf, r.OutputDir); err != nil {
		return err
	}

	if r.OutputDirDeps == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.OutputDirDeps)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.OutputDirDeps); val2++ {
			if err = gobtools.EncodeInterface(ctx, buf, r.OutputDirDeps[val2]); err != nil {
				return err
			}
		}
	}

	if err = r.TransitiveStaticLibsHeaderJars.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = gobtools.EncodeBool(buf, r.Prebuilt); err != nil {
		return err
	}

	if r.Libs == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Libs)); err != nil {
			return err
		}
		for val3 := 0; val3 < len(r.Libs); val3++ {
			if err = gobtools.EncodeString(buf, r.Libs[val3]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r SystemModulesProviderInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SystemModulesProviderInfo")
	hasher.WriteInt(6)
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.HeaderJars))
	for val1 := 0; val1 < len(r.HeaderJars); val1++ {
		hasher.WriteString("android/soong/android:android.Path")
		val2 := r.HeaderJars[val1] == nil
		if val2 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.HeaderJars[val1]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val3 := r.HeaderJars[val1] == nil
					if val3 {
						hasher.WriteByte(0)
					} else {
						val4 := func(hasher *proptools.Hasher) error {
							return r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val4); err != nil {
							return err
						}
					}
				}
			} else {
				r.HeaderJars[val1].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	hasher.WriteString(":java.android.Path")
	val5 := r.OutputDir == nil
	if val5 {
		hasher.WriteByte(0)
	} else {
		if v := reflect.ValueOf(r.OutputDir); v.Kind() == reflect.Ptr {
			if v.IsNil() {
				panic(fmt.Errorf("nil pointer is not supported in interface"))
			} else {
				val6 := r.OutputDir == nil
				if val6 {
					hasher.WriteByte(0)
				} else {
					val7 := func(hasher *proptools.Hasher) error { return r.OutputDir.(proptools.CustomHash).CustomHash(hasher) }
					if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val7); err != nil {
						return err
					}
				}
			}
		} else {
			r.OutputDir.(proptools.CustomHash).CustomHash(hasher)
		}
	}
	hasher.WriteString(":java.android.Paths")
	hasher.WriteString(":.[]Path")
	hasher.WriteInt(len(r.OutputDirDeps))
	for val8 := 0; val8 < len(r.OutputDirDeps); val8++ {
		hasher.WriteString("android/soong/android:android.Path")
		val9 := r.OutputDirDeps[val8] == nil
		if val9 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(r.OutputDirDeps[val8]); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val10 := r.OutputDirDeps[val8] == nil
					if val10 {
						hasher.WriteByte(0)
					} else {
						val11 := func(hasher *proptools.Hasher) error {
							return r.OutputDirDeps[val8].(proptools.CustomHash).CustomHash(hasher)
						}
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val11); err != nil {
							return err
						}
					}
				}
			} else {
				r.OutputDirDeps[val8].(proptools.CustomHash).CustomHash(hasher)
			}
		}
	}
	val16 := func(hasher *proptools.Hasher, val12 android.Path) error {
		hasher.WriteString(":java.android.Path")
		val13 := val12 == nil
		if val13 {
			hasher.WriteByte(0)
		} else {
			if v := reflect.ValueOf(val12); v.Kind() == reflect.Ptr {
				if v.IsNil() {
					panic(fmt.Errorf("nil pointer is not supported in interface"))
				} else {
					val14 := val12 == nil
					if val14 {
						hasher.WriteByte(0)
					} else {
						val15 := func(hasher *proptools.Hasher) error { return val12.(proptools.CustomHash).CustomHash(hasher) }
						if err := proptools.HashReference(hasher, uintptr(v.Pointer()), val15); err != nil {
							return err
						}
					}
				}
			} else {
				val12.(proptools.CustomHash).CustomHash(hasher)
			}
		}
		return nil
	}
	if err := r.TransitiveStaticLibsHeaderJars.Hash(hasher, "android.Path", val16); err != nil {
		return err
	}
	hasher.WriteString(":.bool")
	if r.Prebuilt {
		hasher.WriteByte(1)
	} else {
		hasher.WriteByte(0)
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.Libs))
	for val17 := 0; val17 < len(r.Libs); val17++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.Libs[val17])
	}
	return nil
}

func (r *SystemModulesProviderInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val3 int
	err = gobtools.DecodeInt(buf, &val3)
	if err != nil {
		return err
	}
	if val3 != -1 {
		r.HeaderJars = make([]android.Path, val3)
		for val4 := 0; val4 < int(val3); val4++ {
			if val6, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val6 == nil {
				r.HeaderJars[val4] = nil
			} else {
				r.HeaderJars[val4] = val6.(android.Path)
			}
		}
	}

	if val8, err := gobtools.DecodeInterface(ctx, buf); err != nil {
		return err
	} else if val8 == nil {
		r.OutputDir = nil
	} else {
		r.OutputDir = val8.(android.Path)
	}

	var val11 int
	err = gobtools.DecodeInt(buf, &val11)
	if err != nil {
		return err
	}
	if val11 != -1 {
		r.OutputDirDeps = make([]android.Path, val11)
		for val12 := 0; val12 < int(val11); val12++ {
			if val14, err := gobtools.DecodeInterface(ctx, buf); err != nil {
				return err
			} else if val14 == nil {
				r.OutputDirDeps[val12] = nil
			} else {
				r.OutputDirDeps[val12] = val14.(android.Path)
			}
		}
	}

	if err = r.TransitiveStaticLibsHeaderJars.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	err = gobtools.DecodeBool(buf, &r.Prebuilt)
	if err != nil {
		return err
	}

	var val18 int
	err = gobtools.DecodeInt(buf, &val18)
	if err != nil {
		return err
	}
	if val18 != -1 {
		r.Libs = make([]string, val18)
		for val19 := 0; val19 < int(val18); val19++ {
			err = gobtools.DecodeString(buf, &r.Libs[val19])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var SystemModulesProviderInfoGobRegId int16

func (r SystemModulesProviderInfo) GetTypeId() int16 {
	return SystemModulesProviderInfoGobRegId
}

// end of system_modules.go

// begin of systemserver_classpath_fragment.go
func init() {
	SystemServerClasspathInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(SystemServerClasspathInfo) })
	LibraryNameToPartitionInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(LibraryNameToPartitionInfo) })
}

func (r SystemServerClasspathInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.Contents == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.Contents)); err != nil {
			return err
		}
		for val1 := 0; val1 < len(r.Contents); val1++ {
			if err = gobtools.EncodeString(buf, r.Contents[val1]); err != nil {
				return err
			}
		}
	}

	if r.StandaloneContents == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.StandaloneContents)); err != nil {
			return err
		}
		for val2 := 0; val2 < len(r.StandaloneContents); val2++ {
			if err = gobtools.EncodeString(buf, r.StandaloneContents[val2]); err != nil {
				return err
			}
		}
	}
	return err
}

func (r SystemServerClasspathInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.SystemServerClasspathInfo")
	hasher.WriteInt(2)
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.Contents))
	for val1 := 0; val1 < len(r.Contents); val1++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.Contents[val1])
	}
	hasher.WriteString(":.[]string")
	hasher.WriteInt(len(r.StandaloneContents))
	for val2 := 0; val2 < len(r.StandaloneContents); val2++ {
		hasher.WriteString(":.string")
		hasher.WriteString(r.StandaloneContents[val2])
	}
	return nil
}

func (r *SystemServerClasspathInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val2 int
	err = gobtools.DecodeInt(buf, &val2)
	if err != nil {
		return err
	}
	if val2 != -1 {
		r.Contents = make([]string, val2)
		for val3 := 0; val3 < int(val2); val3++ {
			err = gobtools.DecodeString(buf, &r.Contents[val3])
			if err != nil {
				return err
			}
		}
	}

	var val6 int
	err = gobtools.DecodeInt(buf, &val6)
	if err != nil {
		return err
	}
	if val6 != -1 {
		r.StandaloneContents = make([]string, val6)
		for val7 := 0; val7 < int(val6); val7++ {
			err = gobtools.DecodeString(buf, &r.StandaloneContents[val7])
			if err != nil {
				return err
			}
		}
	}

	return err
}

var SystemServerClasspathInfoGobRegId int16

func (r SystemServerClasspathInfo) GetTypeId() int16 {
	return SystemServerClasspathInfoGobRegId
}

func (r LibraryNameToPartitionInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if r.LibraryNameToPartition == nil {
		if err = gobtools.EncodeInt(buf, -1); err != nil {
			return err
		}
	} else {
		if err = gobtools.EncodeInt(buf, len(r.LibraryNameToPartition)); err != nil {
			return err
		}
		for val1, val2 := range r.LibraryNameToPartition {
			if err = gobtools.EncodeString(buf, val1); err != nil {
				return err
			}
			if err = gobtools.EncodeString(buf, val2); err != nil {
				return err
			}
		}
	}
	return err
}

func (r LibraryNameToPartitionInfo) CustomHash(hasher *proptools.Hasher) error {
	hasher.WriteString(":java.LibraryNameToPartitionInfo")
	hasher.WriteInt(1)
	hasher.WriteString(":.map[string]string")
	hasher.WriteInt(len(r.LibraryNameToPartition))
	val1 := make([]string, 0, len(r.LibraryNameToPartition))
	for val3 := range r.LibraryNameToPartition {
		val1 = append(val1, val3)
	}
	proptools.SortOrdered(val1)
	for _, val2 := range val1 {
		hasher.WriteString(":.string")
		hasher.WriteString(val2)
		hasher.WriteString(":.string")
		hasher.WriteString(r.LibraryNameToPartition[val2])
	}
	return nil
}

func (r *LibraryNameToPartitionInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	var val1 int
	err = gobtools.DecodeInt(buf, &val1)
	if err != nil {
		return err
	}
	if val1 != -1 {
		r.LibraryNameToPartition = make(map[string]string, val1)
		for val2 := 0; val2 < int(val1); val2++ {
			var val3 string
			var val4 string
			err = gobtools.DecodeString(buf, &val3)
			if err != nil {
				return err
			}
			err = gobtools.DecodeString(buf, &val4)
			if err != nil {
				return err
			}
			r.LibraryNameToPartition[val3] = val4
		}
	}

	return err
}

var LibraryNameToPartitionInfoGobRegId int16

func (r LibraryNameToPartitionInfo) GetTypeId() int16 {
	return LibraryNameToPartitionInfoGobRegId
}

// end of systemserver_classpath_fragment.go
