// Code generated by gotdgen, DO NOT EDIT.

package tg

import (
	"context"
	"errors"
	"fmt"
	"sort"
	"strings"

	"go.uber.org/multierr"

	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdjson"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdp"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tgerr"
)

// No-op definition for keeping imports.
var (
	_ = bin.Buffer{}
	_ = context.Background()
	_ = fmt.Stringer(nil)
	_ = strings.Builder{}
	_ = errors.Is
	_ = multierr.AppendInto
	_ = sort.Ints
	_ = tdp.Format
	_ = tgerr.Error{}
	_ = tdjson.Encoder{}
)

// InputFileLocation represents TL type `inputFileLocation#dfdaabe1`.
// DEPRECATED location of a photo
//
// See https://core.telegram.org/constructor/inputFileLocation for reference.
type InputFileLocation struct {
	// Server volume
	VolumeID int64
	// File identifier
	LocalID int
	// Check sum to access the file
	Secret int64
	// File reference¹
	//
	// Links:
	//  1) https://core.telegram.org/api/file-references
	FileReference []byte
}

// InputFileLocationTypeID is TL type id of InputFileLocation.
const InputFileLocationTypeID = 0xdfdaabe1

// construct implements constructor of InputFileLocationClass.
func (i InputFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputFileLocation.
var (
	_ bin.Encoder     = &InputFileLocation{}
	_ bin.Decoder     = &InputFileLocation{}
	_ bin.BareEncoder = &InputFileLocation{}
	_ bin.BareDecoder = &InputFileLocation{}

	_ InputFileLocationClass = &InputFileLocation{}
)

func (i *InputFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.VolumeID == 0) {
		return false
	}
	if !(i.LocalID == 0) {
		return false
	}
	if !(i.Secret == 0) {
		return false
	}
	if !(i.FileReference == nil) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputFileLocation) String() string {
	if i == nil {
		return "InputFileLocation(nil)"
	}
	type Alias InputFileLocation
	return fmt.Sprintf("InputFileLocation%+v", Alias(*i))
}

// FillFrom fills InputFileLocation from given interface.
func (i *InputFileLocation) FillFrom(from interface {
	GetVolumeID() (value int64)
	GetLocalID() (value int)
	GetSecret() (value int64)
	GetFileReference() (value []byte)
}) {
	i.VolumeID = from.GetVolumeID()
	i.LocalID = from.GetLocalID()
	i.Secret = from.GetSecret()
	i.FileReference = from.GetFileReference()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputFileLocation) TypeID() uint32 {
	return InputFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputFileLocation) TypeName() string {
	return "inputFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputFileLocation",
		ID:   InputFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "VolumeID",
			SchemaName: "volume_id",
		},
		{
			Name:       "LocalID",
			SchemaName: "local_id",
		},
		{
			Name:       "Secret",
			SchemaName: "secret",
		},
		{
			Name:       "FileReference",
			SchemaName: "file_reference",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputFileLocation#dfdaabe1 as nil")
	}
	b.PutID(InputFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputFileLocation#dfdaabe1 as nil")
	}
	b.PutLong(i.VolumeID)
	b.PutInt(i.LocalID)
	b.PutLong(i.Secret)
	b.PutBytes(i.FileReference)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputFileLocation#dfdaabe1 to nil")
	}
	if err := b.ConsumeID(InputFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputFileLocation#dfdaabe1: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputFileLocation#dfdaabe1 to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputFileLocation#dfdaabe1: field volume_id: %w", err)
		}
		i.VolumeID = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputFileLocation#dfdaabe1: field local_id: %w", err)
		}
		i.LocalID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputFileLocation#dfdaabe1: field secret: %w", err)
		}
		i.Secret = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode inputFileLocation#dfdaabe1: field file_reference: %w", err)
		}
		i.FileReference = value
	}
	return nil
}

// GetVolumeID returns value of VolumeID field.
func (i *InputFileLocation) GetVolumeID() (value int64) {
	if i == nil {
		return
	}
	return i.VolumeID
}

// GetLocalID returns value of LocalID field.
func (i *InputFileLocation) GetLocalID() (value int) {
	if i == nil {
		return
	}
	return i.LocalID
}

// GetSecret returns value of Secret field.
func (i *InputFileLocation) GetSecret() (value int64) {
	if i == nil {
		return
	}
	return i.Secret
}

// GetFileReference returns value of FileReference field.
func (i *InputFileLocation) GetFileReference() (value []byte) {
	if i == nil {
		return
	}
	return i.FileReference
}

// InputEncryptedFileLocation represents TL type `inputEncryptedFileLocation#f5235d55`.
// Location of encrypted secret chat file.
//
// See https://core.telegram.org/constructor/inputEncryptedFileLocation for reference.
type InputEncryptedFileLocation struct {
	// File ID, id parameter value from encryptedFile¹
	//
	// Links:
	//  1) https://core.telegram.org/constructor/encryptedFile
	ID int64
	// Checksum, access_hash parameter value from encryptedFile¹
	//
	// Links:
	//  1) https://core.telegram.org/constructor/encryptedFile
	AccessHash int64
}

// InputEncryptedFileLocationTypeID is TL type id of InputEncryptedFileLocation.
const InputEncryptedFileLocationTypeID = 0xf5235d55

// construct implements constructor of InputFileLocationClass.
func (i InputEncryptedFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputEncryptedFileLocation.
var (
	_ bin.Encoder     = &InputEncryptedFileLocation{}
	_ bin.Decoder     = &InputEncryptedFileLocation{}
	_ bin.BareEncoder = &InputEncryptedFileLocation{}
	_ bin.BareDecoder = &InputEncryptedFileLocation{}

	_ InputFileLocationClass = &InputEncryptedFileLocation{}
)

func (i *InputEncryptedFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.ID == 0) {
		return false
	}
	if !(i.AccessHash == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputEncryptedFileLocation) String() string {
	if i == nil {
		return "InputEncryptedFileLocation(nil)"
	}
	type Alias InputEncryptedFileLocation
	return fmt.Sprintf("InputEncryptedFileLocation%+v", Alias(*i))
}

// FillFrom fills InputEncryptedFileLocation from given interface.
func (i *InputEncryptedFileLocation) FillFrom(from interface {
	GetID() (value int64)
	GetAccessHash() (value int64)
}) {
	i.ID = from.GetID()
	i.AccessHash = from.GetAccessHash()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputEncryptedFileLocation) TypeID() uint32 {
	return InputEncryptedFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputEncryptedFileLocation) TypeName() string {
	return "inputEncryptedFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputEncryptedFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputEncryptedFileLocation",
		ID:   InputEncryptedFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ID",
			SchemaName: "id",
		},
		{
			Name:       "AccessHash",
			SchemaName: "access_hash",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputEncryptedFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputEncryptedFileLocation#f5235d55 as nil")
	}
	b.PutID(InputEncryptedFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputEncryptedFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputEncryptedFileLocation#f5235d55 as nil")
	}
	b.PutLong(i.ID)
	b.PutLong(i.AccessHash)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputEncryptedFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputEncryptedFileLocation#f5235d55 to nil")
	}
	if err := b.ConsumeID(InputEncryptedFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputEncryptedFileLocation#f5235d55: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputEncryptedFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputEncryptedFileLocation#f5235d55 to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputEncryptedFileLocation#f5235d55: field id: %w", err)
		}
		i.ID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputEncryptedFileLocation#f5235d55: field access_hash: %w", err)
		}
		i.AccessHash = value
	}
	return nil
}

// GetID returns value of ID field.
func (i *InputEncryptedFileLocation) GetID() (value int64) {
	if i == nil {
		return
	}
	return i.ID
}

