package redis

import (
	
	
	
	
	

	
	
	
)

type Cmder interface {
	Name() string
	FullName() string
	Args() []interface{}
	String() string
	stringArg(int) string

	readTimeout() *time.Duration
	readReply(rd *proto.Reader) error

	SetErr(error)
	Err() error
}

func ( []Cmder,  error) {
	for ,  := range  {
		if .Err() == nil {
			.SetErr()
		}
	}
}

func ( []Cmder) error {
	for ,  := range  {
		if  := .Err();  != nil {
			return 
		}
	}
	return nil
}

func ( *proto.Writer,  []Cmder) error {
	for ,  := range  {
		if  := writeCmd(, );  != nil {
			return 
		}
	}
	return nil
}

func ( *proto.Writer,  Cmder) error {
	return .WriteArgs(.Args())
}

func ( Cmder,  *CommandInfo) int {
	switch .Name() {
	case "eval", "evalsha":
		if .stringArg(2) != "0" {
			return 3
		}

		return 0
	case "publish":
		return 1
https://github.com/redis/redis/issues/7493
		if .stringArg(1) == "usage" {
			return 2
		}
	}

	if  == nil {
		return 0
	}
	return int(.FirstKeyPos)
}

func ( Cmder,  interface{}) string {
	 := make([]byte, 0, 64)

	for ,  := range .Args() {
		if  > 0 {
			 = append(, ' ')
		}
		 = internal.AppendArg(, )
	}

	if  := .Err();  != nil {
		 = append(, ": "...)
		 = append(, .Error()...)
	} else if  != nil {
		 = append(, ": "...)
		 = internal.AppendArg(, )
	}

	return internal.String()
}
------------------------------------------------------------------------------

type baseCmd struct {
	ctx  context.Context
	args []interface{}
	err  error

	_readTimeout *time.Duration
}

var _ Cmder = (*Cmd)(nil)

func ( *baseCmd) () string {
	if len(.args) == 0 {
		return ""
Cmd name must be lower cased.
	return internal.ToLower(.stringArg(0))
}

func ( *baseCmd) () string {
	switch  := .Name();  {
	case "cluster", "command":
		if len(.args) == 1 {
			return 
		}
		if ,  := .args[1].(string);  {
			return  + " " + 
		}
		return 
	default:
		return 
	}
}

func ( *baseCmd) () []interface{} {
	return .args
}

func ( *baseCmd) ( int) string {
	if  < 0 ||  >= len(.args) {
		return ""
	}
	,  := .args[].(string)
	return 
}

func ( *baseCmd) ( error) {
	.err = 
}

func ( *baseCmd) () error {
	return .err
}

func ( *baseCmd) () *time.Duration {
	return ._readTimeout
}

func ( *baseCmd) ( time.Duration) {
	._readTimeout = &
}
------------------------------------------------------------------------------

type Cmd struct {
	baseCmd

	val interface{}
}

func ( context.Context,  ...interface{}) *Cmd {
	return &Cmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *Cmd) () string {
	return cmdString(, .val)
}

func ( *Cmd) () interface{} {
	return .val
}

func ( *Cmd) () (interface{}, error) {
	return .val, .err
}

func ( *Cmd) () (string, error) {
	if .err != nil {
		return "", .err
	}
	switch val := .val.(type) {
	case string:
		return , nil
	default:
		 := fmt.Errorf("redis: unexpected type=%T for String", )
		return "", 
	}
}

func ( *Cmd) () (int, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return int(), nil
	case string:
		return strconv.Atoi()
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Int", )
		return 0, 
	}
}

func ( *Cmd) () (int64, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return , nil
	case string:
		return strconv.ParseInt(, 10, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Int64", )
		return 0, 
	}
}

func ( *Cmd) () (uint64, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return uint64(), nil
	case string:
		return strconv.ParseUint(, 10, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Uint64", )
		return 0, 
	}
}

func ( *Cmd) () (float32, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return float32(), nil
	case string:
		,  := strconv.ParseFloat(, 32)
		if  != nil {
			return 0, 
		}
		return float32(), nil
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Float32", )
		return 0, 
	}
}

func ( *Cmd) () (float64, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return float64(), nil
	case string:
		return strconv.ParseFloat(, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Float64", )
		return 0, 
	}
}

func ( *Cmd) () (bool, error) {
	if .err != nil {
		return false, .err
	}
	switch val := .val.(type) {
	case int64:
		return  != 0, nil
	case string:
		return strconv.ParseBool()
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Bool", )
		return false, 
	}
}

