// Code generated by gotdgen, DO NOT EDIT.

package tdapi

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{}
)

// InputPassportElementPersonalDetails represents TL type `inputPassportElementPersonalDetails#9d2843f`.
type InputPassportElementPersonalDetails struct {
	// Personal details of the user
	PersonalDetails PersonalDetails
}

// InputPassportElementPersonalDetailsTypeID is TL type id of InputPassportElementPersonalDetails.
const InputPassportElementPersonalDetailsTypeID = 0x9d2843f

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementPersonalDetails) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementPersonalDetails{}
)

func (i *InputPassportElementPersonalDetails) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.PersonalDetails.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementPersonalDetails) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementPersonalDetails",
		ID:   InputPassportElementPersonalDetailsTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "PersonalDetails",
			SchemaName: "personal_details",
		},
	}
	return typ
}

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

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementPersonalDetails) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPersonalDetails#9d2843f as nil")
	}
	if err := i.PersonalDetails.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPersonalDetails#9d2843f: field personal_details: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementPersonalDetails) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPersonalDetails#9d2843f to nil")
	}
	{
		if err := i.PersonalDetails.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementPersonalDetails#9d2843f: field personal_details: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementPersonalDetails) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPersonalDetails#9d2843f as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementPersonalDetails")
	b.Comma()
	b.FieldStart("personal_details")
	if err := i.PersonalDetails.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPersonalDetails#9d2843f: field personal_details: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementPersonalDetails) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPersonalDetails#9d2843f to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementPersonalDetails"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPersonalDetails#9d2843f: %w", err)
			}
		case "personal_details":
			if err := i.PersonalDetails.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPersonalDetails#9d2843f: field personal_details: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetPersonalDetails returns value of PersonalDetails field.
func (i *InputPassportElementPersonalDetails) GetPersonalDetails() (value PersonalDetails) {
	if i == nil {
		return
	}
	return i.PersonalDetails
}

// InputPassportElementPassport represents TL type `inputPassportElementPassport#e2603564`.
type InputPassportElementPassport struct {
	// The passport to be saved
	Passport InputIdentityDocument
}

// InputPassportElementPassportTypeID is TL type id of InputPassportElementPassport.
const InputPassportElementPassportTypeID = 0xe2603564

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementPassport) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementPassport{}
)

func (i *InputPassportElementPassport) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Passport.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementPassport) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementPassport",
		ID:   InputPassportElementPassportTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Passport",
			SchemaName: "passport",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementPassport) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassport#e2603564 as nil")
	}
	b.PutID(InputPassportElementPassportTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementPassport) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassport#e2603564 as nil")
	}
	if err := i.Passport.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPassport#e2603564: field passport: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementPassport) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPassport#e2603564 to nil")
	}
	{
		if err := i.Passport.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementPassport#e2603564: field passport: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementPassport) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassport#e2603564 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementPassport")
	b.Comma()
	b.FieldStart("passport")
	if err := i.Passport.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPassport#e2603564: field passport: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementPassport) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPassport#e2603564 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementPassport"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPassport#e2603564: %w", err)
			}
		case "passport":
			if err := i.Passport.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPassport#e2603564: field passport: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetPassport returns value of Passport field.
func (i *InputPassportElementPassport) GetPassport() (value InputIdentityDocument) {
	if i == nil {
		return
	}
	return i.Passport
}

// InputPassportElementDriverLicense represents TL type `inputPassportElementDriverLicense#122b14d0`.
type InputPassportElementDriverLicense struct {
	// The driver license to be saved
	DriverLicense InputIdentityDocument
}

// InputPassportElementDriverLicenseTypeID is TL type id of InputPassportElementDriverLicense.
const InputPassportElementDriverLicenseTypeID = 0x122b14d0

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementDriverLicense) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementDriverLicense{}
)