// GetAccessHash returns value of AccessHash field.
func (i *InputEncryptedFileLocation) GetAccessHash() (value int64) {
	if i == nil {
		return
	}
	return i.AccessHash
}

// InputDocumentFileLocation represents TL type `inputDocumentFileLocation#bad07584`.
// Document location (video, voice, audio, basically every type except photo)
//
// See https://core.telegram.org/constructor/inputDocumentFileLocation for reference.
type InputDocumentFileLocation struct {
	// Document ID
	ID int64
	// access_hash parameter from the document¹ constructor
	//
	// Links:
	//  1) https://core.telegram.org/constructor/document
	AccessHash int64
	// File reference¹
	//
	// Links:
	//  1) https://core.telegram.org/api/file-references
	FileReference []byte
	// Thumbnail size to download the thumbnail
	ThumbSize string
}

// InputDocumentFileLocationTypeID is TL type id of InputDocumentFileLocation.
const InputDocumentFileLocationTypeID = 0xbad07584

// construct implements constructor of InputFileLocationClass.
func (i InputDocumentFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputDocumentFileLocation.
var (
	_ bin.Encoder     = &InputDocumentFileLocation{}
	_ bin.Decoder     = &InputDocumentFileLocation{}
	_ bin.BareEncoder = &InputDocumentFileLocation{}
	_ bin.BareDecoder = &InputDocumentFileLocation{}

	_ InputFileLocationClass = &InputDocumentFileLocation{}
)

func (i *InputDocumentFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.ID == 0) {
		return false
	}
	if !(i.AccessHash == 0) {
		return false
	}
	if !(i.FileReference == nil) {
		return false
	}
	if !(i.ThumbSize == "") {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputDocumentFileLocation) String() string {
	if i == nil {
		return "InputDocumentFileLocation(nil)"
	}
	type Alias InputDocumentFileLocation
	return fmt.Sprintf("InputDocumentFileLocation%+v", Alias(*i))
}

// FillFrom fills InputDocumentFileLocation from given interface.
func (i *InputDocumentFileLocation) FillFrom(from interface {
	GetID() (value int64)
	GetAccessHash() (value int64)
	GetFileReference() (value []byte)
	GetThumbSize() (value string)
}) {
	i.ID = from.GetID()
	i.AccessHash = from.GetAccessHash()
	i.FileReference = from.GetFileReference()
	i.ThumbSize = from.GetThumbSize()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputDocumentFileLocation) TypeID() uint32 {
	return InputDocumentFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputDocumentFileLocation) TypeName() string {
	return "inputDocumentFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputDocumentFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputDocumentFileLocation",
		ID:   InputDocumentFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ID",
			SchemaName: "id",
		},
		{
			Name:       "AccessHash",
			SchemaName: "access_hash",
		},
		{
			Name:       "FileReference",
			SchemaName: "file_reference",
		},
		{
			Name:       "ThumbSize",
			SchemaName: "thumb_size",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputDocumentFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputDocumentFileLocation#bad07584 as nil")
	}
	b.PutID(InputDocumentFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputDocumentFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputDocumentFileLocation#bad07584 as nil")
	}
	b.PutLong(i.ID)
	b.PutLong(i.AccessHash)
	b.PutBytes(i.FileReference)
	b.PutString(i.ThumbSize)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputDocumentFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputDocumentFileLocation#bad07584 to nil")
	}
	if err := b.ConsumeID(InputDocumentFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputDocumentFileLocation#bad07584: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputDocumentFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputDocumentFileLocation#bad07584 to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputDocumentFileLocation#bad07584: field id: %w", err)
		}
		i.ID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputDocumentFileLocation#bad07584: field access_hash: %w", err)
		}
		i.AccessHash = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode inputDocumentFileLocation#bad07584: field file_reference: %w", err)
		}
		i.FileReference = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode inputDocumentFileLocation#bad07584: field thumb_size: %w", err)
		}
		i.ThumbSize = value
	}
	return nil
}

// GetID returns value of ID field.
func (i *InputDocumentFileLocation) GetID() (value int64) {
	if i == nil {
		return
	}
	return i.ID
}

// GetAccessHash returns value of AccessHash field.
func (i *InputDocumentFileLocation) GetAccessHash() (value int64) {
	if i == nil {
		return
	}
	return i.AccessHash
}

// GetFileReference returns value of FileReference field.
func (i *InputDocumentFileLocation) GetFileReference() (value []byte) {
	if i == nil {
		return
	}
	return i.FileReference
}

// GetThumbSize returns value of ThumbSize field.
func (i *InputDocumentFileLocation) GetThumbSize() (value string) {
	if i == nil {
		return
	}
	return i.ThumbSize
}

// InputSecureFileLocation represents TL type `inputSecureFileLocation#cbc7ee28`.
// Location of encrypted telegram passport¹ file.
//
// Links:
//  1. https://core.telegram.org/passport
//
// See https://core.telegram.org/constructor/inputSecureFileLocation for reference.
type InputSecureFileLocation struct {
	// File ID, id parameter value from secureFile¹
	//
	// Links:
	//  1) https://core.telegram.org/constructor/secureFile
	ID int64
	// Checksum, access_hash parameter value from secureFile¹
	//
	// Links:
	//  1) https://core.telegram.org/constructor/secureFile
	AccessHash int64
}

// InputSecureFileLocationTypeID is TL type id of InputSecureFileLocation.
const InputSecureFileLocationTypeID = 0xcbc7ee28

// construct implements constructor of InputFileLocationClass.
func (i InputSecureFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputSecureFileLocation.
var (
	_ bin.Encoder     = &InputSecureFileLocation{}
	_ bin.Decoder     = &InputSecureFileLocation{}
	_ bin.BareEncoder = &InputSecureFileLocation{}
	_ bin.BareDecoder = &InputSecureFileLocation{}

	_ InputFileLocationClass = &InputSecureFileLocation{}
)

func (i *InputSecureFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.ID == 0) {
		return false
	}
	if !(i.AccessHash == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputSecureFileLocation) String() string {
	if i == nil {
		return "InputSecureFileLocation(nil)"
	}
	type Alias InputSecureFileLocation
	return fmt.Sprintf("InputSecureFileLocation%+v", Alias(*i))
}

// FillFrom fills InputSecureFileLocation from given interface.
func (i *InputSecureFileLocation) FillFrom(from interface {
	GetID() (value int64)
	GetAccessHash() (value int64)
}) {
	i.ID = from.GetID()
	i.AccessHash = from.GetAccessHash()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputSecureFileLocation) TypeID() uint32 {
	return InputSecureFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputSecureFileLocation) TypeName() string {
	return "inputSecureFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputSecureFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputSecureFileLocation",
		ID:   InputSecureFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ID",
			SchemaName: "id",
		},
		{
			Name:       "AccessHash",
			SchemaName: "access_hash",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputSecureFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputSecureFileLocation#cbc7ee28 as nil")
	}
	b.PutID(InputSecureFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputSecureFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputSecureFileLocation#cbc7ee28 as nil")
	}
	b.PutLong(i.ID)
	b.PutLong(i.AccessHash)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputSecureFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputSecureFileLocation#cbc7ee28 to nil")
	}
	if err := b.ConsumeID(InputSecureFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputSecureFileLocation#cbc7ee28: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputSecureFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputSecureFileLocation#cbc7ee28 to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputSecureFileLocation#cbc7ee28: field id: %w", err)
		}
		i.ID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputSecureFileLocation#cbc7ee28: field access_hash: %w", err)
		}
		i.AccessHash = value
	}
	return nil
}