func ( *Cmd) ( *proto.Reader) error {
	.val, .err = .ReadReply(sliceParser)
	return .err
}
sliceParser implements proto.MultiBulkParse.
func ( *proto.Reader,  int64) (interface{}, error) {
	 := make([]interface{}, )
	for  := 0;  < len(); ++ {
		,  := .ReadReply()
		if  != nil {
			if  == Nil {
				[] = nil
				continue
			}
			if ,  := .(proto.RedisError);  {
				[] = 
				continue
			}
			return nil, 
		}
		[] = 
	}
	return , nil
}
------------------------------------------------------------------------------

type SliceCmd struct {
	baseCmd

	val []interface{}
}

var _ Cmder = (*SliceCmd)(nil)

func ( context.Context,  ...interface{}) *SliceCmd {
	return &SliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *SliceCmd) () []interface{} {
	return .val
}

func ( *SliceCmd) () ([]interface{}, error) {
	return .val, .err
}

func ( *SliceCmd) () string {
	return cmdString(, .val)
}

func ( *SliceCmd) ( *proto.Reader) error {
	var  interface{}
	, .err = .ReadArrayReply(sliceParser)
	if .err != nil {
		return .err
	}
	.val = .([]interface{})
	return nil
}
------------------------------------------------------------------------------

type StatusCmd struct {
	baseCmd

	val string
}

var _ Cmder = (*StatusCmd)(nil)

func ( context.Context,  ...interface{}) *StatusCmd {
	return &StatusCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StatusCmd) () string {
	return .val
}

func ( *StatusCmd) () (string, error) {
	return .val, .err
}

func ( *StatusCmd) () string {
	return cmdString(, .val)
}

func ( *StatusCmd) ( *proto.Reader) error {
	.val, .err = .ReadString()
	return .err
}
------------------------------------------------------------------------------

type IntCmd struct {
	baseCmd

	val int64
}

var _ Cmder = (*IntCmd)(nil)

func ( context.Context,  ...interface{}) *IntCmd {
	return &IntCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *IntCmd) () int64 {
	return .val
}

func ( *IntCmd) () (int64, error) {
	return .val, .err
}

func ( *IntCmd) () (uint64, error) {
	return uint64(.val), .err
}

func ( *IntCmd) () string {
	return cmdString(, .val)
}

func ( *IntCmd) ( *proto.Reader) error {
	.val, .err = .ReadIntReply()
	return .err
}
------------------------------------------------------------------------------

type IntSliceCmd struct {
	baseCmd

	val []int64
}

var _ Cmder = (*IntSliceCmd)(nil)

func ( context.Context,  ...interface{}) *IntSliceCmd {
	return &IntSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *IntSliceCmd) () []int64 {
	return .val
}

func ( *IntSliceCmd) () ([]int64, error) {
	return .val, .err
}

func ( *IntSliceCmd) () string {
	return cmdString(, .val)
}

func ( *IntSliceCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]int64, )
		for  := 0;  < len(.val); ++ {
			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}
			.val[] = 
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type DurationCmd struct {
	baseCmd

	val       time.Duration
	precision time.Duration
}

var _ Cmder = (*DurationCmd)(nil)

func ( context.Context,  time.Duration,  ...interface{}) *DurationCmd {
	return &DurationCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
		precision: ,
	}
}

func ( *DurationCmd) () time.Duration {
	return .val
}

func ( *DurationCmd) () (time.Duration, error) {
	return .val, .err
}

func ( *DurationCmd) () string {
	return cmdString(, .val)
}

func ( *DurationCmd) ( *proto.Reader) error {
	var  int64
	, .err = .ReadIntReply()
	if .err != nil {
		return .err
	}
-2 if the key does not exist -1 if the key exists but has no associated expire
	case -2, -1:
		.val = time.Duration()
	default:
		.val = time.Duration() * .precision
	}
	return nil
}
------------------------------------------------------------------------------

type TimeCmd struct {
	baseCmd

	val time.Time
}

var _ Cmder = (*TimeCmd)(nil)

func ( context.Context,  ...interface{}) *TimeCmd {
	return &TimeCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *TimeCmd) () time.Time {
	return .val
}

func ( *TimeCmd) () (time.Time, error) {
	return .val, .err
}

func ( *TimeCmd) () string {
	return cmdString(, .val)
}