func (i *InputPassportElementDriverLicense) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.DriverLicense.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementDriverLicense) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementDriverLicense",
		ID:   InputPassportElementDriverLicenseTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "DriverLicense",
			SchemaName: "driver_license",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementDriverLicense) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementDriverLicense#122b14d0 as nil")
	}
	b.PutID(InputPassportElementDriverLicenseTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementDriverLicense) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementDriverLicense#122b14d0 as nil")
	}
	if err := i.DriverLicense.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementDriverLicense#122b14d0: field driver_license: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementDriverLicense) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementDriverLicense#122b14d0 to nil")
	}
	{
		if err := i.DriverLicense.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementDriverLicense#122b14d0: field driver_license: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementDriverLicense) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementDriverLicense#122b14d0 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementDriverLicense")
	b.Comma()
	b.FieldStart("driver_license")
	if err := i.DriverLicense.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementDriverLicense#122b14d0: field driver_license: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementDriverLicense) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementDriverLicense#122b14d0 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementDriverLicense"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementDriverLicense#122b14d0: %w", err)
			}
		case "driver_license":
			if err := i.DriverLicense.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementDriverLicense#122b14d0: field driver_license: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetDriverLicense returns value of DriverLicense field.
func (i *InputPassportElementDriverLicense) GetDriverLicense() (value InputIdentityDocument) {
	if i == nil {
		return
	}
	return i.DriverLicense
}

// InputPassportElementIdentityCard represents TL type `inputPassportElementIdentityCard#ff67f882`.
type InputPassportElementIdentityCard struct {
	// The identity card to be saved
	IdentityCard InputIdentityDocument
}

// InputPassportElementIdentityCardTypeID is TL type id of InputPassportElementIdentityCard.
const InputPassportElementIdentityCardTypeID = 0xff67f882

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementIdentityCard) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementIdentityCard{}
)

func (i *InputPassportElementIdentityCard) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.IdentityCard.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementIdentityCard) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementIdentityCard",
		ID:   InputPassportElementIdentityCardTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "IdentityCard",
			SchemaName: "identity_card",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementIdentityCard) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementIdentityCard#ff67f882 as nil")
	}
	b.PutID(InputPassportElementIdentityCardTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementIdentityCard) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementIdentityCard#ff67f882 as nil")
	}
	if err := i.IdentityCard.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementIdentityCard#ff67f882: field identity_card: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementIdentityCard) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementIdentityCard#ff67f882 to nil")
	}
	{
		if err := i.IdentityCard.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementIdentityCard#ff67f882: field identity_card: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementIdentityCard) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementIdentityCard#ff67f882 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementIdentityCard")
	b.Comma()
	b.FieldStart("identity_card")
	if err := i.IdentityCard.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementIdentityCard#ff67f882: field identity_card: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementIdentityCard) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementIdentityCard#ff67f882 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementIdentityCard"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementIdentityCard#ff67f882: %w", err)
			}
		case "identity_card":
			if err := i.IdentityCard.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementIdentityCard#ff67f882: field identity_card: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetIdentityCard returns value of IdentityCard field.
func (i *InputPassportElementIdentityCard) GetIdentityCard() (value InputIdentityDocument) {
	if i == nil {
		return
	}
	return i.IdentityCard
}

// InputPassportElementInternalPassport represents TL type `inputPassportElementInternalPassport#2aa3872b`.
type InputPassportElementInternalPassport struct {
	// The internal passport to be saved
	InternalPassport InputIdentityDocument
}

// InputPassportElementInternalPassportTypeID is TL type id of InputPassportElementInternalPassport.
const InputPassportElementInternalPassportTypeID = 0x2aa3872b

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementInternalPassport) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementInternalPassport{}
)

