// Code generated by gotdgen, DO NOT EDIT.

package tg

import (
	
	
	
	
	

	

	
	
	
	
)

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

// InputInvoiceMessage represents TL type `inputInvoiceMessage#c5b56859`.
// An invoice contained in a messageMediaInvoice¹ message or paid media »².
//
// Links:
//  1. https://core.telegram.org/constructor/messageMediaInvoice
//  2. https://core.telegram.org/api/paid-media
//
// See https://core.telegram.org/constructor/inputInvoiceMessage for reference.
type InputInvoiceMessage struct {
	// Chat where the invoice/paid media was sent
	Peer InputPeerClass
	// Message ID
	MsgID int
}

// InputInvoiceMessageTypeID is TL type id of InputInvoiceMessage.
const InputInvoiceMessageTypeID = 0xc5b56859

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceMessage) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceMessage{}
)

func ( *InputInvoiceMessage) () bool {
	if  == nil {
		return true
	}
	if !(.Peer == nil) {
		return false
	}
	if !(.MsgID == 0) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceMessage from given interface.
func ( *InputInvoiceMessage) ( interface {
	() ( InputPeerClass)
	() ( int)
}) {
	.Peer = .()
	.MsgID = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceMessage) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceMessage",
		ID:   InputInvoiceMessageTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "MsgID",
			SchemaName: "msg_id",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceMessage) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceMessage#c5b56859 as nil")
	}
	.PutID(InputInvoiceMessageTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceMessage) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceMessage#c5b56859 as nil")
	}
	if .Peer == nil {
		return fmt.Errorf("unable to encode inputInvoiceMessage#c5b56859: field peer is nil")
	}
	if  := .Peer.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceMessage#c5b56859: field peer: %w", )
	}
	.PutInt(.MsgID)
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceMessage) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceMessage#c5b56859 to nil")
	}
	if  := .ConsumeID(InputInvoiceMessageTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceMessage#c5b56859: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceMessage) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceMessage#c5b56859 to nil")
	}
	{
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceMessage#c5b56859: field peer: %w", )
		}
		.Peer = 
	}
	{
		,  := .Int()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceMessage#c5b56859: field msg_id: %w", )
		}
		.MsgID = 
	}
	return nil
}

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

// GetMsgID returns value of MsgID field.
func ( *InputInvoiceMessage) () ( int) {
	if  == nil {
		return
	}
	return .MsgID
}

// InputInvoiceSlug represents TL type `inputInvoiceSlug#c326caef`.
// An invoice slug taken from an invoice deep link¹ or from the premium_invoice_slug app
// config parameter »²
//
// Links:
//  1. https://core.telegram.org/api/links#invoice-links
//  2. https://core.telegram.org/api/config#premium-invoice-slug
//
// See https://core.telegram.org/constructor/inputInvoiceSlug for reference.
type InputInvoiceSlug struct {
	// The invoice slug
	Slug string
}

// InputInvoiceSlugTypeID is TL type id of InputInvoiceSlug.
const InputInvoiceSlugTypeID = 0xc326caef

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceSlug) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceSlug{}
)

func ( *InputInvoiceSlug) () bool {
	if  == nil {
		return true
	}
	if !(.Slug == "") {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceSlug from given interface.
func ( *InputInvoiceSlug) ( interface {
	() ( string)
}) {
	.Slug = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceSlug) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceSlug",
		ID:   InputInvoiceSlugTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Slug",
			SchemaName: "slug",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceSlug) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceSlug#c326caef as nil")
	}
	.PutID(InputInvoiceSlugTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceSlug) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceSlug#c326caef as nil")
	}
	.PutString(.Slug)
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceSlug) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceSlug#c326caef to nil")
	}
	if  := .ConsumeID(InputInvoiceSlugTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceSlug#c326caef: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceSlug) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceSlug#c326caef to nil")
	}
	{
		,  := .String()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceSlug#c326caef: field slug: %w", )
		}
		.Slug = 
	}
	return nil
}

// GetSlug returns value of Slug field.
func ( *InputInvoiceSlug) () ( string) {
	if  == nil {
		return
	}
	return .Slug
}

// InputInvoicePremiumGiftCode represents TL type `inputInvoicePremiumGiftCode#98986c0d`.
// Used if the user wishes to start a channel/supergroup giveaway¹ or send some
// giftcodes² to members of a channel/supergroup, in exchange for boosts³.
//
// Links:
//  1. https://core.telegram.org/api/giveaways
//  2. https://core.telegram.org/api/giveaways
//  3. https://core.telegram.org/api/boost
//
// See https://core.telegram.org/constructor/inputInvoicePremiumGiftCode for reference.
type InputInvoicePremiumGiftCode struct {
	// Should be populated with inputStorePaymentPremiumGiveaway¹ for giveaways² and
	// inputStorePaymentPremiumGiftCode³ for gifts⁴.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/inputStorePaymentPremiumGiveaway
	//  2) https://core.telegram.org/api/giveaways
	//  3) https://core.telegram.org/constructor/inputStorePaymentPremiumGiftCode
	//  4) https://core.telegram.org/api/giveaways
	Purpose InputStorePaymentPurposeClass
	// Should be populated with one of the giveaway options returned by payments
	// getPremiumGiftCodeOptions¹, see the giveaways »² documentation for more info.
	//
	// Links:
	//  1) https://core.telegram.org/method/payments.getPremiumGiftCodeOptions
	//  2) https://core.telegram.org/api/giveaways
	Option PremiumGiftCodeOption
}

// InputInvoicePremiumGiftCodeTypeID is TL type id of InputInvoicePremiumGiftCode.
const InputInvoicePremiumGiftCodeTypeID = 0x98986c0d

// construct implements constructor of InputInvoiceClass.
func ( InputInvoicePremiumGiftCode) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoicePremiumGiftCode{}
)

func ( *InputInvoicePremiumGiftCode) () bool {
	if  == nil {
		return true
	}
	if !(.Purpose == nil) {
		return false
	}
	if !(.Option.Zero()) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoicePremiumGiftCode from given interface.
func ( *InputInvoicePremiumGiftCode) ( interface {
	() ( InputStorePaymentPurposeClass)
	() ( PremiumGiftCodeOption)
}) {
	.Purpose = .()
	.Option = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoicePremiumGiftCode) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoicePremiumGiftCode",
		ID:   InputInvoicePremiumGiftCodeTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Purpose",
			SchemaName: "purpose",
		},
		{
			Name:       "Option",
			SchemaName: "option",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoicePremiumGiftCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumGiftCode#98986c0d as nil")
	}
	.PutID(InputInvoicePremiumGiftCodeTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoicePremiumGiftCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumGiftCode#98986c0d as nil")
	}
	if .Purpose == nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftCode#98986c0d: field purpose is nil")
	}
	if  := .Purpose.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftCode#98986c0d: field purpose: %w", )
	}
	if  := .Option.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftCode#98986c0d: field option: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoicePremiumGiftCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumGiftCode#98986c0d to nil")
	}
	if  := .ConsumeID(InputInvoicePremiumGiftCodeTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoicePremiumGiftCode#98986c0d: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoicePremiumGiftCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumGiftCode#98986c0d to nil")
	}
	{
		,  := DecodeInputStorePaymentPurpose()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftCode#98986c0d: field purpose: %w", )
		}
		.Purpose = 
	}
	{
		if  := .Option.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftCode#98986c0d: field option: %w", )
		}
	}
	return nil
}