func ( *TimeCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		if  != 2 {
			return nil, fmt.Errorf("got %d elements, expected 2", )
		}

		,  := .ReadInt()
		if  != nil {
			return nil, 
		}

		,  := .ReadInt()
		if  != nil {
			return nil, 
		}

		.val = time.Unix(, *1000)
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type BoolCmd struct {
	baseCmd

	val bool
}

var _ Cmder = (*BoolCmd)(nil)

func ( context.Context,  ...interface{}) *BoolCmd {
	return &BoolCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *BoolCmd) () bool {
	return .val
}

func ( *BoolCmd) () (bool, error) {
	return .val, .err
}

func ( *BoolCmd) () string {
	return cmdString(, .val)
}

func ( *BoolCmd) ( *proto.Reader) error {
	var  interface{}
`SET key value NX` returns nil when key already exists. But `SETNX key value` returns bool (0/1). So convert nil to bool.
	if .err == Nil {
		.val = false
		.err = nil
		return nil
	}
	if .err != nil {
		return .err
	}
	switch v := .(type) {
	case int64:
		.val =  == 1
		return nil
	case string:
		.val =  == "OK"
		return nil
	default:
		.err = fmt.Errorf("got %T, wanted int64 or string", )
		return .err
	}
}
------------------------------------------------------------------------------

type StringCmd struct {
	baseCmd

	val string
}

var _ Cmder = (*StringCmd)(nil)

func ( context.Context,  ...interface{}) *StringCmd {
	return &StringCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringCmd) () string {
	return .val
}

func ( *StringCmd) () (string, error) {
	return .Val(), .err
}

func ( *StringCmd) () ([]byte, error) {
	return util.StringToBytes(.val), .err
}

func ( *StringCmd) () (int, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.Atoi(.Val())
}

func ( *StringCmd) () (int64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseInt(.Val(), 10, 64)
}

func ( *StringCmd) () (uint64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseUint(.Val(), 10, 64)
}

func ( *StringCmd) () (float32, error) {
	if .err != nil {
		return 0, .err
	}
	,  := strconv.ParseFloat(.Val(), 32)
	if  != nil {
		return 0, 
	}
	return float32(), nil
}

func ( *StringCmd) () (float64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseFloat(.Val(), 64)
}

func ( *StringCmd) () (time.Time, error) {
	if .err != nil {
		return time.Time{}, .err
	}
	return time.Parse(time.RFC3339Nano, .Val())
}

func ( *StringCmd) ( interface{}) error {
	if .err != nil {
		return .err
	}
	return proto.Scan([]byte(.val), )
}

func ( *StringCmd) () string {
	return cmdString(, .val)
}

func ( *StringCmd) ( *proto.Reader) error {
	.val, .err = .ReadString()
	return .err
}
------------------------------------------------------------------------------

type FloatCmd struct {
	baseCmd

	val float64
}

var _ Cmder = (*FloatCmd)(nil)

func ( context.Context,  ...interface{}) *FloatCmd {
	return &FloatCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *FloatCmd) () float64 {
	return .val
}

func ( *FloatCmd) () (float64, error) {
	return .Val(), .Err()
}

func ( *FloatCmd) () string {
	return cmdString(, .val)
}

func ( *FloatCmd) ( *proto.Reader) error {
	.val, .err = .ReadFloatReply()
	return .err
}
------------------------------------------------------------------------------

type StringSliceCmd struct {
	baseCmd

	val []string
}

var _ Cmder = (*StringSliceCmd)(nil)

func ( context.Context,  ...interface{}) *StringSliceCmd {
	return &StringSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringSliceCmd) () []string {
	return .val
}

func ( *StringSliceCmd) () ([]string, error) {
	return .Val(), .Err()
}

func ( *StringSliceCmd) () string {
	return cmdString(, .val)
}

func ( *StringSliceCmd) ( interface{}) error {
	return proto.ScanSlice(.Val(), )
}

func ( *StringSliceCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]string, )
		for  := 0;  < len(.val); ++ {
			switch ,  := .ReadString(); {
			case  == Nil:
				.val[] = ""
			case  != nil:
				return nil, 
			default:
				.val[] = 
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type BoolSliceCmd struct {
	baseCmd

	val []bool
}

var _ Cmder = (*BoolSliceCmd)(nil)

func ( context.Context,  ...interface{}) *BoolSliceCmd {
	return &BoolSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *BoolSliceCmd) () []bool {
	return .val
}

func ( *BoolSliceCmd) () ([]bool, error) {
	return .val, .err
}

func ( *BoolSliceCmd) () string {
	return cmdString(, .val)
}

func ( *BoolSliceCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]bool, )
		for  := 0;  < len(.val); ++ {
			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}
			.val[] =  == 1
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type StringStringMapCmd struct {
	baseCmd

	val map[string]string
}

var _ Cmder = (*StringStringMapCmd)(nil)

func ( context.Context,  ...interface{}) *StringStringMapCmd {
	return &StringStringMapCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringStringMapCmd) () map[string]string {
	return .val
}

func ( *StringStringMapCmd) () (map[string]string, error) {
	return .val, .err
}

func ( *StringStringMapCmd) () string {
	return cmdString(, .val)
}

func ( *StringStringMapCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make(map[string]string, /2)
		for  := int64(0);  < ;  += 2 {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			.val[] = 
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type StringIntMapCmd struct {
	baseCmd

	val map[string]int64
}

var _ Cmder = (*StringIntMapCmd)(nil)

func ( context.Context,  ...interface{}) *StringIntMapCmd {
	return &StringIntMapCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringIntMapCmd) () map[string]int64 {
	return .val
}

func ( *StringIntMapCmd) () (map[string]int64, error) {
	return .val, .err
}

func ( *StringIntMapCmd) () string {
	return cmdString(, .val)
}

func ( *StringIntMapCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make(map[string]int64, /2)
		for  := int64(0);  < ;  += 2 {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}

			.val[] = 
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type StringStructMapCmd struct {
	baseCmd

	val map[string]struct{}
}

var _ Cmder = (*StringStructMapCmd)(nil)

func ( context.Context,  ...interface{}) *StringStructMapCmd {
	return &StringStructMapCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringStructMapCmd) () map[string]struct{} {
	return .val
}

func ( *StringStructMapCmd) () (map[string]struct{}, error) {
	return .val, .err
}

func ( *StringStructMapCmd) () string {
	return cmdString(, .val)
}

func ( *StringStructMapCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make(map[string]struct{}, )
		for  := int64(0);  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}
			.val[] = struct{}{}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type XMessage struct {
	ID     string
	Values map[string]interface{}
}

type XMessageSliceCmd struct {
	baseCmd

	val []XMessage
}

var _ Cmder = (*XMessageSliceCmd)(nil)

func ( context.Context,  ...interface{}) *XMessageSliceCmd {
	return &XMessageSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XMessageSliceCmd) () []XMessage {
	return .val
}

func ( *XMessageSliceCmd) () ([]XMessage, error) {
	return .val, .err
}

func ( *XMessageSliceCmd) () string {
	return cmdString(, .val)
}

func ( *XMessageSliceCmd) ( *proto.Reader) error {
	var  interface{}
	, .err = .ReadArrayReply(xMessageSliceParser)
	if .err != nil {
		return .err
	}
	.val = .([]XMessage)
	return nil
}
xMessageSliceParser implements proto.MultiBulkParse.
func ( *proto.Reader,  int64) (interface{}, error) {
	 := make([]XMessage, )
	for  := 0;  < len(); ++ {
		 := 
		,  := .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			var  map[string]interface{}

			,  := .ReadArrayReply(stringInterfaceMapParser)
			if  != nil {
				if  != proto.Nil {
					return nil, 
				}
			} else {
				 = .(map[string]interface{})
			}

			[] = XMessage{
				ID:     ,
				Values: ,
			}
			return nil, nil
		})
		if  != nil {
			return nil, 
		}
	}
	return , nil
}
stringInterfaceMapParser implements proto.MultiBulkParse.
func ( *proto.Reader,  int64) (interface{}, error) {
	 := make(map[string]interface{}, /2)
	for  := int64(0);  < ;  += 2 {
		,  := .ReadString()
		if  != nil {
			return nil, 
		}

		,  := .ReadString()
		if  != nil {
			return nil, 
		}

		[] = 
	}
	return , nil
}
------------------------------------------------------------------------------

type XStream struct {
	Stream   string
	Messages []XMessage
}

type XStreamSliceCmd struct {
	baseCmd

	val []XStream
}

var _ Cmder = (*XStreamSliceCmd)(nil)

func ( context.Context,  ...interface{}) *XStreamSliceCmd {
	return &XStreamSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XStreamSliceCmd) () []XStream {
	return .val
}

func ( *XStreamSliceCmd) () ([]XStream, error) {
	return .val, .err
}

func ( *XStreamSliceCmd) () string {
	return cmdString(, .val)
}

func ( *XStreamSliceCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]XStream, )
		for  := 0;  < len(.val); ++ {
			 := 
			,  := .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
				if  != 2 {
					return nil, fmt.Errorf("got %d, wanted 2", )
				}

				,  := .ReadString()
				if  != nil {
					return nil, 
				}

				,  := .ReadArrayReply(xMessageSliceParser)
				if  != nil {
					return nil, 
				}

				.val[] = XStream{
					Stream:   ,
					Messages: .([]XMessage),
				}
				return nil, nil
			})
			if  != nil {
				return nil, 
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type XPending struct {
	Count     int64
	Lower     string
	Higher    string
	Consumers map[string]int64
}

type XPendingCmd struct {
	baseCmd
	val *XPending
}

var _ Cmder = (*XPendingCmd)(nil)

func ( context.Context,  ...interface{}) *XPendingCmd {
	return &XPendingCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XPendingCmd) () *XPending {
	return .val
}

func ( *XPendingCmd) () (*XPending, error) {
	return .val, .err
}

func ( *XPendingCmd) () string {
	return cmdString(, .val)
}

func ( *XPendingCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		if  != 4 {
			return nil, fmt.Errorf("got %d, wanted 4", )
		}

		,  := .ReadIntReply()
		if  != nil {
			return nil, 
		}

		,  := .ReadString()
		if  != nil &&  != Nil {
			return nil, 
		}

		,  := .ReadString()
		if  != nil &&  != Nil {
			return nil, 
		}

		.val = &XPending{
			Count:  ,
			Lower:  ,
			Higher: ,
		}
		_,  = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
			for  := int64(0);  < ; ++ {
				_,  = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
					if  != 2 {
						return nil, fmt.Errorf("got %d, wanted 2", )
					}

					,  := .ReadString()
					if  != nil {
						return nil, 
					}

					,  := .ReadInt()
					if  != nil {
						return nil, 
					}

					if .val.Consumers == nil {
						.val.Consumers = make(map[string]int64)
					}
					.val.Consumers[] = 

					return nil, nil
				})
				if  != nil {
					return nil, 
				}
			}
			return nil, nil
		})
		if  != nil &&  != Nil {
			return nil, 
		}

		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type XPendingExt struct {
	ID         string
	Consumer   string
	Idle       time.Duration
	RetryCount int64
}