// GetID returns value of ID field.
func (i *InputSecureFileLocation) GetID() (value int64) {
	if i == nil {
		return
	}
	return i.ID
}

// GetAccessHash returns value of AccessHash field.
func (i *InputSecureFileLocation) GetAccessHash() (value int64) {
	if i == nil {
		return
	}
	return i.AccessHash
}

// InputTakeoutFileLocation represents TL type `inputTakeoutFileLocation#29be5899`.
// Used to download a JSON file that will contain all personal data related to features
// that do not have a specialized takeout method¹ yet, see here »² for more info on
// the takeout API.
//
// Links:
//  1. https://core.telegram.org/api/takeout
//  2. https://core.telegram.org/api/takeout
//
// See https://core.telegram.org/constructor/inputTakeoutFileLocation for reference.
type InputTakeoutFileLocation struct {
}

// InputTakeoutFileLocationTypeID is TL type id of InputTakeoutFileLocation.
const InputTakeoutFileLocationTypeID = 0x29be5899

// construct implements constructor of InputFileLocationClass.
func (i InputTakeoutFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputTakeoutFileLocation.
var (
	_ bin.Encoder     = &InputTakeoutFileLocation{}
	_ bin.Decoder     = &InputTakeoutFileLocation{}
	_ bin.BareEncoder = &InputTakeoutFileLocation{}
	_ bin.BareDecoder = &InputTakeoutFileLocation{}

	_ InputFileLocationClass = &InputTakeoutFileLocation{}
)

func (i *InputTakeoutFileLocation) Zero() bool {
	if i == nil {
		return true
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputTakeoutFileLocation) String() string {
	if i == nil {
		return "InputTakeoutFileLocation(nil)"
	}
	type Alias InputTakeoutFileLocation
	return fmt.Sprintf("InputTakeoutFileLocation%+v", Alias(*i))
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputTakeoutFileLocation) TypeID() uint32 {
	return InputTakeoutFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputTakeoutFileLocation) TypeName() string {
	return "inputTakeoutFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputTakeoutFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputTakeoutFileLocation",
		ID:   InputTakeoutFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputTakeoutFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputTakeoutFileLocation#29be5899 as nil")
	}
	b.PutID(InputTakeoutFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputTakeoutFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputTakeoutFileLocation#29be5899 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (i *InputTakeoutFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputTakeoutFileLocation#29be5899 to nil")
	}
	if err := b.ConsumeID(InputTakeoutFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputTakeoutFileLocation#29be5899: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputTakeoutFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputTakeoutFileLocation#29be5899 to nil")
	}
	return nil
}

// InputPhotoFileLocation represents TL type `inputPhotoFileLocation#40181ffe`.
// Use this object to download a photo with upload.getFile¹ method
//
// Links:
//  1. https://core.telegram.org/method/upload.getFile
//
// See https://core.telegram.org/constructor/inputPhotoFileLocation for reference.
type InputPhotoFileLocation struct {
	// Photo ID, obtained from the photo¹ object
	//
	// Links:
	//  1) https://core.telegram.org/constructor/photo
	ID int64
	// Photo's access hash, obtained from the photo¹ object
	//
	// Links:
	//  1) https://core.telegram.org/constructor/photo
	AccessHash int64
	// File reference¹
	//
	// Links:
	//  1) https://core.telegram.org/api/file-references
	FileReference []byte
	// The PhotoSize¹ to download: must be set to the type field of the desired PhotoSize
	// object of the photo²
	//
	// Links:
	//  1) https://core.telegram.org/type/PhotoSize
	//  2) https://core.telegram.org/constructor/photo
	ThumbSize string
}

// InputPhotoFileLocationTypeID is TL type id of InputPhotoFileLocation.
const InputPhotoFileLocationTypeID = 0x40181ffe

// construct implements constructor of InputFileLocationClass.
func (i InputPhotoFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputPhotoFileLocation.
var (
	_ bin.Encoder     = &InputPhotoFileLocation{}
	_ bin.Decoder     = &InputPhotoFileLocation{}
	_ bin.BareEncoder = &InputPhotoFileLocation{}
	_ bin.BareDecoder = &InputPhotoFileLocation{}

	_ InputFileLocationClass = &InputPhotoFileLocation{}
)

func (i *InputPhotoFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.ID == 0) {
		return false
	}
	if !(i.AccessHash == 0) {
		return false
	}
	if !(i.FileReference == nil) {
		return false
	}
	if !(i.ThumbSize == "") {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputPhotoFileLocation) String() string {
	if i == nil {
		return "InputPhotoFileLocation(nil)"
	}
	type Alias InputPhotoFileLocation
	return fmt.Sprintf("InputPhotoFileLocation%+v", Alias(*i))
}

// FillFrom fills InputPhotoFileLocation from given interface.
func (i *InputPhotoFileLocation) FillFrom(from interface {
	GetID() (value int64)
	GetAccessHash() (value int64)
	GetFileReference() (value []byte)
	GetThumbSize() (value string)
}) {
	i.ID = from.GetID()
	i.AccessHash = from.GetAccessHash()
	i.FileReference = from.GetFileReference()
	i.ThumbSize = from.GetThumbSize()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputPhotoFileLocation) TypeID() uint32 {
	return InputPhotoFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputPhotoFileLocation) TypeName() string {
	return "inputPhotoFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputPhotoFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPhotoFileLocation",
		ID:   InputPhotoFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ID",
			SchemaName: "id",
		},
		{
			Name:       "AccessHash",
			SchemaName: "access_hash",
		},
		{
			Name:       "FileReference",
			SchemaName: "file_reference",
		},
		{
			Name:       "ThumbSize",
			SchemaName: "thumb_size",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPhotoFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPhotoFileLocation#40181ffe as nil")
	}
	b.PutID(InputPhotoFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPhotoFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPhotoFileLocation#40181ffe as nil")
	}
	b.PutLong(i.ID)
	b.PutLong(i.AccessHash)
	b.PutBytes(i.FileReference)
	b.PutString(i.ThumbSize)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputPhotoFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPhotoFileLocation#40181ffe to nil")
	}
	if err := b.ConsumeID(InputPhotoFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputPhotoFileLocation#40181ffe: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputPhotoFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPhotoFileLocation#40181ffe to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoFileLocation#40181ffe: field id: %w", err)
		}
		i.ID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoFileLocation#40181ffe: field access_hash: %w", err)
		}
		i.AccessHash = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoFileLocation#40181ffe: field file_reference: %w", err)
		}
		i.FileReference = value
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoFileLocation#40181ffe: field thumb_size: %w", err)
		}
		i.ThumbSize = value
	}
	return nil
}

// GetID returns value of ID field.
func (i *InputPhotoFileLocation) GetID() (value int64) {
	if i == nil {
		return
	}
	return i.ID
}

// GetAccessHash returns value of AccessHash field.
func (i *InputPhotoFileLocation) GetAccessHash() (value int64) {
	if i == nil {
		return
	}
	return i.AccessHash
}

// GetFileReference returns value of FileReference field.
func (i *InputPhotoFileLocation) GetFileReference() (value []byte) {
	if i == nil {
		return
	}
	return i.FileReference
}

// GetThumbSize returns value of ThumbSize field.
func (i *InputPhotoFileLocation) GetThumbSize() (value string) {
	if i == nil {
		return
	}
	return i.ThumbSize
}