// GetPurpose returns value of Purpose field.
func ( *InputInvoicePremiumGiftCode) () ( InputStorePaymentPurposeClass) {
	if  == nil {
		return
	}
	return .Purpose
}

// GetOption returns value of Option field.
func ( *InputInvoicePremiumGiftCode) () ( PremiumGiftCodeOption) {
	if  == nil {
		return
	}
	return .Option
}

// InputInvoiceStars represents TL type `inputInvoiceStars#65f00ce3`.
// Used to top up the Telegram Stars¹ balance of the current account or someone else's
// account, or to start a Telegram Star giveaway »².
//
// Links:
//  1. https://core.telegram.org/api/stars
//  2. https://core.telegram.org/api/giveaways#star-giveaways
//
// See https://core.telegram.org/constructor/inputInvoiceStars for reference.
type InputInvoiceStars struct {
	// An inputStorePaymentStarsGiveaway¹, inputStorePaymentStarsTopup² or
	// inputStorePaymentStarsGift³.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/inputStorePaymentStarsGiveaway
	//  2) https://core.telegram.org/constructor/inputStorePaymentStarsTopup
	//  3) https://core.telegram.org/constructor/inputStorePaymentStarsGift
	Purpose InputStorePaymentPurposeClass
}

// InputInvoiceStarsTypeID is TL type id of InputInvoiceStars.
const InputInvoiceStarsTypeID = 0x65f00ce3

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStars) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStars{}
)

func ( *InputInvoiceStars) () bool {
	if  == nil {
		return true
	}
	if !(.Purpose == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStars from given interface.
func ( *InputInvoiceStars) ( interface {
	() ( InputStorePaymentPurposeClass)
}) {
	.Purpose = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStars) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStars",
		ID:   InputInvoiceStarsTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Purpose",
			SchemaName: "purpose",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStars#65f00ce3 as nil")
	}
	.PutID(InputInvoiceStarsTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStars#65f00ce3 as nil")
	}
	if .Purpose == nil {
		return fmt.Errorf("unable to encode inputInvoiceStars#65f00ce3: field purpose is nil")
	}
	if  := .Purpose.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStars#65f00ce3: field purpose: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStars#65f00ce3 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarsTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStars#65f00ce3: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStars#65f00ce3 to nil")
	}
	{
		,  := DecodeInputStorePaymentPurpose()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStars#65f00ce3: field purpose: %w", )
		}
		.Purpose = 
	}
	return nil
}

// GetPurpose returns value of Purpose field.
func ( *InputInvoiceStars) () ( InputStorePaymentPurposeClass) {
	if  == nil {
		return
	}
	return .Purpose
}

// InputInvoiceChatInviteSubscription represents TL type `inputInvoiceChatInviteSubscription#34e793f1`.
// Used to pay for a Telegram Star subscription »¹.
//
// Links:
//  1. https://core.telegram.org/api/stars#star-subscriptions
//
// See https://core.telegram.org/constructor/inputInvoiceChatInviteSubscription for reference.
type InputInvoiceChatInviteSubscription struct {
	// The invitation link of the Telegram Star subscription »¹
	//
	// Links:
	//  1) https://core.telegram.org/api/stars#star-subscriptions
	Hash string
}

// InputInvoiceChatInviteSubscriptionTypeID is TL type id of InputInvoiceChatInviteSubscription.
const InputInvoiceChatInviteSubscriptionTypeID = 0x34e793f1

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceChatInviteSubscription) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceChatInviteSubscription{}
)

func ( *InputInvoiceChatInviteSubscription) () bool {
	if  == nil {
		return true
	}
	if !(.Hash == "") {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceChatInviteSubscription from given interface.
func ( *InputInvoiceChatInviteSubscription) ( interface {
	() ( string)
}) {
	.Hash = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceChatInviteSubscription) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceChatInviteSubscription",
		ID:   InputInvoiceChatInviteSubscriptionTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Hash",
			SchemaName: "hash",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceChatInviteSubscription) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceChatInviteSubscription#34e793f1 as nil")
	}
	.PutID(InputInvoiceChatInviteSubscriptionTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceChatInviteSubscription) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceChatInviteSubscription#34e793f1 as nil")
	}
	.PutString(.Hash)
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceChatInviteSubscription) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceChatInviteSubscription#34e793f1 to nil")
	}
	if  := .ConsumeID(InputInvoiceChatInviteSubscriptionTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceChatInviteSubscription#34e793f1: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceChatInviteSubscription) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceChatInviteSubscription#34e793f1 to nil")
	}
	{
		,  := .String()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceChatInviteSubscription#34e793f1: field hash: %w", )
		}
		.Hash = 
	}
	return nil
}

// GetHash returns value of Hash field.
func ( *InputInvoiceChatInviteSubscription) () ( string) {
	if  == nil {
		return
	}
	return .Hash
}

// InputInvoiceStarGift represents TL type `inputInvoiceStarGift#e8625e92`.
// Used to buy a Telegram Star Gift, see here »¹ for more info.
//
// Links:
//  1. https://core.telegram.org/api/gifts
//
// See https://core.telegram.org/constructor/inputInvoiceStarGift for reference.
type InputInvoiceStarGift struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// If set, your name will be hidden if the destination user decides to display the gift
	// on their profile (they will still see that you sent the gift)
	HideName bool
	// Also pay for an eventual upgrade of the gift to a collectible gift »¹.
	//
	// Links:
	//  1) https://core.telegram.org/api/gifts#collectible-gifts
	IncludeUpgrade bool
	// Receiver of the gift.
	Peer InputPeerClass
	// Identifier of the gift, from starGift¹.id
	//
	// Links:
	//  1) https://core.telegram.org/constructor/starGift
	GiftID int64
	// Optional message, attached with the gift. The maximum length for this field is
	// specified in the stargifts_message_length_max client configuration value »¹.
	//
	// Links:
	//  1) https://core.telegram.org/api/config#stargifts-message-length-max
	//
	// Use SetMessage and GetMessage helpers.
	Message TextWithEntities
}

// InputInvoiceStarGiftTypeID is TL type id of InputInvoiceStarGift.
const InputInvoiceStarGiftTypeID = 0xe8625e92

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGift) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGift{}
)

func ( *InputInvoiceStarGift) () bool {
	if  == nil {
		return true
	}
	if !(.Flags.Zero()) {
		return false
	}
	if !(.HideName == false) {
		return false
	}
	if !(.IncludeUpgrade == false) {
		return false
	}
	if !(.Peer == nil) {
		return false
	}
	if !(.GiftID == 0) {
		return false
	}
	if !(.Message.Zero()) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGift from given interface.
func ( *InputInvoiceStarGift) ( interface {
	() ( bool)
	() ( bool)
	() ( InputPeerClass)
	() ( int64)
	() ( TextWithEntities,  bool)
}) {
	.HideName = .()
	.IncludeUpgrade = .()
	.Peer = .()
	.GiftID = .()
	if ,  := .();  {
		.Message = 
	}

}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGift) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGift",
		ID:   InputInvoiceStarGiftTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "HideName",
			SchemaName: "hide_name",
			Null:       !.Flags.Has(0),
		},
		{
			Name:       "IncludeUpgrade",
			SchemaName: "include_upgrade",
			Null:       !.Flags.Has(2),
		},
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "GiftID",
			SchemaName: "gift_id",
		},
		{
			Name:       "Message",
			SchemaName: "message",
			Null:       !.Flags.Has(1),
		},
	}
	return 
}