type XPendingExtCmd struct {
	baseCmd
	val []XPendingExt
}

var _ Cmder = (*XPendingExtCmd)(nil)

func ( context.Context,  ...interface{}) *XPendingExtCmd {
	return &XPendingExtCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XPendingExtCmd) () []XPendingExt {
	return .val
}

func ( *XPendingExtCmd) () ([]XPendingExt, error) {
	return .val, .err
}

func ( *XPendingExtCmd) () string {
	return cmdString(, .val)
}

func ( *XPendingExtCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]XPendingExt, 0, )
		for  := int64(0);  < ; ++ {
			,  := .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
				if  != 4 {
					return nil, fmt.Errorf("got %d, wanted 4", )
				}

				,  := .ReadString()
				if  != nil {
					return nil, 
				}

				,  := .ReadString()
				if  != nil &&  != Nil {
					return nil, 
				}

				,  := .ReadIntReply()
				if  != nil &&  != Nil {
					return nil, 
				}

				,  := .ReadIntReply()
				if  != nil &&  != Nil {
					return nil, 
				}

				.val = append(.val, XPendingExt{
					ID:         ,
					Consumer:   ,
					Idle:       time.Duration() * time.Millisecond,
					RetryCount: ,
				})
				return nil, nil
			})
			if  != nil {
				return nil, 
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type XInfoGroupsCmd struct {
	baseCmd
	val []XInfoGroups
}

type XInfoGroups struct {
	Name            string
	Consumers       int64
	Pending         int64
	LastDeliveredID string
}

var _ Cmder = (*XInfoGroupsCmd)(nil)

func ( context.Context,  string) *XInfoGroupsCmd {
	return &XInfoGroupsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: []interface{}{"xinfo", "groups", },
		},
	}
}