// InputPhotoLegacyFileLocation represents TL type `inputPhotoLegacyFileLocation#d83466f3`.
// DEPRECATED legacy photo file location
//
// See https://core.telegram.org/constructor/inputPhotoLegacyFileLocation for reference.
type InputPhotoLegacyFileLocation struct {
	// Photo ID
	ID int64
	// Access hash
	AccessHash int64
	// File reference
	FileReference []byte
	// Volume ID
	VolumeID int64
	// Local ID
	LocalID int
	// Secret
	Secret int64
}

// InputPhotoLegacyFileLocationTypeID is TL type id of InputPhotoLegacyFileLocation.
const InputPhotoLegacyFileLocationTypeID = 0xd83466f3

// construct implements constructor of InputFileLocationClass.
func (i InputPhotoLegacyFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputPhotoLegacyFileLocation.
var (
	_ bin.Encoder     = &InputPhotoLegacyFileLocation{}
	_ bin.Decoder     = &InputPhotoLegacyFileLocation{}
	_ bin.BareEncoder = &InputPhotoLegacyFileLocation{}
	_ bin.BareDecoder = &InputPhotoLegacyFileLocation{}

	_ InputFileLocationClass = &InputPhotoLegacyFileLocation{}
)

func (i *InputPhotoLegacyFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.ID == 0) {
		return false
	}
	if !(i.AccessHash == 0) {
		return false
	}
	if !(i.FileReference == nil) {
		return false
	}
	if !(i.VolumeID == 0) {
		return false
	}
	if !(i.LocalID == 0) {
		return false
	}
	if !(i.Secret == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputPhotoLegacyFileLocation) String() string {
	if i == nil {
		return "InputPhotoLegacyFileLocation(nil)"
	}
	type Alias InputPhotoLegacyFileLocation
	return fmt.Sprintf("InputPhotoLegacyFileLocation%+v", Alias(*i))
}

// FillFrom fills InputPhotoLegacyFileLocation from given interface.
func (i *InputPhotoLegacyFileLocation) FillFrom(from interface {
	GetID() (value int64)
	GetAccessHash() (value int64)
	GetFileReference() (value []byte)
	GetVolumeID() (value int64)
	GetLocalID() (value int)
	GetSecret() (value int64)
}) {
	i.ID = from.GetID()
	i.AccessHash = from.GetAccessHash()
	i.FileReference = from.GetFileReference()
	i.VolumeID = from.GetVolumeID()
	i.LocalID = from.GetLocalID()
	i.Secret = from.GetSecret()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputPhotoLegacyFileLocation) TypeID() uint32 {
	return InputPhotoLegacyFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputPhotoLegacyFileLocation) TypeName() string {
	return "inputPhotoLegacyFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputPhotoLegacyFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPhotoLegacyFileLocation",
		ID:   InputPhotoLegacyFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ID",
			SchemaName: "id",
		},
		{
			Name:       "AccessHash",
			SchemaName: "access_hash",
		},
		{
			Name:       "FileReference",
			SchemaName: "file_reference",
		},
		{
			Name:       "VolumeID",
			SchemaName: "volume_id",
		},
		{
			Name:       "LocalID",
			SchemaName: "local_id",
		},
		{
			Name:       "Secret",
			SchemaName: "secret",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPhotoLegacyFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPhotoLegacyFileLocation#d83466f3 as nil")
	}
	b.PutID(InputPhotoLegacyFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPhotoLegacyFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPhotoLegacyFileLocation#d83466f3 as nil")
	}
	b.PutLong(i.ID)
	b.PutLong(i.AccessHash)
	b.PutBytes(i.FileReference)
	b.PutLong(i.VolumeID)
	b.PutInt(i.LocalID)
	b.PutLong(i.Secret)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputPhotoLegacyFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPhotoLegacyFileLocation#d83466f3 to nil")
	}
	if err := b.ConsumeID(InputPhotoLegacyFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputPhotoLegacyFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPhotoLegacyFileLocation#d83466f3 to nil")
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field id: %w", err)
		}
		i.ID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field access_hash: %w", err)
		}
		i.AccessHash = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field file_reference: %w", err)
		}
		i.FileReference = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field volume_id: %w", err)
		}
		i.VolumeID = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field local_id: %w", err)
		}
		i.LocalID = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPhotoLegacyFileLocation#d83466f3: field secret: %w", err)
		}
		i.Secret = value
	}
	return nil
}

// GetID returns value of ID field.
func (i *InputPhotoLegacyFileLocation) GetID() (value int64) {
	if i == nil {
		return
	}
	return i.ID
}

// GetAccessHash returns value of AccessHash field.
func (i *InputPhotoLegacyFileLocation) GetAccessHash() (value int64) {
	if i == nil {
		return
	}
	return i.AccessHash
}

// GetFileReference returns value of FileReference field.
func (i *InputPhotoLegacyFileLocation) GetFileReference() (value []byte) {
	if i == nil {
		return
	}
	return i.FileReference
}

// GetVolumeID returns value of VolumeID field.
func (i *InputPhotoLegacyFileLocation) GetVolumeID() (value int64) {
	if i == nil {
		return
	}
	return i.VolumeID
}

// GetLocalID returns value of LocalID field.
func (i *InputPhotoLegacyFileLocation) GetLocalID() (value int) {
	if i == nil {
		return
	}
	return i.LocalID
}

// GetSecret returns value of Secret field.
func (i *InputPhotoLegacyFileLocation) GetSecret() (value int64) {
	if i == nil {
		return
	}
	return i.Secret
}

// InputPeerPhotoFileLocation represents TL type `inputPeerPhotoFileLocation#37257e99`.
// Location of profile photo of channel/group/supergroup/user
//
// See https://core.telegram.org/constructor/inputPeerPhotoFileLocation for reference.
type InputPeerPhotoFileLocation struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Whether to download the high-quality version of the picture
	Big bool
	// The peer whose profile picture should be downloaded
	Peer InputPeerClass
	// Photo ID
	PhotoID int64
}

// InputPeerPhotoFileLocationTypeID is TL type id of InputPeerPhotoFileLocation.
const InputPeerPhotoFileLocationTypeID = 0x37257e99

// construct implements constructor of InputFileLocationClass.
func (i InputPeerPhotoFileLocation) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputPeerPhotoFileLocation.
var (
	_ bin.Encoder     = &InputPeerPhotoFileLocation{}
	_ bin.Decoder     = &InputPeerPhotoFileLocation{}
	_ bin.BareEncoder = &InputPeerPhotoFileLocation{}
	_ bin.BareDecoder = &InputPeerPhotoFileLocation{}

	_ InputFileLocationClass = &InputPeerPhotoFileLocation{}
)

func (i *InputPeerPhotoFileLocation) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Flags.Zero()) {
		return false
	}
	if !(i.Big == false) {
		return false
	}
	if !(i.Peer == nil) {
		return false
	}
	if !(i.PhotoID == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputPeerPhotoFileLocation) String() string {
	if i == nil {
		return "InputPeerPhotoFileLocation(nil)"
	}
	type Alias InputPeerPhotoFileLocation
	return fmt.Sprintf("InputPeerPhotoFileLocation%+v", Alias(*i))
}

// FillFrom fills InputPeerPhotoFileLocation from given interface.
func (i *InputPeerPhotoFileLocation) FillFrom(from interface {
	GetBig() (value bool)
	GetPeer() (value InputPeerClass)
	GetPhotoID() (value int64)
}) {
	i.Big = from.GetBig()
	i.Peer = from.GetPeer()
	i.PhotoID = from.GetPhotoID()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputPeerPhotoFileLocation) TypeID() uint32 {
	return InputPeerPhotoFileLocationTypeID
}