func (i *InputPassportElementInternalPassport) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.InternalPassport.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementInternalPassport) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementInternalPassport",
		ID:   InputPassportElementInternalPassportTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "InternalPassport",
			SchemaName: "internal_passport",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementInternalPassport) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementInternalPassport#2aa3872b as nil")
	}
	b.PutID(InputPassportElementInternalPassportTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementInternalPassport) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementInternalPassport#2aa3872b as nil")
	}
	if err := i.InternalPassport.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementInternalPassport#2aa3872b: field internal_passport: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementInternalPassport) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementInternalPassport#2aa3872b to nil")
	}
	{
		if err := i.InternalPassport.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementInternalPassport#2aa3872b: field internal_passport: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementInternalPassport) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementInternalPassport#2aa3872b as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementInternalPassport")
	b.Comma()
	b.FieldStart("internal_passport")
	if err := i.InternalPassport.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementInternalPassport#2aa3872b: field internal_passport: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementInternalPassport) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementInternalPassport#2aa3872b to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementInternalPassport"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementInternalPassport#2aa3872b: %w", err)
			}
		case "internal_passport":
			if err := i.InternalPassport.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementInternalPassport#2aa3872b: field internal_passport: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetInternalPassport returns value of InternalPassport field.
func (i *InputPassportElementInternalPassport) GetInternalPassport() (value InputIdentityDocument) {
	if i == nil {
		return
	}
	return i.InternalPassport
}

// InputPassportElementAddress represents TL type `inputPassportElementAddress#1b83ec10`.
type InputPassportElementAddress struct {
	// The address to be saved
	Address Address
}

// InputPassportElementAddressTypeID is TL type id of InputPassportElementAddress.
const InputPassportElementAddressTypeID = 0x1b83ec10

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementAddress) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementAddress{}
)

func (i *InputPassportElementAddress) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.Address.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementAddress) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementAddress",
		ID:   InputPassportElementAddressTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Address",
			SchemaName: "address",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementAddress) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementAddress#1b83ec10 as nil")
	}
	b.PutID(InputPassportElementAddressTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementAddress) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementAddress#1b83ec10 as nil")
	}
	if err := i.Address.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementAddress#1b83ec10: field address: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementAddress) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementAddress#1b83ec10 to nil")
	}
	{
		if err := i.Address.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementAddress#1b83ec10: field address: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementAddress) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementAddress#1b83ec10 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementAddress")
	b.Comma()
	b.FieldStart("address")
	if err := i.Address.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementAddress#1b83ec10: field address: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementAddress) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementAddress#1b83ec10 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementAddress"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementAddress#1b83ec10: %w", err)
			}
		case "address":
			if err := i.Address.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementAddress#1b83ec10: field address: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetAddress returns value of Address field.
func (i *InputPassportElementAddress) GetAddress() (value Address) {
	if i == nil {
		return
	}
	return i.Address
}

// InputPassportElementUtilityBill represents TL type `inputPassportElementUtilityBill#52cd9181`.
type InputPassportElementUtilityBill struct {
	// The utility bill to be saved
	UtilityBill InputPersonalDocument
}

// InputPassportElementUtilityBillTypeID is TL type id of InputPassportElementUtilityBill.
const InputPassportElementUtilityBillTypeID = 0x52cd9181

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementUtilityBill) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementUtilityBill{}
)

func (i *InputPassportElementUtilityBill) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.UtilityBill.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementUtilityBill) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementUtilityBill",
		ID:   InputPassportElementUtilityBillTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "UtilityBill",
			SchemaName: "utility_bill",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementUtilityBill) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementUtilityBill#52cd9181 as nil")
	}
	b.PutID(InputPassportElementUtilityBillTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementUtilityBill) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementUtilityBill#52cd9181 as nil")
	}
	if err := i.UtilityBill.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementUtilityBill#52cd9181: field utility_bill: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementUtilityBill) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementUtilityBill#52cd9181 to nil")
	}
	{
		if err := i.UtilityBill.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementUtilityBill#52cd9181: field utility_bill: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementUtilityBill) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementUtilityBill#52cd9181 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementUtilityBill")
	b.Comma()
	b.FieldStart("utility_bill")
	if err := i.UtilityBill.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementUtilityBill#52cd9181: field utility_bill: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementUtilityBill) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementUtilityBill#52cd9181 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementUtilityBill"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementUtilityBill#52cd9181: %w", err)
			}
		case "utility_bill":
			if err := i.UtilityBill.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementUtilityBill#52cd9181: field utility_bill: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetUtilityBill returns value of UtilityBill field.