func ( *XInfoGroupsCmd) () []XInfoGroups {
	return .val
}

func ( *XInfoGroupsCmd) () ([]XInfoGroups, error) {
	return .val, .err
}

func ( *XInfoGroupsCmd) () string {
	return cmdString(, .val)
}

func ( *XInfoGroupsCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(
		func( *proto.Reader,  int64) (interface{}, error) {
			for  := int64(0);  < ; ++ {
				,  := .ReadReply(xGroupInfoParser)
				if  != nil {
					return nil, 
				}
				.val = append(.val, .(XInfoGroups))
			}
			return nil, nil
		})
	return nil
}

func ( *proto.Reader,  int64) (interface{}, error) {
	if  != 8 {
		return nil, fmt.Errorf("redis: got %d elements in XINFO GROUPS reply,"+
			"wanted 8", )
	}
	var (
		 error
		 XInfoGroups
		 string
		 string
	)

	for  := 0;  < 4; ++ {
		,  = .ReadString()
		if  != nil {
			return nil, 
		}
		,  = .ReadString()
		if  != nil {
			return nil, 
		}
		switch  {
		case "name":
			.Name = 
		case "consumers":
			.Consumers,  = strconv.ParseInt(, 0, 64)
		case "pending":
			.Pending,  = strconv.ParseInt(, 0, 64)
		case "last-delivered-id":
			.LastDeliveredID = 
		default:
			return nil, fmt.Errorf("redis: unexpected content %s "+
				"in XINFO GROUPS reply", )
		}
		if  != nil {
			return nil, 
		}
	}
	return , 
}
------------------------------------------------------------------------------

type ZSliceCmd struct {
	baseCmd

	val []Z
}

var _ Cmder = (*ZSliceCmd)(nil)

func ( context.Context,  ...interface{}) *ZSliceCmd {
	return &ZSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ZSliceCmd) () []Z {
	return .val
}

func ( *ZSliceCmd) () ([]Z, error) {
	return .val, .err
}

func ( *ZSliceCmd) () string {
	return cmdString(, .val)
}

