// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#include <lib/fidl/internal.h>

static const struct FidlCodedVector Vectorunboundednotnullable_26StringunboundednotnullableTable;
static const struct FidlCodedString StringunboundednotnullableTable;
static const struct FidlCodedVector Vector9notnullable_26StringunboundednotnullableTable;
static const struct FidlCodedVector Vector5notnullable_26StringunboundednotnullableTable;
static const struct FidlCodedVector Vector5notnullable_33test_someotherlibrary_ReferenceMeTable;
extern const struct FidlCodedStruct test_someotherlibrary_ReferenceMeTable;
static const struct FidlCodedHandle Handlechannel2147483648notnullableTable;
static const struct FidlCodedHandle Handlechannel2147483648nullableTable;

static bool EnumValidatorFor_test_aliases_obj_type(uint64_t v) {
  switch (v) {
    case 0u:
    case 4u:
      return true;
    default:
      return false;
  }
}
const struct FidlCodedEnum test_aliases_obj_typeTable = {
    .tag = kFidlTypeEnum,
    .name = "test.aliases/obj_type",
    .underlying_type = kFidlCodedPrimitiveSubtype_Uint32,
    .strictness = kFidlStrictness_Strict,
    .validate = EnumValidatorFor_test_aliases_obj_type,
};

static const struct FidlStructElement Fields34test_aliases_ExampleOfUseOfAliases[] = {
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .mask_64 = 0xffffffff00000000,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 8,
            .field_type = (const fidl_type_t*)&Vectorunboundednotnullable_26StringunboundednotnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 24,
            .field_type = (const fidl_type_t*)&Vector9notnullable_26StringunboundednotnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 40,
            .field_type = (const fidl_type_t*)&Vector5notnullable_26StringunboundednotnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 56,
            .field_type = (const fidl_type_t*)&Vector5notnullable_33test_someotherlibrary_ReferenceMeTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 72,
            .field_type = (const fidl_type_t*)&Handlechannel2147483648notnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 76,
            .field_type = (const fidl_type_t*)&Handlechannel2147483648notnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 80,
            .field_type = (const fidl_type_t*)&Handlechannel2147483648nullableTable,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 80,
            .mask_64 = 0xffffffff00000000,
        },
    },
};
const struct FidlCodedStruct test_aliases_ExampleOfUseOfAliasesTable = {
    .tag = kFidlTypeStruct,
    .name = "test.aliases/ExampleOfUseOfAliases",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 88,
    .elements = Fields34test_aliases_ExampleOfUseOfAliases,
    .element_count = 9,
};

static const struct FidlCodedVector Vectorunboundednotnullable_26StringunboundednotnullableTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&StringunboundednotnullableTable,
    .max_count = 4294967295,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 16,
};

static const struct FidlCodedVector Vector9notnullable_26StringunboundednotnullableTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&StringunboundednotnullableTable,
    .max_count = 9,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 16,
};

static const struct FidlCodedVector Vector5notnullable_26StringunboundednotnullableTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&StringunboundednotnullableTable,
    .max_count = 5,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 16,
};

static const struct FidlCodedVector Vector5notnullable_33test_someotherlibrary_ReferenceMeTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&test_someotherlibrary_ReferenceMeTable,
    .max_count = 5,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 1,
};

static const struct FidlCodedString StringunboundednotnullableTable = {
    .tag = kFidlTypeString,
    .max_size = 4294967295,
    .nullable = kFidlNullability_Nonnullable,
};

static const struct FidlCodedHandle Handlechannel2147483648notnullableTable = {
    .tag = kFidlTypeHandle,
    .handle_subtype = ZX_OBJ_TYPE_CHANNEL,
    .handle_rights = 0x80000000,
    .nullable = kFidlNullability_Nonnullable,
};

static const struct FidlCodedHandle Handlechannel2147483648nullableTable = {
    .tag = kFidlTypeHandle,
    .handle_subtype = ZX_OBJ_TYPE_CHANNEL,
    .handle_rights = 0x80000000,
    .nullable = kFidlNullability_Nullable,
};