// SetFlags sets flags for non-zero fields.
func ( *InputInvoiceStarGift) () {
	if !(.HideName == false) {
		.Flags.Set(0)
	}
	if !(.IncludeUpgrade == false) {
		.Flags.Set(2)
	}
	if !(.Message.Zero()) {
		.Flags.Set(1)
	}
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGift) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGift#e8625e92 as nil")
	}
	.PutID(InputInvoiceStarGiftTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGift) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGift#e8625e92 as nil")
	}
	.SetFlags()
	if  := .Flags.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGift#e8625e92: field flags: %w", )
	}
	if .Peer == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGift#e8625e92: field peer is nil")
	}
	if  := .Peer.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGift#e8625e92: field peer: %w", )
	}
	.PutLong(.GiftID)
	if .Flags.Has(1) {
		if  := .Message.Encode();  != nil {
			return fmt.Errorf("unable to encode inputInvoiceStarGift#e8625e92: field message: %w", )
		}
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGift) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGift#e8625e92 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGift#e8625e92: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGift) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGift#e8625e92 to nil")
	}
	{
		if  := .Flags.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGift#e8625e92: field flags: %w", )
		}
	}
	.HideName = .Flags.Has(0)
	.IncludeUpgrade = .Flags.Has(2)
	{
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGift#e8625e92: field peer: %w", )
		}
		.Peer = 
	}
	{
		,  := .Long()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGift#e8625e92: field gift_id: %w", )
		}
		.GiftID = 
	}
	if .Flags.Has(1) {
		if  := .Message.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGift#e8625e92: field message: %w", )
		}
	}
	return nil
}

// SetHideName sets value of HideName conditional field.
func ( *InputInvoiceStarGift) ( bool) {
	if  {
		.Flags.Set(0)
		.HideName = true
	} else {
		.Flags.Unset(0)
		.HideName = false
	}
}

// GetHideName returns value of HideName conditional field.
func ( *InputInvoiceStarGift) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(0)
}

// SetIncludeUpgrade sets value of IncludeUpgrade conditional field.
func ( *InputInvoiceStarGift) ( bool) {
	if  {
		.Flags.Set(2)
		.IncludeUpgrade = true
	} else {
		.Flags.Unset(2)
		.IncludeUpgrade = false
	}
}

// GetIncludeUpgrade returns value of IncludeUpgrade conditional field.
func ( *InputInvoiceStarGift) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(2)
}

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

// GetGiftID returns value of GiftID field.
func ( *InputInvoiceStarGift) () ( int64) {
	if  == nil {
		return
	}
	return .GiftID
}

// SetMessage sets value of Message conditional field.
func ( *InputInvoiceStarGift) ( TextWithEntities) {
	.Flags.Set(1)
	.Message = 
}

// GetMessage returns value of Message conditional field and
// boolean which is true if field was set.
func ( *InputInvoiceStarGift) () ( TextWithEntities,  bool) {
	if  == nil {
		return
	}
	if !.Flags.Has(1) {
		return , false
	}
	return .Message, true
}

// InputInvoiceStarGiftUpgrade represents TL type `inputInvoiceStarGiftUpgrade#4d818d5d`.
// Used to pay to upgrade a Gift to a collectible gift¹, see the collectible gifts »²
// documentation for more info on the full flow.
//
// Links:
//  1. https://core.telegram.org/api/gifts#upgrade-a-gift-to-a-collectible-gift
//  2. https://core.telegram.org/api/gifts#collectible-gifts
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftUpgrade for reference.
type InputInvoiceStarGiftUpgrade struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Set this flag to keep the original gift text, sender and receiver in the upgraded gift
	// as a starGiftAttributeOriginalDetails¹ attribute.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/starGiftAttributeOriginalDetails
	KeepOriginalDetails bool
	// The identifier of the received gift to upgrade.
	Stargift InputSavedStarGiftClass
}

// InputInvoiceStarGiftUpgradeTypeID is TL type id of InputInvoiceStarGiftUpgrade.
const InputInvoiceStarGiftUpgradeTypeID = 0x4d818d5d

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftUpgrade) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftUpgrade{}
)

func ( *InputInvoiceStarGiftUpgrade) () bool {
	if  == nil {
		return true
	}
	if !(.Flags.Zero()) {
		return false
	}
	if !(.KeepOriginalDetails == false) {
		return false
	}
	if !(.Stargift == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftUpgrade from given interface.
func ( *InputInvoiceStarGiftUpgrade) ( interface {
	() ( bool)
	() ( InputSavedStarGiftClass)
}) {
	.KeepOriginalDetails = .()
	.Stargift = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftUpgrade) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftUpgrade",
		ID:   InputInvoiceStarGiftUpgradeTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "KeepOriginalDetails",
			SchemaName: "keep_original_details",
			Null:       !.Flags.Has(0),
		},
		{
			Name:       "Stargift",
			SchemaName: "stargift",
		},
	}
	return 
}

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

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftUpgrade#4d818d5d as nil")
	}
	.PutID(InputInvoiceStarGiftUpgradeTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftUpgrade#4d818d5d as nil")
	}
	.SetFlags()
	if  := .Flags.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftUpgrade#4d818d5d: field flags: %w", )
	}
	if .Stargift == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftUpgrade#4d818d5d: field stargift is nil")
	}
	if  := .Stargift.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftUpgrade#4d818d5d: field stargift: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftUpgrade#4d818d5d to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftUpgradeTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftUpgrade#4d818d5d: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftUpgrade#4d818d5d to nil")
	}
	{
		if  := .Flags.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftUpgrade#4d818d5d: field flags: %w", )
		}
	}
	.KeepOriginalDetails = .Flags.Has(0)
	{
		,  := DecodeInputSavedStarGift()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftUpgrade#4d818d5d: field stargift: %w", )
		}
		.Stargift = 
	}
	return nil
}

// SetKeepOriginalDetails sets value of KeepOriginalDetails conditional field.
func ( *InputInvoiceStarGiftUpgrade) ( bool) {
	if  {
		.Flags.Set(0)
		.KeepOriginalDetails = true
	} else {
		.Flags.Unset(0)
		.KeepOriginalDetails = false
	}
}

// GetKeepOriginalDetails returns value of KeepOriginalDetails conditional field.
func ( *InputInvoiceStarGiftUpgrade) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(0)
}

// GetStargift returns value of Stargift field.
func ( *InputInvoiceStarGiftUpgrade) () ( InputSavedStarGiftClass) {
	if  == nil {
		return
	}
	return .Stargift
}

// InputInvoiceStarGiftTransfer represents TL type `inputInvoiceStarGiftTransfer#4a5f5bd9`.
// Used to pay to transfer a collectible gift to another peer¹, see the gifts »²
// documentation for more info.
//
// Links:
//  1. https://core.telegram.org/api/gifts#transferring-collectible-gifts
//  2. https://core.telegram.org/api/gifts#transferring-collectible-gifts
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftTransfer for reference.
type InputInvoiceStarGiftTransfer struct {
	// The identifier of the received gift
	Stargift InputSavedStarGiftClass
	// The destination peer
	ToID InputPeerClass
}

// InputInvoiceStarGiftTransferTypeID is TL type id of InputInvoiceStarGiftTransfer.
const InputInvoiceStarGiftTransferTypeID = 0x4a5f5bd9

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftTransfer) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftTransfer{}
)