func ( *ZSliceCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]Z, /2)
		for  := 0;  < len(.val); ++ {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			,  := .ReadFloatReply()
			if  != nil {
				return nil, 
			}

			.val[] = Z{
				Member: ,
				Score:  ,
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type ZWithKeyCmd struct {
	baseCmd

	val *ZWithKey
}

var _ Cmder = (*ZWithKeyCmd)(nil)

func ( context.Context,  ...interface{}) *ZWithKeyCmd {
	return &ZWithKeyCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ZWithKeyCmd) () *ZWithKey {
	return .val
}

func ( *ZWithKeyCmd) () (*ZWithKey, error) {
	return .Val(), .Err()
}

func ( *ZWithKeyCmd) () string {
	return cmdString(, .val)
}

func ( *ZWithKeyCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		if  != 3 {
			return nil, fmt.Errorf("got %d elements, expected 3", )
		}

		.val = &ZWithKey{}
		var  error

		.val.Key,  = .ReadString()
		if  != nil {
			return nil, 
		}

		.val.Member,  = .ReadString()
		if  != nil {
			return nil, 
		}

		.val.Score,  = .ReadFloatReply()
		if  != nil {
			return nil, 
		}

		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type ScanCmd struct {
	baseCmd

	page   []string
	cursor uint64

	process cmdable
}

var _ Cmder = (*ScanCmd)(nil)

func ( context.Context,  cmdable,  ...interface{}) *ScanCmd {
	return &ScanCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
		process: ,
	}
}

func ( *ScanCmd) () ( []string,  uint64) {
	return .page, .cursor
}

func ( *ScanCmd) () ( []string,  uint64,  error) {
	return .page, .cursor, .err
}

func ( *ScanCmd) () string {
	return cmdString(, .page)
}

func ( *ScanCmd) ( *proto.Reader) error {
	.page, .cursor, .err = .ReadScanReply()
	return .err
}
Iterator creates a new ScanIterator.
func ( *ScanCmd) () *ScanIterator {
	return &ScanIterator{
		cmd: ,
	}
}
------------------------------------------------------------------------------

type ClusterNode struct {
	ID   string
	Addr string
}

type ClusterSlot struct {
	Start int
	End   int
	Nodes []ClusterNode
}

type ClusterSlotsCmd struct {
	baseCmd

	val []ClusterSlot
}

var _ Cmder = (*ClusterSlotsCmd)(nil)

func ( context.Context,  ...interface{}) *ClusterSlotsCmd {
	return &ClusterSlotsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ClusterSlotsCmd) () []ClusterSlot {
	return .val
}

func ( *ClusterSlotsCmd) () ([]ClusterSlot, error) {
	return .Val(), .Err()
}

func ( *ClusterSlotsCmd) () string {
	return cmdString(, .val)
}

func ( *ClusterSlotsCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]ClusterSlot, )
		for  := 0;  < len(.val); ++ {
			,  := .ReadArrayLen()
			if  != nil {
				return nil, 
			}
			if  < 2 {
				 := fmt.Errorf("redis: got %d elements in cluster info, expected at least 2", )
				return nil, 
			}

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}

			 := make([]ClusterNode, -2)
			for  := 0;  < len(); ++ {
				,  := .ReadArrayLen()
				if  != nil {
					return nil, 
				}
				if  != 2 &&  != 3 {
					 := fmt.Errorf("got %d elements in cluster info address, expected 2 or 3", )
					return nil, 
				}

				,  := .ReadString()
				if  != nil {
					return nil, 
				}

				,  := .ReadString()
				if  != nil {
					return nil, 
				}

				[].Addr = net.JoinHostPort(, )

				if  == 3 {
					,  := .ReadString()
					if  != nil {
						return nil, 
					}
					[].ID = 
				}
			}

			.val[] = ClusterSlot{
				Start: int(),
				End:   int(),
				Nodes: ,
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------
GeoLocation is used with GeoAdd to add geospatial location.
GeoRadiusQuery is used with GeoRadius to query geospatial index.
type GeoRadiusQuery struct {
Can be m, km, ft, or mi. Default is km.
Can be ASC or DESC. Default is no sort order.
	Sort      string
	Store     string
	StoreDist string
}

type GeoLocationCmd struct {
	baseCmd

	q         *GeoRadiusQuery
	locations []GeoLocation
}

var _ Cmder = (*GeoLocationCmd)(nil)

func ( context.Context,  *GeoRadiusQuery,  ...interface{}) *GeoLocationCmd {
	return &GeoLocationCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: geoLocationArgs(, ...),
		},
		q: ,
	}
}