func (i *InputPassportElementUtilityBill) GetUtilityBill() (value InputPersonalDocument) {
	if i == nil {
		return
	}
	return i.UtilityBill
}

// InputPassportElementBankStatement represents TL type `inputPassportElementBankStatement#fe6a5788`.
type InputPassportElementBankStatement struct {
	// The bank statement to be saved
	BankStatement InputPersonalDocument
}

// InputPassportElementBankStatementTypeID is TL type id of InputPassportElementBankStatement.
const InputPassportElementBankStatementTypeID = 0xfe6a5788

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementBankStatement) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementBankStatement{}
)

func (i *InputPassportElementBankStatement) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.BankStatement.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementBankStatement) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementBankStatement",
		ID:   InputPassportElementBankStatementTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "BankStatement",
			SchemaName: "bank_statement",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementBankStatement) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementBankStatement#fe6a5788 as nil")
	}
	b.PutID(InputPassportElementBankStatementTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementBankStatement) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementBankStatement#fe6a5788 as nil")
	}
	if err := i.BankStatement.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementBankStatement#fe6a5788: field bank_statement: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementBankStatement) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementBankStatement#fe6a5788 to nil")
	}
	{
		if err := i.BankStatement.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementBankStatement#fe6a5788: field bank_statement: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementBankStatement) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementBankStatement#fe6a5788 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementBankStatement")
	b.Comma()
	b.FieldStart("bank_statement")
	if err := i.BankStatement.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementBankStatement#fe6a5788: field bank_statement: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementBankStatement) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementBankStatement#fe6a5788 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementBankStatement"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementBankStatement#fe6a5788: %w", err)
			}
		case "bank_statement":
			if err := i.BankStatement.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementBankStatement#fe6a5788: field bank_statement: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetBankStatement returns value of BankStatement field.
func (i *InputPassportElementBankStatement) GetBankStatement() (value InputPersonalDocument) {
	if i == nil {
		return
	}
	return i.BankStatement
}

// InputPassportElementRentalAgreement represents TL type `inputPassportElementRentalAgreement#677b9c2b`.
type InputPassportElementRentalAgreement struct {
	// The rental agreement to be saved
	RentalAgreement InputPersonalDocument
}

// InputPassportElementRentalAgreementTypeID is TL type id of InputPassportElementRentalAgreement.
const InputPassportElementRentalAgreementTypeID = 0x677b9c2b

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementRentalAgreement) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementRentalAgreement{}
)

func (i *InputPassportElementRentalAgreement) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.RentalAgreement.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementRentalAgreement) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementRentalAgreement",
		ID:   InputPassportElementRentalAgreementTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "RentalAgreement",
			SchemaName: "rental_agreement",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementRentalAgreement) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementRentalAgreement#677b9c2b as nil")
	}
	b.PutID(InputPassportElementRentalAgreementTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementRentalAgreement) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementRentalAgreement#677b9c2b as nil")
	}
	if err := i.RentalAgreement.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementRentalAgreement#677b9c2b: field rental_agreement: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementRentalAgreement) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementRentalAgreement#677b9c2b to nil")
	}
	{
		if err := i.RentalAgreement.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementRentalAgreement#677b9c2b: field rental_agreement: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementRentalAgreement) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementRentalAgreement#677b9c2b as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementRentalAgreement")
	b.Comma()
	b.FieldStart("rental_agreement")
	if err := i.RentalAgreement.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementRentalAgreement#677b9c2b: field rental_agreement: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementRentalAgreement) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementRentalAgreement#677b9c2b to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementRentalAgreement"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementRentalAgreement#677b9c2b: %w", err)
			}
		case "rental_agreement":
			if err := i.RentalAgreement.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementRentalAgreement#677b9c2b: field rental_agreement: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetRentalAgreement returns value of RentalAgreement field.
func (i *InputPassportElementRentalAgreement) GetRentalAgreement() (value InputPersonalDocument) {
	if i == nil {
		return
	}
	return i.RentalAgreement
}