func ( *InputInvoiceStarGiftTransfer) () bool {
	if  == nil {
		return true
	}
	if !(.Stargift == nil) {
		return false
	}
	if !(.ToID == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftTransfer from given interface.
func ( *InputInvoiceStarGiftTransfer) ( interface {
	() ( InputSavedStarGiftClass)
	() ( InputPeerClass)
}) {
	.Stargift = .()
	.ToID = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftTransfer) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftTransfer",
		ID:   InputInvoiceStarGiftTransferTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Stargift",
			SchemaName: "stargift",
		},
		{
			Name:       "ToID",
			SchemaName: "to_id",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftTransfer) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftTransfer#4a5f5bd9 as nil")
	}
	.PutID(InputInvoiceStarGiftTransferTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftTransfer) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftTransfer#4a5f5bd9 as nil")
	}
	if .Stargift == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftTransfer#4a5f5bd9: field stargift is nil")
	}
	if  := .Stargift.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftTransfer#4a5f5bd9: field stargift: %w", )
	}
	if .ToID == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftTransfer#4a5f5bd9: field to_id is nil")
	}
	if  := .ToID.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftTransfer#4a5f5bd9: field to_id: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftTransfer) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftTransfer#4a5f5bd9 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftTransferTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftTransfer#4a5f5bd9: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftTransfer) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftTransfer#4a5f5bd9 to nil")
	}
	{
		,  := DecodeInputSavedStarGift()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftTransfer#4a5f5bd9: field stargift: %w", )
		}
		.Stargift = 
	}
	{
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftTransfer#4a5f5bd9: field to_id: %w", )
		}
		.ToID = 
	}
	return nil
}

// GetStargift returns value of Stargift field.
func ( *InputInvoiceStarGiftTransfer) () ( InputSavedStarGiftClass) {
	if  == nil {
		return
	}
	return .Stargift
}

// GetToID returns value of ToID field.
func ( *InputInvoiceStarGiftTransfer) () ( InputPeerClass) {
	if  == nil {
		return
	}
	return .ToID
}

// InputInvoicePremiumGiftStars represents TL type `inputInvoicePremiumGiftStars#dabab2ef`.
// Used to gift a Telegram Premium¹ subscription to another user, paying with Telegram
// Stars².
//
// Links:
//  1. https://core.telegram.org/api/premium
//  2. https://core.telegram.org/api/stars
//
// See https://core.telegram.org/constructor/inputInvoicePremiumGiftStars for reference.
type InputInvoicePremiumGiftStars struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Who will receive the gifted subscription.
	UserID InputUserClass
	// Duration of the subscription in months, must be one of the options with currency ==
	// "XTR" returned by payments.getPremiumGiftCodeOptions¹.
	//
	// Links:
	//  1) https://core.telegram.org/method/payments.getPremiumGiftCodeOptions
	Months int
	// Message attached with the gift.
	//
	// Use SetMessage and GetMessage helpers.
	Message TextWithEntities
}

// InputInvoicePremiumGiftStarsTypeID is TL type id of InputInvoicePremiumGiftStars.
const InputInvoicePremiumGiftStarsTypeID = 0xdabab2ef

// construct implements constructor of InputInvoiceClass.
func ( InputInvoicePremiumGiftStars) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoicePremiumGiftStars{}
)

func ( *InputInvoicePremiumGiftStars) () bool {
	if  == nil {
		return true
	}
	if !(.Flags.Zero()) {
		return false
	}
	if !(.UserID == nil) {
		return false
	}
	if !(.Months == 0) {
		return false
	}
	if !(.Message.Zero()) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoicePremiumGiftStars from given interface.
func ( *InputInvoicePremiumGiftStars) ( interface {
	() ( InputUserClass)
	() ( int)
	() ( TextWithEntities,  bool)
}) {
	.UserID = .()
	.Months = .()
	if ,  := .();  {
		.Message = 
	}

}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoicePremiumGiftStars) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoicePremiumGiftStars",
		ID:   InputInvoicePremiumGiftStarsTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "UserID",
			SchemaName: "user_id",
		},
		{
			Name:       "Months",
			SchemaName: "months",
		},
		{
			Name:       "Message",
			SchemaName: "message",
			Null:       !.Flags.Has(0),
		},
	}
	return 
}

// SetFlags sets flags for non-zero fields.
func ( *InputInvoicePremiumGiftStars) () {
	if !(.Message.Zero()) {
		.Flags.Set(0)
	}
}

// Encode implements bin.Encoder.
func ( *InputInvoicePremiumGiftStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumGiftStars#dabab2ef as nil")
	}
	.PutID(InputInvoicePremiumGiftStarsTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoicePremiumGiftStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumGiftStars#dabab2ef as nil")
	}
	.SetFlags()
	if  := .Flags.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftStars#dabab2ef: field flags: %w", )
	}
	if .UserID == nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftStars#dabab2ef: field user_id is nil")
	}
	if  := .UserID.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumGiftStars#dabab2ef: field user_id: %w", )
	}
	.PutInt(.Months)
	if .Flags.Has(0) {
		if  := .Message.Encode();  != nil {
			return fmt.Errorf("unable to encode inputInvoicePremiumGiftStars#dabab2ef: field message: %w", )
		}
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoicePremiumGiftStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumGiftStars#dabab2ef to nil")
	}
	if  := .ConsumeID(InputInvoicePremiumGiftStarsTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoicePremiumGiftStars#dabab2ef: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoicePremiumGiftStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumGiftStars#dabab2ef to nil")
	}
	{
		if  := .Flags.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftStars#dabab2ef: field flags: %w", )
		}
	}
	{
		,  := DecodeInputUser()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftStars#dabab2ef: field user_id: %w", )
		}
		.UserID = 
	}
	{
		,  := .Int()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftStars#dabab2ef: field months: %w", )
		}
		.Months = 
	}
	if .Flags.Has(0) {
		if  := .Message.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumGiftStars#dabab2ef: field message: %w", )
		}
	}
	return nil
}

// GetUserID returns value of UserID field.
func ( *InputInvoicePremiumGiftStars) () ( InputUserClass) {
	if  == nil {
		return
	}
	return .UserID
}

// GetMonths returns value of Months field.
func ( *InputInvoicePremiumGiftStars) () ( int) {
	if  == nil {
		return
	}
	return .Months
}

// SetMessage sets value of Message conditional field.
func ( *InputInvoicePremiumGiftStars) ( TextWithEntities) {
	.Flags.Set(0)
	.Message = 
}

// GetMessage returns value of Message conditional field and
// boolean which is true if field was set.
func ( *InputInvoicePremiumGiftStars) () ( TextWithEntities,  bool) {
	if  == nil {
		return
	}
	if !.Flags.Has(0) {
		return , false
	}
	return .Message, true
}

// InputInvoiceBusinessBotTransferStars represents TL type `inputInvoiceBusinessBotTransferStars#f4997e42`.
// Transfer stars from the balance of a user account connected to a business bot¹, to
// the balance of the business bot², see here »³ for more info on the full flow.
//
// Links:
//  1. https://core.telegram.org/api/bots/connected-business-bots
//  2. https://core.telegram.org/api/bots/connected-business-bots
//  3. https://core.telegram.org/api/stars#transferring-stars-from-a-business-account-to-the-business-bot
//
// See https://core.telegram.org/constructor/inputInvoiceBusinessBotTransferStars for reference.
type InputInvoiceBusinessBotTransferStars struct {
	// Always inputUserSelf¹.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/inputUserSelf
	Bot InputUserClass
	// The number of stars to transfer.
	Stars int64
}