func ( *GeoRadiusQuery,  ...interface{}) []interface{} {
	 = append(, .Radius)
	if .Unit != "" {
		 = append(, .Unit)
	} else {
		 = append(, "km")
	}
	if .WithCoord {
		 = append(, "withcoord")
	}
	if .WithDist {
		 = append(, "withdist")
	}
	if .WithGeoHash {
		 = append(, "withhash")
	}
	if .Count > 0 {
		 = append(, "count", .Count)
	}
	if .Sort != "" {
		 = append(, .Sort)
	}
	if .Store != "" {
		 = append(, "store")
		 = append(, .Store)
	}
	if .StoreDist != "" {
		 = append(, "storedist")
		 = append(, .StoreDist)
	}
	return 
}

func ( *GeoLocationCmd) () []GeoLocation {
	return .locations
}

func ( *GeoLocationCmd) () ([]GeoLocation, error) {
	return .locations, .err
}

func ( *GeoLocationCmd) () string {
	return cmdString(, .locations)
}

func ( *GeoLocationCmd) ( *proto.Reader) error {
	var  interface{}
	, .err = .ReadArrayReply(newGeoLocationSliceParser(.q))
	if .err != nil {
		return .err
	}
	.locations = .([]GeoLocation)
	return nil
}

func ( *GeoRadiusQuery) proto.MultiBulkParse {
	return func( *proto.Reader,  int64) (interface{}, error) {
		 := make([]GeoLocation, 0, )
		for  := int64(0);  < ; ++ {
			,  := .ReadReply(newGeoLocationParser())
			if  != nil {
				return nil, 
			}
			switch vv := .(type) {
			case string:
				 = append(, GeoLocation{
					Name: ,
				})
TODO: avoid copying
				 = append(, *)
			default:
				return nil, fmt.Errorf("got %T, expected string or *GeoLocation", )
			}
		}
		return , nil
	}
}

func ( *GeoRadiusQuery) proto.MultiBulkParse {
	return func( *proto.Reader,  int64) (interface{}, error) {
		var  GeoLocation
		var  error

		.Name,  = .ReadString()
		if  != nil {
			return nil, 
		}
		if .WithDist {
			.Dist,  = .ReadFloatReply()
			if  != nil {
				return nil, 
			}
		}
		if .WithGeoHash {
			.GeoHash,  = .ReadIntReply()
			if  != nil {
				return nil, 
			}
		}
		if .WithCoord {
			,  := .ReadArrayLen()
			if  != nil {
				return nil, 
			}
			if  != 2 {
				return nil, fmt.Errorf("got %d coordinates, expected 2", )
			}

			.Longitude,  = .ReadFloatReply()
			if  != nil {
				return nil, 
			}
			.Latitude,  = .ReadFloatReply()
			if  != nil {
				return nil, 
			}
		}

		return &, nil
	}
}
------------------------------------------------------------------------------

type GeoPos struct {
	Longitude, Latitude float64
}

type GeoPosCmd struct {
	baseCmd

	val []*GeoPos
}

var _ Cmder = (*GeoPosCmd)(nil)

func ( context.Context,  ...interface{}) *GeoPosCmd {
	return &GeoPosCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *GeoPosCmd) () []*GeoPos {
	return .val
}

func ( *GeoPosCmd) () ([]*GeoPos, error) {
	return .Val(), .Err()
}

func ( *GeoPosCmd) () string {
	return cmdString(, .val)
}

func ( *GeoPosCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]*GeoPos, )
		for  := 0;  < len(.val); ++ {
			 := 
			,  := .ReadReply(func( *proto.Reader,  int64) (interface{}, error) {
				,  := .ReadFloatReply()
				if  != nil {
					return nil, 
				}

				,  := .ReadFloatReply()
				if  != nil {
					return nil, 
				}

				.val[] = &GeoPos{
					Longitude: ,
					Latitude:  ,
				}
				return nil, nil
			})
			if  != nil {
				if  == Nil {
					.val[] = nil
					continue
				}
				return nil, 
			}
		}
		return nil, nil
	})
	return .err
}
------------------------------------------------------------------------------

type CommandInfo struct {
	Name        string
	Arity       int8
	Flags       []string
	ACLFlags    []string
	FirstKeyPos int8
	LastKeyPos  int8
	StepCount   int8
	ReadOnly    bool
}

type CommandsInfoCmd struct {
	baseCmd

	val map[string]*CommandInfo
}

var _ Cmder = (*CommandsInfoCmd)(nil)

func ( context.Context,  ...interface{}) *CommandsInfoCmd {
	return &CommandsInfoCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *CommandsInfoCmd) () map[string]*CommandInfo {
	return .val
}

func ( *CommandsInfoCmd) () (map[string]*CommandInfo, error) {
	return .Val(), .Err()
}

func ( *CommandsInfoCmd) () string {
	return cmdString(, .val)
}

func ( *CommandsInfoCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make(map[string]*CommandInfo, )
		for  := int64(0);  < ; ++ {
			,  := .ReadReply(commandInfoParser)
			if  != nil {
				return nil, 
			}
			 := .(*CommandInfo)
			.val[.Name] = 
		}
		return nil, nil
	})
	return .err
}