// TypeName returns name of type in TL schema.
func (*InputPeerPhotoFileLocation) TypeName() string {
	return "inputPeerPhotoFileLocation"
}

// TypeInfo returns info about TL type.
func (i *InputPeerPhotoFileLocation) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPeerPhotoFileLocation",
		ID:   InputPeerPhotoFileLocationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Big",
			SchemaName: "big",
			Null:       !i.Flags.Has(0),
		},
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "PhotoID",
			SchemaName: "photo_id",
		},
	}
	return typ
}

// SetFlags sets flags for non-zero fields.
func (i *InputPeerPhotoFileLocation) SetFlags() {
	if !(i.Big == false) {
		i.Flags.Set(0)
	}
}

// Encode implements bin.Encoder.
func (i *InputPeerPhotoFileLocation) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPeerPhotoFileLocation#37257e99 as nil")
	}
	b.PutID(InputPeerPhotoFileLocationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPeerPhotoFileLocation) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPeerPhotoFileLocation#37257e99 as nil")
	}
	i.SetFlags()
	if err := i.Flags.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocation#37257e99: field flags: %w", err)
	}
	if i.Peer == nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocation#37257e99: field peer is nil")
	}
	if err := i.Peer.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocation#37257e99: field peer: %w", err)
	}
	b.PutLong(i.PhotoID)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputPeerPhotoFileLocation) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPeerPhotoFileLocation#37257e99 to nil")
	}
	if err := b.ConsumeID(InputPeerPhotoFileLocationTypeID); err != nil {
		return fmt.Errorf("unable to decode inputPeerPhotoFileLocation#37257e99: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputPeerPhotoFileLocation) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPeerPhotoFileLocation#37257e99 to nil")
	}
	{
		if err := i.Flags.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocation#37257e99: field flags: %w", err)
		}
	}
	i.Big = i.Flags.Has(0)
	{
		value, err := DecodeInputPeer(b)
		if err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocation#37257e99: field peer: %w", err)
		}
		i.Peer = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocation#37257e99: field photo_id: %w", err)
		}
		i.PhotoID = value
	}
	return nil
}

// SetBig sets value of Big conditional field.
func (i *InputPeerPhotoFileLocation) SetBig(value bool) {
	if value {
		i.Flags.Set(0)
		i.Big = true
	} else {
		i.Flags.Unset(0)
		i.Big = false
	}
}

// GetBig returns value of Big conditional field.
func (i *InputPeerPhotoFileLocation) GetBig() (value bool) {
	if i == nil {
		return
	}
	return i.Flags.Has(0)
}

// GetPeer returns value of Peer field.
func (i *InputPeerPhotoFileLocation) GetPeer() (value InputPeerClass) {
	if i == nil {
		return
	}
	return i.Peer
}

// GetPhotoID returns value of PhotoID field.
func (i *InputPeerPhotoFileLocation) GetPhotoID() (value int64) {
	if i == nil {
		return
	}
	return i.PhotoID
}

// InputStickerSetThumb represents TL type `inputStickerSetThumb#9d84f3db`.
// Location of stickerset thumbnail (see files¹)
//
// Links:
//  1. https://core.telegram.org/api/files
//
// See https://core.telegram.org/constructor/inputStickerSetThumb for reference.
type InputStickerSetThumb struct {
	// Sticker set
	Stickerset InputStickerSetClass
	// Thumbnail version
	ThumbVersion int
}

// InputStickerSetThumbTypeID is TL type id of InputStickerSetThumb.
const InputStickerSetThumbTypeID = 0x9d84f3db

// construct implements constructor of InputFileLocationClass.
func (i InputStickerSetThumb) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputStickerSetThumb.
var (
	_ bin.Encoder     = &InputStickerSetThumb{}
	_ bin.Decoder     = &InputStickerSetThumb{}
	_ bin.BareEncoder = &InputStickerSetThumb{}
	_ bin.BareDecoder = &InputStickerSetThumb{}

	_ InputFileLocationClass = &InputStickerSetThumb{}
)

func (i *InputStickerSetThumb) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Stickerset == nil) {
		return false
	}
	if !(i.ThumbVersion == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputStickerSetThumb) String() string {
	if i == nil {
		return "InputStickerSetThumb(nil)"
	}
	type Alias InputStickerSetThumb
	return fmt.Sprintf("InputStickerSetThumb%+v", Alias(*i))
}

// FillFrom fills InputStickerSetThumb from given interface.
func (i *InputStickerSetThumb) FillFrom(from interface {
	GetStickerset() (value InputStickerSetClass)
	GetThumbVersion() (value int)
}) {
	i.Stickerset = from.GetStickerset()
	i.ThumbVersion = from.GetThumbVersion()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputStickerSetThumb) TypeID() uint32 {
	return InputStickerSetThumbTypeID
}

// TypeName returns name of type in TL schema.
func (*InputStickerSetThumb) TypeName() string {
	return "inputStickerSetThumb"
}

// TypeInfo returns info about TL type.
func (i *InputStickerSetThumb) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputStickerSetThumb",
		ID:   InputStickerSetThumbTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Stickerset",
			SchemaName: "stickerset",
		},
		{
			Name:       "ThumbVersion",
			SchemaName: "thumb_version",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputStickerSetThumb) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputStickerSetThumb#9d84f3db as nil")
	}
	b.PutID(InputStickerSetThumbTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputStickerSetThumb) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputStickerSetThumb#9d84f3db as nil")
	}
	if i.Stickerset == nil {
		return fmt.Errorf("unable to encode inputStickerSetThumb#9d84f3db: field stickerset is nil")
	}
	if err := i.Stickerset.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputStickerSetThumb#9d84f3db: field stickerset: %w", err)
	}
	b.PutInt(i.ThumbVersion)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputStickerSetThumb) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputStickerSetThumb#9d84f3db to nil")
	}
	if err := b.ConsumeID(InputStickerSetThumbTypeID); err != nil {
		return fmt.Errorf("unable to decode inputStickerSetThumb#9d84f3db: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputStickerSetThumb) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputStickerSetThumb#9d84f3db to nil")
	}
	{
		value, err := DecodeInputStickerSet(b)
		if err != nil {
			return fmt.Errorf("unable to decode inputStickerSetThumb#9d84f3db: field stickerset: %w", err)
		}
		i.Stickerset = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputStickerSetThumb#9d84f3db: field thumb_version: %w", err)
		}
		i.ThumbVersion = value
	}
	return nil
}

// GetStickerset returns value of Stickerset field.
func (i *InputStickerSetThumb) GetStickerset() (value InputStickerSetClass) {
	if i == nil {
		return
	}
	return i.Stickerset
}

// GetThumbVersion returns value of ThumbVersion field.
func (i *InputStickerSetThumb) GetThumbVersion() (value int) {
	if i == nil {
		return
	}
	return i.ThumbVersion
}

// InputGroupCallStream represents TL type `inputGroupCallStream#598a92a`.
// Chunk of a livestream
//
// See https://core.telegram.org/constructor/inputGroupCallStream for reference.
type InputGroupCallStream struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Livestream info
	Call InputGroupCallClass
	// Timestamp in milliseconds
	TimeMs int64
	// Specifies the duration of the video segment to fetch in milliseconds, by bitshifting
	// 1000 to the right scale times: duration_ms := 1000 >> scale
	Scale int
	// Selected video channel
	//
	// Use SetVideoChannel and GetVideoChannel helpers.
	VideoChannel int
	// Selected video quality (0 = lowest, 1 = medium, 2 = best)
	//
	// Use SetVideoQuality and GetVideoQuality helpers.
	VideoQuality int
}

