// Code generated by fidlgen; DO NOT EDIT.

package experimentalmaybefromtypealias

import (
	_bindings "syscall/zx/fidl"
)

type Testing struct {
	_   struct{}                             `fidl:"s" fidl_size_v2:"704" fidl_alignment_v2:"8"`
	U1  uint64                               `fidl_offset_v2:"0"`
	U2  []uint64                             `fidl_offset_v2:"8" fidl_bounds:"1"`
	U3  [1]uint64                            `fidl_offset_v2:"24"`
	U4  [][]uint64                           `fidl_offset_v2:"32" fidl_bounds:",1"`
	U5  [][1]uint64                          `fidl_offset_v2:"48" fidl_bounds:""`
	U6  [4][]uint64                          `fidl_offset_v2:"64" fidl_bounds:"1"`
	U7  [4][1]uint64                         `fidl_offset_v2:"128"`
	V1  *[]uint64                            `fidl_offset_v2:"160" fidl_bounds:""`
	V2  []*[]uint64                          `fidl_offset_v2:"176" fidl_bounds:""`
	V3  [4]*[]uint64                         `fidl_offset_v2:"192" fidl_bounds:""`
	A1  [1]uint64                            `fidl_offset_v2:"256"`
	A2  [][1]uint64                          `fidl_offset_v2:"264" fidl_bounds:""`
	A3  [4][1]uint64                         `fidl_offset_v2:"280"`
	R1  MyProtocolWithCtxInterfaceRequest    `fidl_offset_v2:"312" fidl_handle_subtype:"4" fidl_bounds:"1"`
	R2  []MyProtocolWithCtxInterfaceRequest  `fidl_offset_v2:"320" fidl_handle_subtype:"4" fidl_bounds:",1"`
	R3  [4]MyProtocolWithCtxInterfaceRequest `fidl_offset_v2:"336" fidl_handle_subtype:"4" fidl_bounds:"1"`
	B1  []uint8                              `fidl_offset_v2:"352" fidl_bounds:""`
	B2  [][]uint8                            `fidl_offset_v2:"368" fidl_bounds:""`
	B3  [4][]uint8                           `fidl_offset_v2:"384" fidl_bounds:""`
	S1  string                               `fidl_offset_v2:"448" fidl_bounds:""`
	S2  []string                             `fidl_offset_v2:"464" fidl_bounds:""`
	S3  [4]string                            `fidl_offset_v2:"480" fidl_bounds:""`
	Vv1 []uint64                             `fidl_offset_v2:"544" fidl_bounds:"2"`
	Vv2 [][]uint64                           `fidl_offset_v2:"560" fidl_bounds:"3,2"`
	Vv3 [3][]uint64                          `fidl_offset_v2:"576" fidl_bounds:"2"`
	Aa1 [2]uint64                            `fidl_offset_v2:"624"`
	Aa2 [][2]uint64                          `fidl_offset_v2:"640" fidl_bounds:"3"`
	Aa3 [3][2]uint64                         `fidl_offset_v2:"656"`
}

var _mTesting = _bindings.CreateLazyMarshaler(Testing{})

func (msg *Testing) Marshaler() _bindings.Marshaler {
	return _mTesting
}

const ()

type MyProtocolWithCtxInterface _bindings.ChannelProxy

type MyProtocolWithCtx interface {
}

type MyProtocolWithCtxTransitionalBase struct{}

type MyProtocolWithCtxInterfaceRequest _bindings.InterfaceRequest

func NewMyProtocolWithCtxInterfaceRequest() (MyProtocolWithCtxInterfaceRequest, *MyProtocolWithCtxInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return MyProtocolWithCtxInterfaceRequest(req), (*MyProtocolWithCtxInterface)(cli), err
}

type MyProtocolWithCtxStub struct {
	Impl MyProtocolWithCtx
}

func (s_ *MyProtocolWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
	switch args_.Ordinal {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type MyProtocolEventProxy _bindings.ChannelProxy