// InputInvoiceBusinessBotTransferStarsTypeID is TL type id of InputInvoiceBusinessBotTransferStars.
const InputInvoiceBusinessBotTransferStarsTypeID = 0xf4997e42

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceBusinessBotTransferStars) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceBusinessBotTransferStars{}
)

func ( *InputInvoiceBusinessBotTransferStars) () bool {
	if  == nil {
		return true
	}
	if !(.Bot == nil) {
		return false
	}
	if !(.Stars == 0) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceBusinessBotTransferStars from given interface.
func ( *InputInvoiceBusinessBotTransferStars) ( interface {
	() ( InputUserClass)
	() ( int64)
}) {
	.Bot = .()
	.Stars = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceBusinessBotTransferStars) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceBusinessBotTransferStars",
		ID:   InputInvoiceBusinessBotTransferStarsTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Bot",
			SchemaName: "bot",
		},
		{
			Name:       "Stars",
			SchemaName: "stars",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceBusinessBotTransferStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceBusinessBotTransferStars#f4997e42 as nil")
	}
	.PutID(InputInvoiceBusinessBotTransferStarsTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceBusinessBotTransferStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceBusinessBotTransferStars#f4997e42 as nil")
	}
	if .Bot == nil {
		return fmt.Errorf("unable to encode inputInvoiceBusinessBotTransferStars#f4997e42: field bot is nil")
	}
	if  := .Bot.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceBusinessBotTransferStars#f4997e42: field bot: %w", )
	}
	.PutLong(.Stars)
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceBusinessBotTransferStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceBusinessBotTransferStars#f4997e42 to nil")
	}
	if  := .ConsumeID(InputInvoiceBusinessBotTransferStarsTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceBusinessBotTransferStars#f4997e42: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceBusinessBotTransferStars) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceBusinessBotTransferStars#f4997e42 to nil")
	}
	{
		,  := DecodeInputUser()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceBusinessBotTransferStars#f4997e42: field bot: %w", )
		}
		.Bot = 
	}
	{
		,  := .Long()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceBusinessBotTransferStars#f4997e42: field stars: %w", )
		}
		.Stars = 
	}
	return nil
}

// GetBot returns value of Bot field.
func ( *InputInvoiceBusinessBotTransferStars) () ( InputUserClass) {
	if  == nil {
		return
	}
	return .Bot
}

// GetStars returns value of Stars field.
func ( *InputInvoiceBusinessBotTransferStars) () ( int64) {
	if  == nil {
		return
	}
	return .Stars
}

// InputInvoiceStarGiftResale represents TL type `inputInvoiceStarGiftResale#c39f5324`.
// Used to buy a collectible gift¹ currently up on resale, see here² for more info on
// the full flow.
//
// Links:
//  1. https://core.telegram.org/api/gifts#collectible-gifts
//  2. https://core.telegram.org/api/gifts#reselling-collectible-gifts
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftResale for reference.
type InputInvoiceStarGiftResale struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// Buy the gift using TON.
	Ton bool
	// Slug of the gift to buy.
	Slug string
	// The receiver of the gift.
	ToID InputPeerClass
}

// InputInvoiceStarGiftResaleTypeID is TL type id of InputInvoiceStarGiftResale.
const InputInvoiceStarGiftResaleTypeID = 0xc39f5324

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftResale) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftResale{}
)

func ( *InputInvoiceStarGiftResale) () bool {
	if  == nil {
		return true
	}
	if !(.Flags.Zero()) {
		return false
	}
	if !(.Ton == false) {
		return false
	}
	if !(.Slug == "") {
		return false
	}
	if !(.ToID == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftResale from given interface.
func ( *InputInvoiceStarGiftResale) ( interface {
	() ( bool)
	() ( string)
	() ( InputPeerClass)
}) {
	.Ton = .()
	.Slug = .()
	.ToID = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftResale) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftResale",
		ID:   InputInvoiceStarGiftResaleTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Ton",
			SchemaName: "ton",
			Null:       !.Flags.Has(0),
		},
		{
			Name:       "Slug",
			SchemaName: "slug",
		},
		{
			Name:       "ToID",
			SchemaName: "to_id",
		},
	}
	return 
}

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

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftResale) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftResale#c39f5324 as nil")
	}
	.PutID(InputInvoiceStarGiftResaleTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftResale) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftResale#c39f5324 as nil")
	}
	.SetFlags()
	if  := .Flags.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftResale#c39f5324: field flags: %w", )
	}
	.PutString(.Slug)
	if .ToID == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftResale#c39f5324: field to_id is nil")
	}
	if  := .ToID.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftResale#c39f5324: field to_id: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftResale) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftResale#c39f5324 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftResaleTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftResale#c39f5324: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftResale) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftResale#c39f5324 to nil")
	}
	{
		if  := .Flags.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftResale#c39f5324: field flags: %w", )
		}
	}
	.Ton = .Flags.Has(0)
	{
		,  := .String()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftResale#c39f5324: field slug: %w", )
		}
		.Slug = 
	}
	{
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftResale#c39f5324: field to_id: %w", )
		}
		.ToID = 
	}
	return nil
}

// SetTon sets value of Ton conditional field.
func ( *InputInvoiceStarGiftResale) ( bool) {
	if  {
		.Flags.Set(0)
		.Ton = true
	} else {
		.Flags.Unset(0)
		.Ton = false
	}
}

// GetTon returns value of Ton conditional field.
func ( *InputInvoiceStarGiftResale) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(0)
}

// GetSlug returns value of Slug field.
func ( *InputInvoiceStarGiftResale) () ( string) {
	if  == nil {
		return
	}
	return .Slug
}

// GetToID returns value of ToID field.
func ( *InputInvoiceStarGiftResale) () ( InputPeerClass) {
	if  == nil {
		return
	}
	return .ToID
}

// InputInvoiceStarGiftPrepaidUpgrade represents TL type `inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8`.
// Separately prepay for the upgrade of a gift »¹.
//
// Links:
//  1. https://core.telegram.org/api/gifts#prepaying-for-someone-elses-upgrade
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftPrepaidUpgrade for reference.
type InputInvoiceStarGiftPrepaidUpgrade struct {
	// The peer that owns the gift.
	Peer InputPeerClass
	// The upgrade hash from messageActionStarGift¹.prepaid_upgrade_hash or savedStarGift²
	// prepaid_upgrade_hash.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/messageActionStarGift
	//  2) https://core.telegram.org/constructor/savedStarGift
	Hash string
}

// InputInvoiceStarGiftPrepaidUpgradeTypeID is TL type id of InputInvoiceStarGiftPrepaidUpgrade.
const InputInvoiceStarGiftPrepaidUpgradeTypeID = 0x9a0b48b8

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftPrepaidUpgrade) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftPrepaidUpgrade{}
)