// InputPassportElementPassportRegistration represents TL type `inputPassportElementPassportRegistration#4e5aa050`.
type InputPassportElementPassportRegistration struct {
	// The passport registration page to be saved
	PassportRegistration InputPersonalDocument
}

// InputPassportElementPassportRegistrationTypeID is TL type id of InputPassportElementPassportRegistration.
const InputPassportElementPassportRegistrationTypeID = 0x4e5aa050

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementPassportRegistration) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementPassportRegistration{}
)

func (i *InputPassportElementPassportRegistration) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.PassportRegistration.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementPassportRegistration) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementPassportRegistration",
		ID:   InputPassportElementPassportRegistrationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "PassportRegistration",
			SchemaName: "passport_registration",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementPassportRegistration) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassportRegistration#4e5aa050 as nil")
	}
	b.PutID(InputPassportElementPassportRegistrationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementPassportRegistration) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassportRegistration#4e5aa050 as nil")
	}
	if err := i.PassportRegistration.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPassportRegistration#4e5aa050: field passport_registration: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementPassportRegistration) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPassportRegistration#4e5aa050 to nil")
	}
	{
		if err := i.PassportRegistration.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementPassportRegistration#4e5aa050: field passport_registration: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementPassportRegistration) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPassportRegistration#4e5aa050 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementPassportRegistration")
	b.Comma()
	b.FieldStart("passport_registration")
	if err := i.PassportRegistration.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementPassportRegistration#4e5aa050: field passport_registration: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementPassportRegistration) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPassportRegistration#4e5aa050 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementPassportRegistration"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPassportRegistration#4e5aa050: %w", err)
			}
		case "passport_registration":
			if err := i.PassportRegistration.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPassportRegistration#4e5aa050: field passport_registration: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetPassportRegistration returns value of PassportRegistration field.
func (i *InputPassportElementPassportRegistration) GetPassportRegistration() (value InputPersonalDocument) {
	if i == nil {
		return
	}
	return i.PassportRegistration
}

// InputPassportElementTemporaryRegistration represents TL type `inputPassportElementTemporaryRegistration#8df64de1`.
type InputPassportElementTemporaryRegistration struct {
	// The temporary registration document to be saved
	TemporaryRegistration InputPersonalDocument
}

// InputPassportElementTemporaryRegistrationTypeID is TL type id of InputPassportElementTemporaryRegistration.
const InputPassportElementTemporaryRegistrationTypeID = 0x8df64de1

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementTemporaryRegistration) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementTemporaryRegistration{}
)

func (i *InputPassportElementTemporaryRegistration) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.TemporaryRegistration.Zero()) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementTemporaryRegistration) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementTemporaryRegistration",
		ID:   InputPassportElementTemporaryRegistrationTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "TemporaryRegistration",
			SchemaName: "temporary_registration",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementTemporaryRegistration) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementTemporaryRegistration#8df64de1 as nil")
	}
	b.PutID(InputPassportElementTemporaryRegistrationTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementTemporaryRegistration) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementTemporaryRegistration#8df64de1 as nil")
	}
	if err := i.TemporaryRegistration.Encode(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementTemporaryRegistration#8df64de1: field temporary_registration: %w", err)
	}
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementTemporaryRegistration) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementTemporaryRegistration#8df64de1 to nil")
	}
	{
		if err := i.TemporaryRegistration.Decode(b); err != nil {
			return fmt.Errorf("unable to decode inputPassportElementTemporaryRegistration#8df64de1: field temporary_registration: %w", err)
		}
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementTemporaryRegistration) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementTemporaryRegistration#8df64de1 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementTemporaryRegistration")
	b.Comma()
	b.FieldStart("temporary_registration")
	if err := i.TemporaryRegistration.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode inputPassportElementTemporaryRegistration#8df64de1: field temporary_registration: %w", err)
	}
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementTemporaryRegistration) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementTemporaryRegistration#8df64de1 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementTemporaryRegistration"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementTemporaryRegistration#8df64de1: %w", err)
			}
		case "temporary_registration":
			if err := i.TemporaryRegistration.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementTemporaryRegistration#8df64de1: field temporary_registration: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetTemporaryRegistration returns value of TemporaryRegistration field.