// InputGroupCallStreamTypeID is TL type id of InputGroupCallStream.
const InputGroupCallStreamTypeID = 0x598a92a

// construct implements constructor of InputFileLocationClass.
func (i InputGroupCallStream) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputGroupCallStream.
var (
	_ bin.Encoder     = &InputGroupCallStream{}
	_ bin.Decoder     = &InputGroupCallStream{}
	_ bin.BareEncoder = &InputGroupCallStream{}
	_ bin.BareDecoder = &InputGroupCallStream{}

	_ InputFileLocationClass = &InputGroupCallStream{}
)

func (i *InputGroupCallStream) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Flags.Zero()) {
		return false
	}
	if !(i.Call == nil) {
		return false
	}
	if !(i.TimeMs == 0) {
		return false
	}
	if !(i.Scale == 0) {
		return false
	}
	if !(i.VideoChannel == 0) {
		return false
	}
	if !(i.VideoQuality == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputGroupCallStream) String() string {
	if i == nil {
		return "InputGroupCallStream(nil)"
	}
	type Alias InputGroupCallStream
	return fmt.Sprintf("InputGroupCallStream%+v", Alias(*i))
}

// FillFrom fills InputGroupCallStream from given interface.
func (i *InputGroupCallStream) FillFrom(from interface {
	GetCall() (value InputGroupCallClass)
	GetTimeMs() (value int64)
	GetScale() (value int)
	GetVideoChannel() (value int, ok bool)
	GetVideoQuality() (value int, ok bool)
}) {
	i.Call = from.GetCall()
	i.TimeMs = from.GetTimeMs()
	i.Scale = from.GetScale()
	if val, ok := from.GetVideoChannel(); ok {
		i.VideoChannel = val
	}

	if val, ok := from.GetVideoQuality(); ok {
		i.VideoQuality = val
	}

}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputGroupCallStream) TypeID() uint32 {
	return InputGroupCallStreamTypeID
}

// TypeName returns name of type in TL schema.
func (*InputGroupCallStream) TypeName() string {
	return "inputGroupCallStream"
}

// TypeInfo returns info about TL type.
func (i *InputGroupCallStream) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputGroupCallStream",
		ID:   InputGroupCallStreamTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Call",
			SchemaName: "call",
		},
		{
			Name:       "TimeMs",
			SchemaName: "time_ms",
		},
		{
			Name:       "Scale",
			SchemaName: "scale",
		},
		{
			Name:       "VideoChannel",
			SchemaName: "video_channel",
			Null:       !i.Flags.Has(0),
		},
		{
			Name:       "VideoQuality",
			SchemaName: "video_quality",
			Null:       !i.Flags.Has(0),
		},
	}
	return typ
}

// SetFlags sets flags for non-zero fields.
func (i *InputGroupCallStream) SetFlags() {
	if !(i.VideoChannel == 0) {
		i.Flags.Set(0)
	}
	if !(i.VideoQuality == 0) {
		i.Flags.Set(0)
	}
}

// Encode implements bin.Encoder.
func (i *InputGroupCallStream) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputGroupCallStream#598a92a as nil")
	}
	b.PutID(InputGroupCallStreamTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputGroupCallStream) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputGroupCallStream#598a92a as nil")
	}
	i.SetFlags()
	if err := i.Flags.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputGroupCallStream#598a92a: field flags: %w", err)
	}
	if i.Call == nil {
		return fmt.Errorf("unable to encode inputGroupCallStream#598a92a: field call is nil")
	}
	if err := i.Call.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputGroupCallStream#598a92a: field call: %w", err)
	}
	b.PutLong(i.TimeMs)
	b.PutInt(i.Scale)
	if i.Flags.Has(0) {
		b.PutInt(i.VideoChannel)
	}
	if i.Flags.Has(0) {
		b.PutInt(i.VideoQuality)
	}
	return nil
}

// Decode implements bin.Decoder.
func (i *InputGroupCallStream) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputGroupCallStream#598a92a to nil")
	}
	if err := b.ConsumeID(InputGroupCallStreamTypeID); err != nil {
		return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputGroupCallStream) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputGroupCallStream#598a92a to nil")
	}
	{
		if err := i.Flags.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field flags: %w", err)
		}
	}
	{
		value, err := DecodeInputGroupCall(b)
		if err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field call: %w", err)
		}
		i.Call = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field time_ms: %w", err)
		}
		i.TimeMs = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field scale: %w", err)
		}
		i.Scale = value
	}
	if i.Flags.Has(0) {
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field video_channel: %w", err)
		}
		i.VideoChannel = value
	}
	if i.Flags.Has(0) {
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputGroupCallStream#598a92a: field video_quality: %w", err)
		}
		i.VideoQuality = value
	}
	return nil
}

// GetCall returns value of Call field.
func (i *InputGroupCallStream) GetCall() (value InputGroupCallClass) {
	if i == nil {
		return
	}
	return i.Call
}

// GetTimeMs returns value of TimeMs field.
func (i *InputGroupCallStream) GetTimeMs() (value int64) {
	if i == nil {
		return
	}
	return i.TimeMs
}

// GetScale returns value of Scale field.
func (i *InputGroupCallStream) GetScale() (value int) {
	if i == nil {
		return
	}
	return i.Scale
}

// SetVideoChannel sets value of VideoChannel conditional field.
func (i *InputGroupCallStream) SetVideoChannel(value int) {
	i.Flags.Set(0)
	i.VideoChannel = value
}

// GetVideoChannel returns value of VideoChannel conditional field and
// boolean which is true if field was set.
func (i *InputGroupCallStream) GetVideoChannel() (value int, ok bool) {
	if i == nil {
		return
	}
	if !i.Flags.Has(0) {
		return value, false
	}
	return i.VideoChannel, true
}

// SetVideoQuality sets value of VideoQuality conditional field.
func (i *InputGroupCallStream) SetVideoQuality(value int) {
	i.Flags.Set(0)
	i.VideoQuality = value
}

// GetVideoQuality returns value of VideoQuality conditional field and
// boolean which is true if field was set.
func (i *InputGroupCallStream) GetVideoQuality() (value int, ok bool) {
	if i == nil {
		return
	}
	if !i.Flags.Has(0) {
		return value, false
	}
	return i.VideoQuality, true
}

// InputPeerPhotoFileLocationLegacy represents TL type `inputPeerPhotoFileLocationLegacy#27d69997`.
//
// See https://core.telegram.org/constructor/inputPeerPhotoFileLocationLegacy for reference.
type InputPeerPhotoFileLocationLegacy struct {
	// Flags field of InputPeerPhotoFileLocationLegacy.
	Flags bin.Fields
	// Big field of InputPeerPhotoFileLocationLegacy.
	Big bool
	// Peer field of InputPeerPhotoFileLocationLegacy.
	Peer InputPeerClass
	// VolumeID field of InputPeerPhotoFileLocationLegacy.
	VolumeID int64
	// LocalID field of InputPeerPhotoFileLocationLegacy.
	LocalID int
}

// InputPeerPhotoFileLocationLegacyTypeID is TL type id of InputPeerPhotoFileLocationLegacy.
const InputPeerPhotoFileLocationLegacyTypeID = 0x27d69997

// construct implements constructor of InputFileLocationClass.
func (i InputPeerPhotoFileLocationLegacy) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputPeerPhotoFileLocationLegacy.
var (
	_ bin.Encoder     = &InputPeerPhotoFileLocationLegacy{}
	_ bin.Decoder     = &InputPeerPhotoFileLocationLegacy{}
	_ bin.BareEncoder = &InputPeerPhotoFileLocationLegacy{}
	_ bin.BareDecoder = &InputPeerPhotoFileLocationLegacy{}

	_ InputFileLocationClass = &InputPeerPhotoFileLocationLegacy{}
)