func ( *InputInvoiceStarGiftPrepaidUpgrade) () bool {
	if  == nil {
		return true
	}
	if !(.Peer == nil) {
		return false
	}
	if !(.Hash == "") {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftPrepaidUpgrade from given interface.
func ( *InputInvoiceStarGiftPrepaidUpgrade) ( interface {
	() ( InputPeerClass)
	() ( string)
}) {
	.Peer = .()
	.Hash = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftPrepaidUpgrade) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftPrepaidUpgrade",
		ID:   InputInvoiceStarGiftPrepaidUpgradeTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Peer",
			SchemaName: "peer",
		},
		{
			Name:       "Hash",
			SchemaName: "hash",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftPrepaidUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8 as nil")
	}
	.PutID(InputInvoiceStarGiftPrepaidUpgradeTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftPrepaidUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8 as nil")
	}
	if .Peer == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8: field peer is nil")
	}
	if  := .Peer.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8: field peer: %w", )
	}
	.PutString(.Hash)
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftPrepaidUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftPrepaidUpgradeTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftPrepaidUpgrade) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8 to nil")
	}
	{
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8: field peer: %w", )
		}
		.Peer = 
	}
	{
		,  := .String()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8: field hash: %w", )
		}
		.Hash = 
	}
	return nil
}

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

// GetHash returns value of Hash field.
func ( *InputInvoiceStarGiftPrepaidUpgrade) () ( string) {
	if  == nil {
		return
	}
	return .Hash
}

// InputInvoicePremiumAuthCode represents TL type `inputInvoicePremiumAuthCode#3e77f614`.
// Used to pay for login codes, in case of high cost of SMS verification codes for the
// user's country/provider, see here »¹ for more info.
//
// Links:
//  1. https://core.telegram.org/api/auth#paid-auth
//
// See https://core.telegram.org/constructor/inputInvoicePremiumAuthCode for reference.
type InputInvoicePremiumAuthCode struct {
	// Must contain an inputStorePaymentAuthCode¹.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/inputStorePaymentAuthCode
	Purpose InputStorePaymentPurposeClass
}

// InputInvoicePremiumAuthCodeTypeID is TL type id of InputInvoicePremiumAuthCode.
const InputInvoicePremiumAuthCodeTypeID = 0x3e77f614

// construct implements constructor of InputInvoiceClass.
func ( InputInvoicePremiumAuthCode) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoicePremiumAuthCode{}
)

func ( *InputInvoicePremiumAuthCode) () bool {
	if  == nil {
		return true
	}
	if !(.Purpose == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoicePremiumAuthCode from given interface.
func ( *InputInvoicePremiumAuthCode) ( interface {
	() ( InputStorePaymentPurposeClass)
}) {
	.Purpose = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoicePremiumAuthCode) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoicePremiumAuthCode",
		ID:   InputInvoicePremiumAuthCodeTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Purpose",
			SchemaName: "purpose",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoicePremiumAuthCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumAuthCode#3e77f614 as nil")
	}
	.PutID(InputInvoicePremiumAuthCodeTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoicePremiumAuthCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoicePremiumAuthCode#3e77f614 as nil")
	}
	if .Purpose == nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumAuthCode#3e77f614: field purpose is nil")
	}
	if  := .Purpose.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoicePremiumAuthCode#3e77f614: field purpose: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoicePremiumAuthCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumAuthCode#3e77f614 to nil")
	}
	if  := .ConsumeID(InputInvoicePremiumAuthCodeTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoicePremiumAuthCode#3e77f614: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoicePremiumAuthCode) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoicePremiumAuthCode#3e77f614 to nil")
	}
	{
		,  := DecodeInputStorePaymentPurpose()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoicePremiumAuthCode#3e77f614: field purpose: %w", )
		}
		.Purpose = 
	}
	return nil
}

// GetPurpose returns value of Purpose field.
func ( *InputInvoicePremiumAuthCode) () ( InputStorePaymentPurposeClass) {
	if  == nil {
		return
	}
	return .Purpose
}

// InputInvoiceStarGiftDropOriginalDetails represents TL type `inputInvoiceStarGiftDropOriginalDetails#923d8d1`.
// Used to pay for for the removal of the starGiftAttributeOriginalDetails¹ attribute
// from a collectible gift, see here »² for the full flow.
//
// Links:
//  1. https://core.telegram.org/constructor/starGiftAttributeOriginalDetails
//  2. https://core.telegram.org/api/gifts#dropping-the-original-details-of-an-upgraded-gift
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftDropOriginalDetails for reference.
type InputInvoiceStarGiftDropOriginalDetails struct {
	// The collectible gift whose starGiftAttributeOriginalDetails¹ attribute should be
	// removed.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/starGiftAttributeOriginalDetails
	Stargift InputSavedStarGiftClass
}

// InputInvoiceStarGiftDropOriginalDetailsTypeID is TL type id of InputInvoiceStarGiftDropOriginalDetails.
const InputInvoiceStarGiftDropOriginalDetailsTypeID = 0x923d8d1

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftDropOriginalDetails) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftDropOriginalDetails{}
)

func ( *InputInvoiceStarGiftDropOriginalDetails) () bool {
	if  == nil {
		return true
	}
	if !(.Stargift == nil) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftDropOriginalDetails from given interface.
func ( *InputInvoiceStarGiftDropOriginalDetails) ( interface {
	() ( InputSavedStarGiftClass)
}) {
	.Stargift = .()
}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftDropOriginalDetails) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftDropOriginalDetails",
		ID:   InputInvoiceStarGiftDropOriginalDetailsTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "Stargift",
			SchemaName: "stargift",
		},
	}
	return 
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftDropOriginalDetails) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftDropOriginalDetails#923d8d1 as nil")
	}
	.PutID(InputInvoiceStarGiftDropOriginalDetailsTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftDropOriginalDetails) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftDropOriginalDetails#923d8d1 as nil")
	}
	if .Stargift == nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftDropOriginalDetails#923d8d1: field stargift is nil")
	}
	if  := .Stargift.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftDropOriginalDetails#923d8d1: field stargift: %w", )
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftDropOriginalDetails) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftDropOriginalDetails#923d8d1 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftDropOriginalDetailsTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftDropOriginalDetails#923d8d1: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftDropOriginalDetails) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftDropOriginalDetails#923d8d1 to nil")
	}
	{
		,  := DecodeInputSavedStarGift()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftDropOriginalDetails#923d8d1: field stargift: %w", )
		}
		.Stargift = 
	}
	return nil
}

// GetStargift returns value of Stargift field.
func ( *InputInvoiceStarGiftDropOriginalDetails) () ( InputSavedStarGiftClass) {
	if  == nil {
		return
	}
	return .Stargift
}

// InputInvoiceStarGiftAuctionBid represents TL type `inputInvoiceStarGiftAuctionBid#1ecafa10`.
// Used to place a bid in a collectible gift auction »¹.
//
// Links:
//  1. https://core.telegram.org/api/auctions
//
// See https://core.telegram.org/constructor/inputInvoiceStarGiftAuctionBid for reference.
type InputInvoiceStarGiftAuctionBid struct {
	// Flags, see TL conditional fields¹
	//
	// Links:
	//  1) https://core.telegram.org/mtproto/TL-combinators#conditional-fields
	Flags bin.Fields
	// If set, your name will be hidden if the destination peer decides to display the gift
	// on their profile (they will still see that you sent the gift).    Must not be set when
	// updating an existing bid, as the value cannot be changed for existing bids.
	HideName bool
	// Must be set when increasing an already existing bid.
	UpdateBid bool
	// Identifier of the user or channel (only if channelFull¹.stargifts_available is set)
	// that will receive the gift.
	//
	// Links:
	//  1) https://core.telegram.org/constructor/channelFull
	//
	// Use SetPeer and GetPeer helpers.
	Peer InputPeerClass
	// Identifier of the gift, from starGift¹.id
	//
	// Links:
	//  1) https://core.telegram.org/constructor/starGift
	GiftID int64
	// Total amount of the bid in Telegram Stars¹.
	//
	// Links:
	//  1) https://core.telegram.org/api/stars
	BidAmount int64
	// Optional message that will be attached with the gift if we end up winning this round:
	// the maximum length for this field is specified in the stargifts_message_length_max
	// client configuration value »¹.    Must not be set when updating an existing bid, as
	// the value cannot be changed for existing bids.
	//
	// Links:
	//  1) https://core.telegram.org/api/config#stargifts-message-length-max
	//
	// Use SetMessage and GetMessage helpers.
	Message TextWithEntities
}