func (i *InputPassportElementTemporaryRegistration) GetTemporaryRegistration() (value InputPersonalDocument) {
	if i == nil {
		return
	}
	return i.TemporaryRegistration
}

// InputPassportElementPhoneNumber represents TL type `inputPassportElementPhoneNumber#4ea3cc39`.
type InputPassportElementPhoneNumber struct {
	// The phone number to be saved
	PhoneNumber string
}

// InputPassportElementPhoneNumberTypeID is TL type id of InputPassportElementPhoneNumber.
const InputPassportElementPhoneNumberTypeID = 0x4ea3cc39

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementPhoneNumber) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementPhoneNumber{}
)

func (i *InputPassportElementPhoneNumber) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.PhoneNumber == "") {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementPhoneNumber) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementPhoneNumber",
		ID:   InputPassportElementPhoneNumberTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "PhoneNumber",
			SchemaName: "phone_number",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementPhoneNumber) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPhoneNumber#4ea3cc39 as nil")
	}
	b.PutID(InputPassportElementPhoneNumberTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementPhoneNumber) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPhoneNumber#4ea3cc39 as nil")
	}
	b.PutString(i.PhoneNumber)
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementPhoneNumber) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPhoneNumber#4ea3cc39 to nil")
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode inputPassportElementPhoneNumber#4ea3cc39: field phone_number: %w", err)
		}
		i.PhoneNumber = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementPhoneNumber) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementPhoneNumber#4ea3cc39 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementPhoneNumber")
	b.Comma()
	b.FieldStart("phone_number")
	b.PutString(i.PhoneNumber)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementPhoneNumber) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementPhoneNumber#4ea3cc39 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementPhoneNumber"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPhoneNumber#4ea3cc39: %w", err)
			}
		case "phone_number":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode inputPassportElementPhoneNumber#4ea3cc39: field phone_number: %w", err)
			}
			i.PhoneNumber = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetPhoneNumber returns value of PhoneNumber field.
func (i *InputPassportElementPhoneNumber) GetPhoneNumber() (value string) {
	if i == nil {
		return
	}
	return i.PhoneNumber
}

// InputPassportElementEmailAddress represents TL type `inputPassportElementEmailAddress#f12e9425`.
type InputPassportElementEmailAddress struct {
	// The email address to be saved
	EmailAddress string
}

// InputPassportElementEmailAddressTypeID is TL type id of InputPassportElementEmailAddress.
const InputPassportElementEmailAddressTypeID = 0xf12e9425

// construct implements constructor of InputPassportElementClass.
func (i InputPassportElementEmailAddress) construct() InputPassportElementClass { return &i }

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

	_ InputPassportElementClass = &InputPassportElementEmailAddress{}
)

func (i *InputPassportElementEmailAddress) Zero() bool {
	if i == nil {
		return true
	}
	if !(i.EmailAddress == "") {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (i *InputPassportElementEmailAddress) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "inputPassportElementEmailAddress",
		ID:   InputPassportElementEmailAddressTypeID,
	}
	if i == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "EmailAddress",
			SchemaName: "email_address",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (i *InputPassportElementEmailAddress) Encode(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementEmailAddress#f12e9425 as nil")
	}
	b.PutID(InputPassportElementEmailAddressTypeID)
	return i.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (i *InputPassportElementEmailAddress) EncodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementEmailAddress#f12e9425 as nil")
	}
	b.PutString(i.EmailAddress)
	return nil
}

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