func (i *InputPeerPhotoFileLocationLegacy) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Flags.Zero()) {
		return false
	}
	if !(i.Big == false) {
		return false
	}
	if !(i.Peer == nil) {
		return false
	}
	if !(i.VolumeID == 0) {
		return false
	}
	if !(i.LocalID == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputPeerPhotoFileLocationLegacy) String() string {
	if i == nil {
		return "InputPeerPhotoFileLocationLegacy(nil)"
	}
	type Alias InputPeerPhotoFileLocationLegacy
	return fmt.Sprintf("InputPeerPhotoFileLocationLegacy%+v", Alias(*i))
}

// FillFrom fills InputPeerPhotoFileLocationLegacy from given interface.
func (i *InputPeerPhotoFileLocationLegacy) FillFrom(from interface {
	GetBig() (value bool)
	GetPeer() (value InputPeerClass)
	GetVolumeID() (value int64)
	GetLocalID() (value int)
}) {
	i.Big = from.GetBig()
	i.Peer = from.GetPeer()
	i.VolumeID = from.GetVolumeID()
	i.LocalID = from.GetLocalID()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputPeerPhotoFileLocationLegacy) TypeID() uint32 {
	return InputPeerPhotoFileLocationLegacyTypeID
}

// TypeName returns name of type in TL schema.
func (*InputPeerPhotoFileLocationLegacy) TypeName() string {
	return "inputPeerPhotoFileLocationLegacy"
}

// TypeInfo returns info about TL type.
func (i *InputPeerPhotoFileLocationLegacy) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPeerPhotoFileLocationLegacy",
		ID:   InputPeerPhotoFileLocationLegacyTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Big",
			SchemaName: "big",
			Null:       !i.Flags.Has(0),
		},
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "VolumeID",
			SchemaName: "volume_id",
		},
		{
			Name:       "LocalID",
			SchemaName: "local_id",
		},
	}
	return typ
}

// SetFlags sets flags for non-zero fields.
func (i *InputPeerPhotoFileLocationLegacy) SetFlags() {
	if !(i.Big == false) {
		i.Flags.Set(0)
	}
}

// Encode implements bin.Encoder.
func (i *InputPeerPhotoFileLocationLegacy) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPeerPhotoFileLocationLegacy#27d69997 as nil")
	}
	b.PutID(InputPeerPhotoFileLocationLegacyTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPeerPhotoFileLocationLegacy) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPeerPhotoFileLocationLegacy#27d69997 as nil")
	}
	i.SetFlags()
	if err := i.Flags.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocationLegacy#27d69997: field flags: %w", err)
	}
	if i.Peer == nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocationLegacy#27d69997: field peer is nil")
	}
	if err := i.Peer.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPeerPhotoFileLocationLegacy#27d69997: field peer: %w", err)
	}
	b.PutLong(i.VolumeID)
	b.PutInt(i.LocalID)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputPeerPhotoFileLocationLegacy) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPeerPhotoFileLocationLegacy#27d69997 to nil")
	}
	if err := b.ConsumeID(InputPeerPhotoFileLocationLegacyTypeID); err != nil {
		return fmt.Errorf("unable to decode inputPeerPhotoFileLocationLegacy#27d69997: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputPeerPhotoFileLocationLegacy) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPeerPhotoFileLocationLegacy#27d69997 to nil")
	}
	{
		if err := i.Flags.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocationLegacy#27d69997: field flags: %w", err)
		}
	}
	i.Big = i.Flags.Has(0)
	{
		value, err := DecodeInputPeer(b)
		if err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocationLegacy#27d69997: field peer: %w", err)
		}
		i.Peer = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocationLegacy#27d69997: field volume_id: %w", err)
		}
		i.VolumeID = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputPeerPhotoFileLocationLegacy#27d69997: field local_id: %w", err)
		}
		i.LocalID = value
	}
	return nil
}

// SetBig sets value of Big conditional field.
func (i *InputPeerPhotoFileLocationLegacy) SetBig(value bool) {
	if value {
		i.Flags.Set(0)
		i.Big = true
	} else {
		i.Flags.Unset(0)
		i.Big = false
	}
}

// GetBig returns value of Big conditional field.
func (i *InputPeerPhotoFileLocationLegacy) GetBig() (value bool) {
	if i == nil {
		return
	}
	return i.Flags.Has(0)
}

// GetPeer returns value of Peer field.
func (i *InputPeerPhotoFileLocationLegacy) GetPeer() (value InputPeerClass) {
	if i == nil {
		return
	}
	return i.Peer
}

// GetVolumeID returns value of VolumeID field.
func (i *InputPeerPhotoFileLocationLegacy) GetVolumeID() (value int64) {
	if i == nil {
		return
	}
	return i.VolumeID
}

// GetLocalID returns value of LocalID field.
func (i *InputPeerPhotoFileLocationLegacy) GetLocalID() (value int) {
	if i == nil {
		return
	}
	return i.LocalID
}

// InputStickerSetThumbLegacy represents TL type `inputStickerSetThumbLegacy#dbaeae9`.
//
// See https://core.telegram.org/constructor/inputStickerSetThumbLegacy for reference.
type InputStickerSetThumbLegacy struct {
	// Stickerset field of InputStickerSetThumbLegacy.
	Stickerset InputStickerSetClass
	// VolumeID field of InputStickerSetThumbLegacy.
	VolumeID int64
	// LocalID field of InputStickerSetThumbLegacy.
	LocalID int
}

// InputStickerSetThumbLegacyTypeID is TL type id of InputStickerSetThumbLegacy.
const InputStickerSetThumbLegacyTypeID = 0xdbaeae9

// construct implements constructor of InputFileLocationClass.
func (i InputStickerSetThumbLegacy) construct() InputFileLocationClass { return &i }

// Ensuring interfaces in compile-time for InputStickerSetThumbLegacy.
var (
	_ bin.Encoder     = &InputStickerSetThumbLegacy{}
	_ bin.Decoder     = &InputStickerSetThumbLegacy{}
	_ bin.BareEncoder = &InputStickerSetThumbLegacy{}
	_ bin.BareDecoder = &InputStickerSetThumbLegacy{}

	_ InputFileLocationClass = &InputStickerSetThumbLegacy{}
)

func (i *InputStickerSetThumbLegacy) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Stickerset == nil) {
		return false
	}
	if !(i.VolumeID == 0) {
		return false
	}
	if !(i.LocalID == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (i *InputStickerSetThumbLegacy) String() string {
	if i == nil {
		return "InputStickerSetThumbLegacy(nil)"
	}
	type Alias InputStickerSetThumbLegacy
	return fmt.Sprintf("InputStickerSetThumbLegacy%+v", Alias(*i))
}

// FillFrom fills InputStickerSetThumbLegacy from given interface.
func (i *InputStickerSetThumbLegacy) FillFrom(from interface {
	GetStickerset() (value InputStickerSetClass)
	GetVolumeID() (value int64)
	GetLocalID() (value int)
}) {
	i.Stickerset = from.GetStickerset()
	i.VolumeID = from.GetVolumeID()
	i.LocalID = from.GetLocalID()
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*InputStickerSetThumbLegacy) TypeID() uint32 {
	return InputStickerSetThumbLegacyTypeID
}

// TypeName returns name of type in TL schema.
func (*InputStickerSetThumbLegacy) TypeName() string {
	return "inputStickerSetThumbLegacy"
}

// TypeInfo returns info about TL type.
func (i *InputStickerSetThumbLegacy) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputStickerSetThumbLegacy",
		ID:   InputStickerSetThumbLegacyTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Stickerset",
			SchemaName: "stickerset",
		},
		{
			Name:       "VolumeID",
			SchemaName: "volume_id",
		},
		{
			Name:       "LocalID",
			SchemaName: "local_id",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputStickerSetThumbLegacy) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputStickerSetThumbLegacy#dbaeae9 as nil")
	}
	b.PutID(InputStickerSetThumbLegacyTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputStickerSetThumbLegacy) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputStickerSetThumbLegacy#dbaeae9 as nil")
	}
	if i.Stickerset == nil {
		return fmt.Errorf("unable to encode inputStickerSetThumbLegacy#dbaeae9: field stickerset is nil")
	}
	if err := i.Stickerset.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputStickerSetThumbLegacy#dbaeae9: field stickerset: %w", err)
	}
	b.PutLong(i.VolumeID)
	b.PutInt(i.LocalID)
	return nil
}