// InputInvoiceStarGiftAuctionBidTypeID is TL type id of InputInvoiceStarGiftAuctionBid.
const InputInvoiceStarGiftAuctionBidTypeID = 0x1ecafa10

// construct implements constructor of InputInvoiceClass.
func ( InputInvoiceStarGiftAuctionBid) () InputInvoiceClass { return & }

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

	_ InputInvoiceClass = &InputInvoiceStarGiftAuctionBid{}
)

func ( *InputInvoiceStarGiftAuctionBid) () bool {
	if  == nil {
		return true
	}
	if !(.Flags.Zero()) {
		return false
	}
	if !(.HideName == false) {
		return false
	}
	if !(.UpdateBid == false) {
		return false
	}
	if !(.Peer == nil) {
		return false
	}
	if !(.GiftID == 0) {
		return false
	}
	if !(.BidAmount == 0) {
		return false
	}
	if !(.Message.Zero()) {
		return false
	}

	return true
}

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

// FillFrom fills InputInvoiceStarGiftAuctionBid from given interface.
func ( *InputInvoiceStarGiftAuctionBid) ( interface {
	() ( bool)
	() ( bool)
	() ( InputPeerClass,  bool)
	() ( int64)
	() ( int64)
	() ( TextWithEntities,  bool)
}) {
	.HideName = .()
	.UpdateBid = .()
	if ,  := .();  {
		.Peer = 
	}

	.GiftID = .()
	.BidAmount = .()
	if ,  := .();  {
		.Message = 
	}

}

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

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

// TypeInfo returns info about TL type.
func ( *InputInvoiceStarGiftAuctionBid) () tdp.Type {
	 := tdp.Type{
		Name: "inputInvoiceStarGiftAuctionBid",
		ID:   InputInvoiceStarGiftAuctionBidTypeID,
	}
	if  == nil {
		.Null = true
		return 
	}
	.Fields = []tdp.Field{
		{
			Name:       "HideName",
			SchemaName: "hide_name",
			Null:       !.Flags.Has(0),
		},
		{
			Name:       "UpdateBid",
			SchemaName: "update_bid",
			Null:       !.Flags.Has(2),
		},
		{
			Name:       "Peer",
			SchemaName: "peer",
			Null:       !.Flags.Has(3),
		},
		{
			Name:       "GiftID",
			SchemaName: "gift_id",
		},
		{
			Name:       "BidAmount",
			SchemaName: "bid_amount",
		},
		{
			Name:       "Message",
			SchemaName: "message",
			Null:       !.Flags.Has(1),
		},
	}
	return 
}

// SetFlags sets flags for non-zero fields.
func ( *InputInvoiceStarGiftAuctionBid) () {
	if !(.HideName == false) {
		.Flags.Set(0)
	}
	if !(.UpdateBid == false) {
		.Flags.Set(2)
	}
	if !(.Peer == nil) {
		.Flags.Set(3)
	}
	if !(.Message.Zero()) {
		.Flags.Set(1)
	}
}

// Encode implements bin.Encoder.
func ( *InputInvoiceStarGiftAuctionBid) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftAuctionBid#1ecafa10 as nil")
	}
	.PutID(InputInvoiceStarGiftAuctionBidTypeID)
	return .EncodeBare()
}

// EncodeBare implements bin.BareEncoder.
func ( *InputInvoiceStarGiftAuctionBid) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't encode inputInvoiceStarGiftAuctionBid#1ecafa10 as nil")
	}
	.SetFlags()
	if  := .Flags.Encode();  != nil {
		return fmt.Errorf("unable to encode inputInvoiceStarGiftAuctionBid#1ecafa10: field flags: %w", )
	}
	if .Flags.Has(3) {
		if .Peer == nil {
			return fmt.Errorf("unable to encode inputInvoiceStarGiftAuctionBid#1ecafa10: field peer is nil")
		}
		if  := .Peer.Encode();  != nil {
			return fmt.Errorf("unable to encode inputInvoiceStarGiftAuctionBid#1ecafa10: field peer: %w", )
		}
	}
	.PutLong(.GiftID)
	.PutLong(.BidAmount)
	if .Flags.Has(1) {
		if  := .Message.Encode();  != nil {
			return fmt.Errorf("unable to encode inputInvoiceStarGiftAuctionBid#1ecafa10: field message: %w", )
		}
	}
	return nil
}

// Decode implements bin.Decoder.
func ( *InputInvoiceStarGiftAuctionBid) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftAuctionBid#1ecafa10 to nil")
	}
	if  := .ConsumeID(InputInvoiceStarGiftAuctionBidTypeID);  != nil {
		return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: %w", )
	}
	return .DecodeBare()
}

// DecodeBare implements bin.BareDecoder.
func ( *InputInvoiceStarGiftAuctionBid) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("can't decode inputInvoiceStarGiftAuctionBid#1ecafa10 to nil")
	}
	{
		if  := .Flags.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: field flags: %w", )
		}
	}
	.HideName = .Flags.Has(0)
	.UpdateBid = .Flags.Has(2)
	if .Flags.Has(3) {
		,  := DecodeInputPeer()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: field peer: %w", )
		}
		.Peer = 
	}
	{
		,  := .Long()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: field gift_id: %w", )
		}
		.GiftID = 
	}
	{
		,  := .Long()
		if  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: field bid_amount: %w", )
		}
		.BidAmount = 
	}
	if .Flags.Has(1) {
		if  := .Message.Decode();  != nil {
			return fmt.Errorf("unable to decode inputInvoiceStarGiftAuctionBid#1ecafa10: field message: %w", )
		}
	}
	return nil
}

// SetHideName sets value of HideName conditional field.
func ( *InputInvoiceStarGiftAuctionBid) ( bool) {
	if  {
		.Flags.Set(0)
		.HideName = true
	} else {
		.Flags.Unset(0)
		.HideName = false
	}
}

// GetHideName returns value of HideName conditional field.
func ( *InputInvoiceStarGiftAuctionBid) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(0)
}

// SetUpdateBid sets value of UpdateBid conditional field.
func ( *InputInvoiceStarGiftAuctionBid) ( bool) {
	if  {
		.Flags.Set(2)
		.UpdateBid = true
	} else {
		.Flags.Unset(2)
		.UpdateBid = false
	}
}

// GetUpdateBid returns value of UpdateBid conditional field.
func ( *InputInvoiceStarGiftAuctionBid) () ( bool) {
	if  == nil {
		return
	}
	return .Flags.Has(2)
}

// SetPeer sets value of Peer conditional field.
func ( *InputInvoiceStarGiftAuctionBid) ( InputPeerClass) {
	.Flags.Set(3)
	.Peer = 
}

// GetPeer returns value of Peer conditional field and
// boolean which is true if field was set.
func ( *InputInvoiceStarGiftAuctionBid) () ( InputPeerClass,  bool) {
	if  == nil {
		return
	}
	if !.Flags.Has(3) {
		return , false
	}
	return .Peer, true
}