func ( *proto.Reader,  int64) (interface{}, error) {
	const  = 6
	const  = 7

	switch  {
continue
	default:
		return nil, fmt.Errorf("redis: got %d elements in COMMAND reply, wanted 7", )
	}

	var  CommandInfo
	var  error

	.Name,  = .ReadString()
	if  != nil {
		return nil, 
	}

	,  := .ReadIntReply()
	if  != nil {
		return nil, 
	}
	.Arity = int8()

	_,  = .ReadReply(func( *proto.Reader,  int64) (interface{}, error) {
		.Flags = make([]string, )
		for  := 0;  < len(.Flags); ++ {
			switch ,  := .ReadString(); {
			case  == Nil:
				.Flags[] = ""
			case  != nil:
				return nil, 
			default:
				.Flags[] = 
			}
		}
		return nil, nil
	})
	if  != nil {
		return nil, 
	}

	,  := .ReadIntReply()
	if  != nil {
		return nil, 
	}
	.FirstKeyPos = int8()

	,  := .ReadIntReply()
	if  != nil {
		return nil, 
	}
	.LastKeyPos = int8()

	,  := .ReadIntReply()
	if  != nil {
		return nil, 
	}
	.StepCount = int8()

	for ,  := range .Flags {
		if  == "readonly" {
			.ReadOnly = true
			break
		}
	}

	if  ==  {
		return &, nil
	}

	_,  = .ReadReply(func( *proto.Reader,  int64) (interface{}, error) {
		.ACLFlags = make([]string, )
		for  := 0;  < len(.ACLFlags); ++ {
			switch ,  := .ReadString(); {
			case  == Nil:
				.ACLFlags[] = ""
			case  != nil:
				return nil, 
			default:
				.ACLFlags[] = 
			}
		}
		return nil, nil
	})
	if  != nil {
		return nil, 
	}

	return &, nil
}
------------------------------------------------------------------------------

type cmdsInfoCache struct {
	fn func() (map[string]*CommandInfo, error)

	once internal.Once
	cmds map[string]*CommandInfo
}

func ( func() (map[string]*CommandInfo, error)) *cmdsInfoCache {
	return &cmdsInfoCache{
		fn: ,
	}
}

func ( *cmdsInfoCache) () (map[string]*CommandInfo, error) {
	 := .once.Do(func() error {
		,  := .fn()
		if  != nil {
			return 
		}
Extensions have cmd names in upper case. Convert them to lower case.
		for ,  := range  {
			 := internal.ToLower()
			if  !=  {
				[] = 
			}
		}

		.cmds = 
		return nil
	})
	return .cmds, 
}
------------------------------------------------------------------------------
These are also optional fields emitted only by Redis 4.0 or greater: https://redis.io/commands/slowlog#output-format
	ClientAddr string
	ClientName string
}

type SlowLogCmd struct {
	baseCmd

	val []SlowLog
}

var _ Cmder = (*SlowLogCmd)(nil)

func ( context.Context,  ...interface{}) *SlowLogCmd {
	return &SlowLogCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *SlowLogCmd) () []SlowLog {
	return .val
}

func ( *SlowLogCmd) () ([]SlowLog, error) {
	return .Val(), .Err()
}

func ( *SlowLogCmd) () string {
	return cmdString(, .val)
}

func ( *SlowLogCmd) ( *proto.Reader) error {
	_, .err = .ReadArrayReply(func( *proto.Reader,  int64) (interface{}, error) {
		.val = make([]SlowLog, )
		for  := 0;  < len(.val); ++ {
			,  := .ReadArrayLen()
			if  != nil {
				return nil, 
			}
			if  < 4 {
				 := fmt.Errorf("redis: got %d elements in slowlog get, expected at least 4", )
				return nil, 
			}

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}
			 := time.Unix(, 0)

			,  := .ReadIntReply()
			if  != nil {
				return nil, 
			}
			 := time.Duration() * time.Microsecond

			,  := .ReadArrayLen()
			if  != nil {
				return nil, 
			}
			if  < 1 {
				 := fmt.Errorf("redis: got %d elements commands reply in slowlog get, expected at least 1", )
				return nil, 
			}

			 := make([]string, )
			for  := 0;  < int(); ++ {
				[],  = .ReadString()
				if  != nil {
					return nil, 
				}
			}

			var ,  string
			for  := 4;  < int(); ++ {
				,  := .ReadString()
				if  != nil {
					return nil, 
				}
				if  == 4 {
					 = 
				} else if  == 5 {
					 = 
				}
			}

			.val[] = SlowLog{
				ID:         ,
				Time:       ,
				Duration:   ,
				Args:       ,
				ClientAddr: ,
				ClientName: ,
			}
		}
		return nil, nil
	})
	return .err