// Decode implements bin.Decoder.
func (i *InputStickerSetThumbLegacy) Decode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputStickerSetThumbLegacy#dbaeae9 to nil")
	}
	if err := b.ConsumeID(InputStickerSetThumbLegacyTypeID); err != nil {
		return fmt.Errorf("unable to decode inputStickerSetThumbLegacy#dbaeae9: %w", err)
	}
	return i.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (i *InputStickerSetThumbLegacy) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputStickerSetThumbLegacy#dbaeae9 to nil")
	}
	{
		value, err := DecodeInputStickerSet(b)
		if err != nil {
			return fmt.Errorf("unable to decode inputStickerSetThumbLegacy#dbaeae9: field stickerset: %w", err)
		}
		i.Stickerset = value
	}
	{
		value, err := b.Long()
		if err != nil {
			return fmt.Errorf("unable to decode inputStickerSetThumbLegacy#dbaeae9: field volume_id: %w", err)
		}
		i.VolumeID = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode inputStickerSetThumbLegacy#dbaeae9: field local_id: %w", err)
		}
		i.LocalID = value
	}
	return nil
}

// GetStickerset returns value of Stickerset field.
func (i *InputStickerSetThumbLegacy) GetStickerset() (value InputStickerSetClass) {
	if i == nil {
		return
	}
	return i.Stickerset
}

// GetVolumeID returns value of VolumeID field.
func (i *InputStickerSetThumbLegacy) GetVolumeID() (value int64) {
	if i == nil {
		return
	}
	return i.VolumeID
}

// GetLocalID returns value of LocalID field.
func (i *InputStickerSetThumbLegacy) GetLocalID() (value int) {
	if i == nil {
		return
	}
	return i.LocalID
}

// InputFileLocationClassName is schema name of InputFileLocationClass.
const InputFileLocationClassName = "InputFileLocation"

// InputFileLocationClass represents InputFileLocation generic type.
//
// See https://core.telegram.org/type/InputFileLocation for reference.
//
// Example:
//
//	g, err := tg.DecodeInputFileLocation(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *tg.InputFileLocation: // inputFileLocation#dfdaabe1
//	case *tg.InputEncryptedFileLocation: // inputEncryptedFileLocation#f5235d55
//	case *tg.InputDocumentFileLocation: // inputDocumentFileLocation#bad07584
//	case *tg.InputSecureFileLocation: // inputSecureFileLocation#cbc7ee28
//	case *tg.InputTakeoutFileLocation: // inputTakeoutFileLocation#29be5899
//	case *tg.InputPhotoFileLocation: // inputPhotoFileLocation#40181ffe
//	case *tg.InputPhotoLegacyFileLocation: // inputPhotoLegacyFileLocation#d83466f3
//	case *tg.InputPeerPhotoFileLocation: // inputPeerPhotoFileLocation#37257e99
//	case *tg.InputStickerSetThumb: // inputStickerSetThumb#9d84f3db
//	case *tg.InputGroupCallStream: // inputGroupCallStream#598a92a
//	case *tg.InputPeerPhotoFileLocationLegacy: // inputPeerPhotoFileLocationLegacy#27d69997
//	case *tg.InputStickerSetThumbLegacy: // inputStickerSetThumbLegacy#dbaeae9
//	default: panic(v)
//	}
type InputFileLocationClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() InputFileLocationClass

	// TypeID returns type id in TL schema.
	//
	// See https://core.telegram.org/mtproto/TL-tl#remarks.
	TypeID() uint32
	// TypeName returns name of type in TL schema.
	TypeName() string
	// String implements fmt.Stringer.
	String() string
	// Zero returns true if current object has a zero value.
	Zero() bool
}

// DecodeInputFileLocation implements binary de-serialization for InputFileLocationClass.
func DecodeInputFileLocation(buf *bin.Buffer) (InputFileLocationClass, error) {
	id, err := buf.PeekID()
	if err != nil {
		return nil, err
	}
	switch id {
	case InputFileLocationTypeID:
		// Decoding inputFileLocation#dfdaabe1.
		v := InputFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputEncryptedFileLocationTypeID:
		// Decoding inputEncryptedFileLocation#f5235d55.
		v := InputEncryptedFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputDocumentFileLocationTypeID:
		// Decoding inputDocumentFileLocation#bad07584.
		v := InputDocumentFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputSecureFileLocationTypeID:
		// Decoding inputSecureFileLocation#cbc7ee28.
		v := InputSecureFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputTakeoutFileLocationTypeID:
		// Decoding inputTakeoutFileLocation#29be5899.
		v := InputTakeoutFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputPhotoFileLocationTypeID:
		// Decoding inputPhotoFileLocation#40181ffe.
		v := InputPhotoFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputPhotoLegacyFileLocationTypeID:
		// Decoding inputPhotoLegacyFileLocation#d83466f3.
		v := InputPhotoLegacyFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputPeerPhotoFileLocationTypeID:
		// Decoding inputPeerPhotoFileLocation#37257e99.
		v := InputPeerPhotoFileLocation{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputStickerSetThumbTypeID:
		// Decoding inputStickerSetThumb#9d84f3db.
		v := InputStickerSetThumb{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputGroupCallStreamTypeID:
		// Decoding inputGroupCallStream#598a92a.
		v := InputGroupCallStream{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputPeerPhotoFileLocationLegacyTypeID:
		// Decoding inputPeerPhotoFileLocationLegacy#27d69997.
		v := InputPeerPhotoFileLocationLegacy{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	case InputStickerSetThumbLegacyTypeID:
		// Decoding inputStickerSetThumbLegacy#dbaeae9.
		v := InputStickerSetThumbLegacy{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode InputFileLocationClass: %w", bin.NewUnexpectedID(id))
	}
}

// InputFileLocation boxes the InputFileLocationClass providing a helper.
type InputFileLocationBox struct {
	InputFileLocation InputFileLocationClass
}

// Decode implements bin.Decoder for InputFileLocationBox.
func (b *InputFileLocationBox) Decode(buf *bin.Buffer) error {
	if b == nil {
		return fmt.Errorf("unable to decode InputFileLocationBox to nil")
	}
	v, err := DecodeInputFileLocation(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.InputFileLocation = v
	return nil
}

// Encode implements bin.Encode for InputFileLocationBox.
func (b *InputFileLocationBox) Encode(buf *bin.Buffer) error {
	if b == nil || b.InputFileLocation == nil {
		return fmt.Errorf("unable to encode InputFileLocationClass as nil")
	}
	return b.InputFileLocation.Encode(buf)
}