// DecodeBare implements bin.BareDecoder.
func (i *InputPassportElementEmailAddress) DecodeBare(b *bin.Buffer) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementEmailAddress#f12e9425 to nil")
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode inputPassportElementEmailAddress#f12e9425: field email_address: %w", err)
		}
		i.EmailAddress = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (i *InputPassportElementEmailAddress) EncodeTDLibJSON(b tdjson.Encoder) error {
	if i == nil {
		return fmt.Errorf("can't encode inputPassportElementEmailAddress#f12e9425 as nil")
	}
	b.ObjStart()
	b.PutID("inputPassportElementEmailAddress")
	b.Comma()
	b.FieldStart("email_address")
	b.PutString(i.EmailAddress)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (i *InputPassportElementEmailAddress) DecodeTDLibJSON(b tdjson.Decoder) error {
	if i == nil {
		return fmt.Errorf("can't decode inputPassportElementEmailAddress#f12e9425 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("inputPassportElementEmailAddress"); err != nil {
				return fmt.Errorf("unable to decode inputPassportElementEmailAddress#f12e9425: %w", err)
			}
		case "email_address":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode inputPassportElementEmailAddress#f12e9425: field email_address: %w", err)
			}
			i.EmailAddress = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetEmailAddress returns value of EmailAddress field.
func (i *InputPassportElementEmailAddress) GetEmailAddress() (value string) {
	if i == nil {
		return
	}
	return i.EmailAddress
}

// InputPassportElementClassName is schema name of InputPassportElementClass.
const InputPassportElementClassName = "InputPassportElement"

// InputPassportElementClass represents InputPassportElement generic type.
//
// Example:
//
//	g, err := tdapi.DecodeInputPassportElement(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *tdapi.InputPassportElementPersonalDetails: // inputPassportElementPersonalDetails#9d2843f
//	case *tdapi.InputPassportElementPassport: // inputPassportElementPassport#e2603564
//	case *tdapi.InputPassportElementDriverLicense: // inputPassportElementDriverLicense#122b14d0
//	case *tdapi.InputPassportElementIdentityCard: // inputPassportElementIdentityCard#ff67f882
//	case *tdapi.InputPassportElementInternalPassport: // inputPassportElementInternalPassport#2aa3872b
//	case *tdapi.InputPassportElementAddress: // inputPassportElementAddress#1b83ec10
//	case *tdapi.InputPassportElementUtilityBill: // inputPassportElementUtilityBill#52cd9181
//	case *tdapi.InputPassportElementBankStatement: // inputPassportElementBankStatement#fe6a5788
//	case *tdapi.InputPassportElementRentalAgreement: // inputPassportElementRentalAgreement#677b9c2b
//	case *tdapi.InputPassportElementPassportRegistration: // inputPassportElementPassportRegistration#4e5aa050
//	case *tdapi.InputPassportElementTemporaryRegistration: // inputPassportElementTemporaryRegistration#8df64de1
//	case *tdapi.InputPassportElementPhoneNumber: // inputPassportElementPhoneNumber#4ea3cc39
//	case *tdapi.InputPassportElementEmailAddress: // inputPassportElementEmailAddress#f12e9425
//	default: panic(v)
//	}
type InputPassportElementClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() InputPassportElementClass

	// 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

	EncodeTDLibJSON(b tdjson.Encoder) error
	DecodeTDLibJSON(b tdjson.Decoder) error
}

// DecodeInputPassportElement implements binary de-serialization for InputPassportElementClass.
func DecodeInputPassportElement(buf *bin.Buffer) (InputPassportElementClass, error) {
	id, err := buf.PeekID()
	if err != nil {
		return nil, err
	}
	switch id {
	case InputPassportElementPersonalDetailsTypeID:
		// Decoding inputPassportElementPersonalDetails#9d2843f.
		v := InputPassportElementPersonalDetails{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementPassportTypeID:
		// Decoding inputPassportElementPassport#e2603564.
		v := InputPassportElementPassport{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementDriverLicenseTypeID:
		// Decoding inputPassportElementDriverLicense#122b14d0.
		v := InputPassportElementDriverLicense{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementIdentityCardTypeID:
		// Decoding inputPassportElementIdentityCard#ff67f882.
		v := InputPassportElementIdentityCard{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementInternalPassportTypeID:
		// Decoding inputPassportElementInternalPassport#2aa3872b.
		v := InputPassportElementInternalPassport{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementAddressTypeID:
		// Decoding inputPassportElementAddress#1b83ec10.
		v := InputPassportElementAddress{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementUtilityBillTypeID:
		// Decoding inputPassportElementUtilityBill#52cd9181.
		v := InputPassportElementUtilityBill{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementBankStatementTypeID:
		// Decoding inputPassportElementBankStatement#fe6a5788.
		v := InputPassportElementBankStatement{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementRentalAgreementTypeID:
		// Decoding inputPassportElementRentalAgreement#677b9c2b.
		v := InputPassportElementRentalAgreement{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementPassportRegistrationTypeID:
		// Decoding inputPassportElementPassportRegistration#4e5aa050.
		v := InputPassportElementPassportRegistration{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementTemporaryRegistrationTypeID:
		// Decoding inputPassportElementTemporaryRegistration#8df64de1.
		v := InputPassportElementTemporaryRegistration{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementPhoneNumberTypeID:
		// Decoding inputPassportElementPhoneNumber#4ea3cc39.
		v := InputPassportElementPhoneNumber{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case InputPassportElementEmailAddressTypeID:
		// Decoding inputPassportElementEmailAddress#f12e9425.
		v := InputPassportElementEmailAddress{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", bin.NewUnexpectedID(id))
	}
}

// DecodeTDLibJSONInputPassportElement implements binary de-serialization for InputPassportElementClass.
func DecodeTDLibJSONInputPassportElement(buf tdjson.Decoder) (InputPassportElementClass, error) {
	id, err := buf.FindTypeID()
	if err != nil {
		return nil, err
	}
	switch id {
	case "inputPassportElementPersonalDetails":
		// Decoding inputPassportElementPersonalDetails#9d2843f.
		v := InputPassportElementPersonalDetails{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementPassport":
		// Decoding inputPassportElementPassport#e2603564.
		v := InputPassportElementPassport{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementDriverLicense":
		// Decoding inputPassportElementDriverLicense#122b14d0.
		v := InputPassportElementDriverLicense{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementIdentityCard":
		// Decoding inputPassportElementIdentityCard#ff67f882.
		v := InputPassportElementIdentityCard{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementInternalPassport":
		// Decoding inputPassportElementInternalPassport#2aa3872b.
		v := InputPassportElementInternalPassport{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementAddress":
		// Decoding inputPassportElementAddress#1b83ec10.
		v := InputPassportElementAddress{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementUtilityBill":
		// Decoding inputPassportElementUtilityBill#52cd9181.
		v := InputPassportElementUtilityBill{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementBankStatement":
		// Decoding inputPassportElementBankStatement#fe6a5788.
		v := InputPassportElementBankStatement{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementRentalAgreement":
		// Decoding inputPassportElementRentalAgreement#677b9c2b.
		v := InputPassportElementRentalAgreement{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementPassportRegistration":
		// Decoding inputPassportElementPassportRegistration#4e5aa050.
		v := InputPassportElementPassportRegistration{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementTemporaryRegistration":
		// Decoding inputPassportElementTemporaryRegistration#8df64de1.
		v := InputPassportElementTemporaryRegistration{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementPhoneNumber":
		// Decoding inputPassportElementPhoneNumber#4ea3cc39.
		v := InputPassportElementPhoneNumber{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	case "inputPassportElementEmailAddress":
		// Decoding inputPassportElementEmailAddress#f12e9425.
		v := InputPassportElementEmailAddress{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode InputPassportElementClass: %w", tdjson.NewUnexpectedID(id))
	}
}

// InputPassportElement boxes the InputPassportElementClass providing a helper.
type InputPassportElementBox struct {
	InputPassportElement InputPassportElementClass
}

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

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

// DecodeTDLibJSON implements bin.Decoder for InputPassportElementBox.
func (b *InputPassportElementBox) DecodeTDLibJSON(buf tdjson.Decoder) error {
	if b == nil {
		return fmt.Errorf("unable to decode InputPassportElementBox to nil")
	}
	v, err := DecodeTDLibJSONInputPassportElement(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.InputPassportElement = v
	return nil
}

// EncodeTDLibJSON implements bin.Encode for InputPassportElementBox.
func (b *InputPassportElementBox) EncodeTDLibJSON(buf tdjson.Encoder) error {
	if b == nil || b.InputPassportElement == nil {
		return fmt.Errorf("unable to encode InputPassportElementClass as nil")
	}
	return b.InputPassportElement.EncodeTDLibJSON(buf)
}