// GetGiftID returns value of GiftID field.
func ( *InputInvoiceStarGiftAuctionBid) () ( int64) {
	if  == nil {
		return
	}
	return .GiftID
}

// GetBidAmount returns value of BidAmount field.
func ( *InputInvoiceStarGiftAuctionBid) () ( int64) {
	if  == nil {
		return
	}
	return .BidAmount
}

// SetMessage sets value of Message conditional field.
func ( *InputInvoiceStarGiftAuctionBid) ( TextWithEntities) {
	.Flags.Set(1)
	.Message = 
}

// GetMessage returns value of Message conditional field and
// boolean which is true if field was set.
func ( *InputInvoiceStarGiftAuctionBid) () ( TextWithEntities,  bool) {
	if  == nil {
		return
	}
	if !.Flags.Has(1) {
		return , false
	}
	return .Message, true
}

// InputInvoiceClassName is schema name of InputInvoiceClass.
const InputInvoiceClassName = "InputInvoice"

// InputInvoiceClass represents InputInvoice generic type.
//
// See https://core.telegram.org/type/InputInvoice for reference.
//
// Constructors:
//   - [InputInvoiceMessage]
//   - [InputInvoiceSlug]
//   - [InputInvoicePremiumGiftCode]
//   - [InputInvoiceStars]
//   - [InputInvoiceChatInviteSubscription]
//   - [InputInvoiceStarGift]
//   - [InputInvoiceStarGiftUpgrade]
//   - [InputInvoiceStarGiftTransfer]
//   - [InputInvoicePremiumGiftStars]
//   - [InputInvoiceBusinessBotTransferStars]
//   - [InputInvoiceStarGiftResale]
//   - [InputInvoiceStarGiftPrepaidUpgrade]
//   - [InputInvoicePremiumAuthCode]
//   - [InputInvoiceStarGiftDropOriginalDetails]
//   - [InputInvoiceStarGiftAuctionBid]
//
// Example:
//
//	g, err := tg.DecodeInputInvoice(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *tg.InputInvoiceMessage: // inputInvoiceMessage#c5b56859
//	case *tg.InputInvoiceSlug: // inputInvoiceSlug#c326caef
//	case *tg.InputInvoicePremiumGiftCode: // inputInvoicePremiumGiftCode#98986c0d
//	case *tg.InputInvoiceStars: // inputInvoiceStars#65f00ce3
//	case *tg.InputInvoiceChatInviteSubscription: // inputInvoiceChatInviteSubscription#34e793f1
//	case *tg.InputInvoiceStarGift: // inputInvoiceStarGift#e8625e92
//	case *tg.InputInvoiceStarGiftUpgrade: // inputInvoiceStarGiftUpgrade#4d818d5d
//	case *tg.InputInvoiceStarGiftTransfer: // inputInvoiceStarGiftTransfer#4a5f5bd9
//	case *tg.InputInvoicePremiumGiftStars: // inputInvoicePremiumGiftStars#dabab2ef
//	case *tg.InputInvoiceBusinessBotTransferStars: // inputInvoiceBusinessBotTransferStars#f4997e42
//	case *tg.InputInvoiceStarGiftResale: // inputInvoiceStarGiftResale#c39f5324
//	case *tg.InputInvoiceStarGiftPrepaidUpgrade: // inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8
//	case *tg.InputInvoicePremiumAuthCode: // inputInvoicePremiumAuthCode#3e77f614
//	case *tg.InputInvoiceStarGiftDropOriginalDetails: // inputInvoiceStarGiftDropOriginalDetails#923d8d1
//	case *tg.InputInvoiceStarGiftAuctionBid: // inputInvoiceStarGiftAuctionBid#1ecafa10
//	default: panic(v)
//	}
type InputInvoiceClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() InputInvoiceClass

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

// DecodeInputInvoice implements binary de-serialization for InputInvoiceClass.
func ( *bin.Buffer) (InputInvoiceClass, error) {
	,  := .PeekID()
	if  != nil {
		return nil, 
	}
	switch  {
	case InputInvoiceMessageTypeID:
		// Decoding inputInvoiceMessage#c5b56859.
		 := InputInvoiceMessage{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceSlugTypeID:
		// Decoding inputInvoiceSlug#c326caef.
		 := InputInvoiceSlug{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoicePremiumGiftCodeTypeID:
		// Decoding inputInvoicePremiumGiftCode#98986c0d.
		 := InputInvoicePremiumGiftCode{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarsTypeID:
		// Decoding inputInvoiceStars#65f00ce3.
		 := InputInvoiceStars{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceChatInviteSubscriptionTypeID:
		// Decoding inputInvoiceChatInviteSubscription#34e793f1.
		 := InputInvoiceChatInviteSubscription{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftTypeID:
		// Decoding inputInvoiceStarGift#e8625e92.
		 := InputInvoiceStarGift{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftUpgradeTypeID:
		// Decoding inputInvoiceStarGiftUpgrade#4d818d5d.
		 := InputInvoiceStarGiftUpgrade{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftTransferTypeID:
		// Decoding inputInvoiceStarGiftTransfer#4a5f5bd9.
		 := InputInvoiceStarGiftTransfer{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoicePremiumGiftStarsTypeID:
		// Decoding inputInvoicePremiumGiftStars#dabab2ef.
		 := InputInvoicePremiumGiftStars{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceBusinessBotTransferStarsTypeID:
		// Decoding inputInvoiceBusinessBotTransferStars#f4997e42.
		 := InputInvoiceBusinessBotTransferStars{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftResaleTypeID:
		// Decoding inputInvoiceStarGiftResale#c39f5324.
		 := InputInvoiceStarGiftResale{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftPrepaidUpgradeTypeID:
		// Decoding inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8.
		 := InputInvoiceStarGiftPrepaidUpgrade{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoicePremiumAuthCodeTypeID:
		// Decoding inputInvoicePremiumAuthCode#3e77f614.
		 := InputInvoicePremiumAuthCode{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftDropOriginalDetailsTypeID:
		// Decoding inputInvoiceStarGiftDropOriginalDetails#923d8d1.
		 := InputInvoiceStarGiftDropOriginalDetails{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	case InputInvoiceStarGiftAuctionBidTypeID:
		// Decoding inputInvoiceStarGiftAuctionBid#1ecafa10.
		 := InputInvoiceStarGiftAuctionBid{}
		if  := .Decode();  != nil {
			return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", )
		}
		return &, nil
	default:
		return nil, fmt.Errorf("unable to decode InputInvoiceClass: %w", bin.NewUnexpectedID())
	}
}

// InputInvoice boxes the InputInvoiceClass providing a helper.
type InputInvoiceBox struct {
	InputInvoice InputInvoiceClass
}

// Decode implements bin.Decoder for InputInvoiceBox.
func ( *InputInvoiceBox) ( *bin.Buffer) error {
	if  == nil {
		return fmt.Errorf("unable to decode InputInvoiceBox to nil")
	}
	,  := DecodeInputInvoice()
	if  != nil {
		return fmt.Errorf("unable to decode boxed value: %w", )
	}
	.InputInvoice = 
	return nil
}

// Encode implements bin.Encode for InputInvoiceBox.
func ( *InputInvoiceBox) ( *bin.Buffer) error {
	if  == nil || .InputInvoice == nil {
		return fmt.Errorf("unable to encode InputInvoiceClass as nil")
	}
	return .InputInvoice.Encode()
}