
/*** <<< INCLUDES [PDU] >>> ***/

#include "Sequence.h"
#include "Set.h"
#include "SequenceOf.h"
#include "ExtensibleSet.h"
#include "ExtensibleSequence.h"
#include "ExtensibleSequence2.h"
#include "SetOfNULL.h"
#include "SetOfREAL.h"
#include "SetOfEnums.h"
#include "NamedSetOfNULL.h"
#include "NamedSetOfREAL.h"
#include "NamedSetOfEnums.h"
#include "SeqOfZuka.h"
#include "SetOfChoice.h"
#include "NamedSetOfChoice.h"
#include <constr_CHOICE.h>

/*** <<< DEPS [PDU] >>> ***/

typedef enum PDU_PR {
	PDU_PR_NOTHING,	/* No components present */
	PDU_PR_sequence,
	PDU_PR_set,
	PDU_PR_sequenceOf,
	PDU_PR_extensibleSet,
	PDU_PR_extensibleSequence,
	PDU_PR_extensibleSequence2,
	PDU_PR_setOfNULL,
	PDU_PR_setOfREAL,
	PDU_PR_setOfEnums,
	PDU_PR_namedSetOfNULL,
	PDU_PR_namedSetOfREAL,
	PDU_PR_namedSetOfEnums,
	PDU_PR_seqOfZuka,
	PDU_PR_setOfChoice,
	PDU_PR_namedSetOfChoice
	/* Extensions may appear below */
	
} PDU_PR;

/*** <<< TYPE-DECLS [PDU] >>> ***/

typedef struct PDU {
	PDU_PR present;
	union PDU_u {
		Sequence_t	 sequence;
		Set_t	 set;
		SequenceOf_t	 sequenceOf;
		ExtensibleSet_t	 extensibleSet;
		ExtensibleSequence_t	 extensibleSequence;
		ExtensibleSequence2_t	 extensibleSequence2;
		SetOfNULL_t	 setOfNULL;
		SetOfREAL_t	 setOfREAL;
		SetOfEnums_t	 setOfEnums;
		NamedSetOfNULL_t	 namedSetOfNULL;
		NamedSetOfREAL_t	 namedSetOfREAL;
		NamedSetOfEnums_t	 namedSetOfEnums;
		SeqOfZuka_t	 seqOfZuka;
		SetOfChoice_t	 setOfChoice;
		NamedSetOfChoice_t	 namedSetOfChoice;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} PDU_t;

/*** <<< FUNC-DECLS [PDU] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_PDU;

/*** <<< STAT-DEFS [PDU] >>> ***/

static asn_TYPE_member_t asn_MBR_PDU_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Sequence,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "sequence"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.set),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Set,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "set"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequenceOf),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SequenceOf,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "sequenceOf"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSet),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_ExtensibleSet,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "extensibleSet"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_ExtensibleSequence,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "extensibleSequence"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_ExtensibleSequence2,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "extensibleSequence2"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL),
		.tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SetOfNULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "setOfNULL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfREAL),
		.tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SetOfREAL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "setOfREAL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfEnums),
		.tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SetOfEnums,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "setOfEnums"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfNULL),
		.tag = (ASN_TAG_CLASS_CONTEXT | (9 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NamedSetOfNULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "namedSetOfNULL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfREAL),
		.tag = (ASN_TAG_CLASS_CONTEXT | (10 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NamedSetOfREAL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "namedSetOfREAL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfEnums),
		.tag = (ASN_TAG_CLASS_CONTEXT | (11 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NamedSetOfEnums,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "namedSetOfEnums"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka),
		.tag = (ASN_TAG_CLASS_CONTEXT | (12 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SeqOfZuka,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "seqOfZuka"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfChoice),
		.tag = (ASN_TAG_CLASS_CONTEXT | (13 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_SetOfChoice,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "setOfChoice"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.namedSetOfChoice),
		.tag = (ASN_TAG_CLASS_CONTEXT | (14 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NamedSetOfChoice,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "namedSetOfChoice"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sequence */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sequenceOf */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* extensibleSet */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* extensibleSequence */
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensibleSequence2 */
    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* setOfNULL */
    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfREAL */
    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* setOfEnums */
    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* namedSetOfNULL */
    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* namedSetOfREAL */
    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* namedSetOfEnums */
    { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 }, /* seqOfZuka */
    { (ASN_TAG_CLASS_CONTEXT | (13 << 2)), 13, 0, 0 }, /* setOfChoice */
    { (ASN_TAG_CLASS_CONTEXT | (14 << 2)), 14, 0, 0 } /* namedSetOfChoice */
};
static asn_CHOICE_specifics_t asn_SPC_PDU_specs_1 = {
	sizeof(struct PDU),
	offsetof(struct PDU, _asn_ctx),
	offsetof(struct PDU, present),
	sizeof(((struct PDU *)0)->present),
	.tag2el = asn_MAP_PDU_tag2el_1,
	.tag2el_count = 15,	/* Count of tags in the map */
	0, 0,
	.ext_start = 15	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_PDU = {
	"PDU",
	"PDU",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_PDU_1,
	15,	/* Elements count */
	&asn_SPC_PDU_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Sequence] >>> ***/

#include <INTEGER.h>
#include <BIT_STRING.h>
#include <UTF8String.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [Sequence] >>> ***/

struct Sequence;

/*** <<< TYPE-DECLS [Sequence] >>> ***/

typedef struct Sequence {
	INTEGER_t	 integer;
	struct Sequence	*sequence	/* OPTIONAL */;
	BIT_STRING_t	*bits	/* OPTIONAL */;
	UTF8String_t	 string;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Sequence_t;

/*** <<< FUNC-DECLS [Sequence] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Sequence;
extern asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1;
extern asn_TYPE_member_t asn_MBR_Sequence_1[4];

/*** <<< POST-INCLUDE [Sequence] >>> ***/

#include "Sequence.h"

/*** <<< STAT-DEFS [Sequence] >>> ***/

asn_TYPE_member_t asn_MBR_Sequence_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Sequence, integer),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "integer"
		},
	{ ATF_POINTER, 2, offsetof(struct Sequence, sequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Sequence,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "sequence"
		},
	{ ATF_POINTER, 1, offsetof(struct Sequence, bits),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_BIT_STRING,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "bits"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Sequence, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "string"
		},
};
static const ber_tlv_tag_t asn_DEF_Sequence_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Sequence_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string */
};
asn_SEQUENCE_specifics_t asn_SPC_Sequence_specs_1 = {
	sizeof(struct Sequence),
	offsetof(struct Sequence, _asn_ctx),
	.tag2el = asn_MAP_Sequence_tag2el_1,
	.tag2el_count = 4,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Sequence = {
	"Sequence",
	"Sequence",
	&asn_OP_SEQUENCE,
	asn_DEF_Sequence_tags_1,
	sizeof(asn_DEF_Sequence_tags_1)
		/sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */
	asn_DEF_Sequence_tags_1,	/* Same as above */
	sizeof(asn_DEF_Sequence_tags_1)
		/sizeof(asn_DEF_Sequence_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Sequence_1,
	4,	/* Elements count */
	&asn_SPC_Sequence_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Set] >>> ***/

#include <RELATIVE-OID.h>
#include <OCTET_STRING.h>
#include <constr_SET.h>

/*** <<< DEPS [Set] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Set_PR {
	Set_PR_roid,	/* Member roid is present */
	Set_PR_opaque,	/* Member opaque is present */
} Set_PR;

/*** <<< TYPE-DECLS [Set] >>> ***/

typedef struct Set {
	RELATIVE_OID_t	 roid;
	OCTET_STRING_t	*opaque	/* OPTIONAL */;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pSet, Set_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Set_t;

/*** <<< FUNC-DECLS [Set] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Set;
extern asn_SET_specifics_t asn_SPC_Set_specs_1;
extern asn_TYPE_member_t asn_MBR_Set_1[2];

/*** <<< STAT-DEFS [Set] >>> ***/

asn_TYPE_member_t asn_MBR_Set_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Set, roid),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_RELATIVE_OID,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "roid"
		},
	{ ATF_POINTER, 1, offsetof(struct Set, opaque),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_OCTET_STRING,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "opaque"
		},
};
static const ber_tlv_tag_t asn_DEF_Set_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Set_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque */
};
static const uint8_t asn_MAP_Set_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7) | (0 << 6)
};
asn_SET_specifics_t asn_SPC_Set_specs_1 = {
	sizeof(struct Set),
	offsetof(struct Set, _asn_ctx),
	offsetof(struct Set, _presence_map),
	.tag2el = asn_MAP_Set_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	asn_MAP_Set_tag2el_1,	/* Same as above */
	2,	/* Count of tags in the CXER map */
	0,	/* Whether extensible */
	(const unsigned int *)asn_MAP_Set_mmap_1	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Set = {
	"Set",
	"Set",
	&asn_OP_SET,
	asn_DEF_Set_tags_1,
	sizeof(asn_DEF_Set_tags_1)
		/sizeof(asn_DEF_Set_tags_1[0]), /* 1 */
	asn_DEF_Set_tags_1,	/* Same as above */
	sizeof(asn_DEF_Set_tags_1)
		/sizeof(asn_DEF_Set_tags_1[0]), /* 1 */
	{ 0, 0, SET_constraint },
	asn_MBR_Set_1,
	2,	/* Elements count */
	&asn_SPC_Set_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [ExtensibleSet] >>> ***/

#include <UTF8String.h>
#include <ENUMERATED.h>
#include <constr_SET.h>

/*** <<< DEPS [ExtensibleSet] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum ExtensibleSet_PR {
	ExtensibleSet_PR_string,	/* Member string is present */
	ExtensibleSet_PR_enum,	/* Member enum is present */
} ExtensibleSet_PR;
typedef enum Enum {
	enum_b	= 0,
	enum_a	= 1
} e_enum;

/*** <<< TYPE-DECLS [ExtensibleSet] >>> ***/

typedef struct ExtensibleSet {
	UTF8String_t	*string	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	ENUMERATED_t	*Enum;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pExtensibleSet, ExtensibleSet_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ExtensibleSet_t;

/*** <<< FUNC-DECLS [ExtensibleSet] >>> ***/

/* extern asn_TYPE_descriptor_t asn_DEF_enum_4;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSet;
extern asn_SET_specifics_t asn_SPC_ExtensibleSet_specs_1;
extern asn_TYPE_member_t asn_MBR_ExtensibleSet_1[2];

/*** <<< CODE [ExtensibleSet] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [ExtensibleSet] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_enum_value2enum_4[] = {
	{ 0,	1,	"b" },
	{ 1,	1,	"a" }
};
static const unsigned int asn_MAP_enum_enum2value_4[] = {
	1,	/* a(1) */
	0	/* b(0) */
};
static const asn_INTEGER_specifics_t asn_SPC_enum_specs_4 = {
	asn_MAP_enum_value2enum_4,	/* "tag" => N; sorted by tag */
	asn_MAP_enum_enum2value_4,	/* N => "tag"; sorted by N */
	2,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_enum_tags_4[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_enum_4 = {
	"enum",
	"enum",
	&asn_OP_ENUMERATED,
	asn_DEF_enum_tags_4,
	sizeof(asn_DEF_enum_tags_4)
		/sizeof(asn_DEF_enum_tags_4[0]) - 1, /* 1 */
	asn_DEF_enum_tags_4,	/* Same as above */
	sizeof(asn_DEF_enum_tags_4)
		/sizeof(asn_DEF_enum_tags_4[0]), /* 2 */
	{ 0, 0, ENUMERATED_constraint },
	0, 0,	/* Defined elsewhere */
	&asn_SPC_enum_specs_4	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ExtensibleSet_1[] = {
	{ ATF_POINTER, 2, offsetof(struct ExtensibleSet, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "string"
		},
	{ ATF_POINTER, 1, offsetof(struct ExtensibleSet, Enum),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_enum_4,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "enum"
		},
};
static const ber_tlv_tag_t asn_DEF_ExtensibleSet_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ExtensibleSet_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enum */
};
static const uint8_t asn_MAP_ExtensibleSet_mmap_1[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6)
};
asn_SET_specifics_t asn_SPC_ExtensibleSet_specs_1 = {
	sizeof(struct ExtensibleSet),
	offsetof(struct ExtensibleSet, _asn_ctx),
	offsetof(struct ExtensibleSet, _presence_map),
	.tag2el = asn_MAP_ExtensibleSet_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	asn_MAP_ExtensibleSet_tag2el_1,	/* Same as above */
	2,	/* Count of tags in the CXER map */
	1,	/* Whether extensible */
	(const unsigned int *)asn_MAP_ExtensibleSet_mmap_1	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_ExtensibleSet = {
	"ExtensibleSet",
	"ExtensibleSet",
	&asn_OP_SET,
	asn_DEF_ExtensibleSet_tags_1,
	sizeof(asn_DEF_ExtensibleSet_tags_1)
		/sizeof(asn_DEF_ExtensibleSet_tags_1[0]), /* 1 */
	asn_DEF_ExtensibleSet_tags_1,	/* Same as above */
	sizeof(asn_DEF_ExtensibleSet_tags_1)
		/sizeof(asn_DEF_ExtensibleSet_tags_1[0]), /* 1 */
	{ 0, 0, SET_constraint },
	asn_MBR_ExtensibleSet_1,
	2,	/* Elements count */
	&asn_SPC_ExtensibleSet_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [ExtensibleSequence] >>> ***/

#include <UTF8String.h>
#include <INTEGER.h>
#include <GeneralizedTime.h>
#include <constr_SEQUENCE.h>

/*** <<< TYPE-DECLS [ExtensibleSequence] >>> ***/

typedef struct ExtensibleSequence {
	UTF8String_t	*string	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	INTEGER_t	*integer	/* OPTIONAL */;
	GeneralizedTime_t	*gtime;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ExtensibleSequence_t;

/*** <<< FUNC-DECLS [ExtensibleSequence] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence;
extern asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_specs_1;
extern asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[3];

/*** <<< STAT-DEFS [ExtensibleSequence] >>> ***/

asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = {
	{ ATF_POINTER, 3, offsetof(struct ExtensibleSequence, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "string"
		},
	{ ATF_POINTER, 2, offsetof(struct ExtensibleSequence, integer),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "integer"
		},
	{ ATF_POINTER, 1, offsetof(struct ExtensibleSequence, gtime),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_GeneralizedTime,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "gtime"
		},
};
static const ber_tlv_tag_t asn_DEF_ExtensibleSequence_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* integer */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gtime */
};
asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence_specs_1 = {
	sizeof(struct ExtensibleSequence),
	offsetof(struct ExtensibleSequence, _asn_ctx),
	.tag2el = asn_MAP_ExtensibleSequence_tag2el_1,
	.tag2el_count = 3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	0,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence = {
	"ExtensibleSequence",
	"ExtensibleSequence",
	&asn_OP_SEQUENCE,
	asn_DEF_ExtensibleSequence_tags_1,
	sizeof(asn_DEF_ExtensibleSequence_tags_1)
		/sizeof(asn_DEF_ExtensibleSequence_tags_1[0]), /* 1 */
	asn_DEF_ExtensibleSequence_tags_1,	/* Same as above */
	sizeof(asn_DEF_ExtensibleSequence_tags_1)
		/sizeof(asn_DEF_ExtensibleSequence_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ExtensibleSequence_1,
	3,	/* Elements count */
	&asn_SPC_ExtensibleSequence_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [ExtensibleSequence2] >>> ***/

#include <UTF8String.h>
#include <INTEGER.h>
#include <constr_SEQUENCE.h>

/*** <<< TYPE-DECLS [ExtensibleSequence2] >>> ***/

typedef struct ExtensibleSequence2 {
	UTF8String_t	*string	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	INTEGER_t	*integer	/* OPTIONAL */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ExtensibleSequence2_t;

/*** <<< FUNC-DECLS [ExtensibleSequence2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2;
extern asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_specs_1;
extern asn_TYPE_member_t asn_MBR_ExtensibleSequence2_1[2];

/*** <<< STAT-DEFS [ExtensibleSequence2] >>> ***/

asn_TYPE_member_t asn_MBR_ExtensibleSequence2_1[] = {
	{ ATF_POINTER, 2, offsetof(struct ExtensibleSequence2, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "string"
		},
	{ ATF_POINTER, 1, offsetof(struct ExtensibleSequence2, integer),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "integer"
		},
};
static const ber_tlv_tag_t asn_DEF_ExtensibleSequence2_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ExtensibleSequence2_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer */
};
asn_SEQUENCE_specifics_t asn_SPC_ExtensibleSequence2_specs_1 = {
	sizeof(struct ExtensibleSequence2),
	offsetof(struct ExtensibleSequence2, _asn_ctx),
	.tag2el = asn_MAP_ExtensibleSequence2_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	0,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence2 = {
	"ExtensibleSequence2",
	"ExtensibleSequence2",
	&asn_OP_SEQUENCE,
	asn_DEF_ExtensibleSequence2_tags_1,
	sizeof(asn_DEF_ExtensibleSequence2_tags_1)
		/sizeof(asn_DEF_ExtensibleSequence2_tags_1[0]), /* 1 */
	asn_DEF_ExtensibleSequence2_tags_1,	/* Same as above */
	sizeof(asn_DEF_ExtensibleSequence2_tags_1)
		/sizeof(asn_DEF_ExtensibleSequence2_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ExtensibleSequence2_1,
	2,	/* Elements count */
	&asn_SPC_ExtensibleSequence2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SetOfNULL] >>> ***/

#include <NULL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< TYPE-DECLS [SetOfNULL] >>> ***/

typedef struct SetOfNULL {
	A_SET_OF(NULL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfNULL_t;

/*** <<< FUNC-DECLS [SetOfNULL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL;
extern asn_SET_OF_specifics_t asn_SPC_SetOfNULL_specs_1;
extern asn_TYPE_member_t asn_MBR_SetOfNULL_1[1];

/*** <<< STAT-DEFS [SetOfNULL] >>> ***/

asn_TYPE_member_t asn_MBR_SetOfNULL_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_SetOfNULL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SetOfNULL_specs_1 = {
	sizeof(struct SetOfNULL),
	offsetof(struct SetOfNULL, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfNULL = {
	"SetOfNULL",
	"SetOfNULL",
	&asn_OP_SET_OF,
	asn_DEF_SetOfNULL_tags_1,
	sizeof(asn_DEF_SetOfNULL_tags_1)
		/sizeof(asn_DEF_SetOfNULL_tags_1[0]), /* 1 */
	asn_DEF_SetOfNULL_tags_1,	/* Same as above */
	sizeof(asn_DEF_SetOfNULL_tags_1)
		/sizeof(asn_DEF_SetOfNULL_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_SetOfNULL_1,
	1,	/* Single element */
	&asn_SPC_SetOfNULL_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SetOfREAL] >>> ***/

#include <REAL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< TYPE-DECLS [SetOfREAL] >>> ***/

typedef struct SetOfREAL {
	A_SET_OF(REAL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfREAL_t;

/*** <<< FUNC-DECLS [SetOfREAL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SetOfREAL;
extern asn_SET_OF_specifics_t asn_SPC_SetOfREAL_specs_1;
extern asn_TYPE_member_t asn_MBR_SetOfREAL_1[1];

/*** <<< STAT-DEFS [SetOfREAL] >>> ***/

asn_TYPE_member_t asn_MBR_SetOfREAL_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_REAL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_SetOfREAL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SetOfREAL_specs_1 = {
	sizeof(struct SetOfREAL),
	offsetof(struct SetOfREAL, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfREAL = {
	"SetOfREAL",
	"SetOfREAL",
	&asn_OP_SET_OF,
	asn_DEF_SetOfREAL_tags_1,
	sizeof(asn_DEF_SetOfREAL_tags_1)
		/sizeof(asn_DEF_SetOfREAL_tags_1[0]), /* 1 */
	asn_DEF_SetOfREAL_tags_1,	/* Same as above */
	sizeof(asn_DEF_SetOfREAL_tags_1)
		/sizeof(asn_DEF_SetOfREAL_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_SetOfREAL_1,
	1,	/* Single element */
	&asn_SPC_SetOfREAL_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SetOfEnums] >>> ***/

#include <ENUMERATED.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [SetOfEnums] >>> ***/

typedef enum Member {
	Member_one	= 0,
	Member_oneMore	= 1
} e_Member;

/*** <<< TYPE-DECLS [SetOfEnums] >>> ***/

typedef struct SetOfEnums {
	A_SET_OF(ENUMERATED_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfEnums_t;

/*** <<< FUNC-DECLS [SetOfEnums] >>> ***/

/* extern asn_TYPE_descriptor_t asn_DEF_Member_2;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_SetOfEnums;
extern asn_SET_OF_specifics_t asn_SPC_SetOfEnums_specs_1;
extern asn_TYPE_member_t asn_MBR_SetOfEnums_1[1];

/*** <<< CODE [SetOfEnums] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [SetOfEnums] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Member_value2enum_2[] = {
	{ 0,	3,	"one" },
	{ 1,	7,	"oneMore" }
};
static const unsigned int asn_MAP_Member_enum2value_2[] = {
	0,	/* one(0) */
	1	/* oneMore(1) */
};
static const asn_INTEGER_specifics_t asn_SPC_Member_specs_2 = {
	asn_MAP_Member_value2enum_2,	/* "tag" => N; sorted by tag */
	asn_MAP_Member_enum2value_2,	/* N => "tag"; sorted by N */
	2,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_Member_2 = {
	"ENUMERATED",
	"ENUMERATED",
	&asn_OP_ENUMERATED,
	asn_DEF_Member_tags_2,
	sizeof(asn_DEF_Member_tags_2)
		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
	asn_DEF_Member_tags_2,	/* Same as above */
	sizeof(asn_DEF_Member_tags_2)
		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
	{ 0, 0, ENUMERATED_constraint },
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Member_specs_2	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SetOfEnums_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Member_2,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_SetOfEnums_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SetOfEnums_specs_1 = {
	sizeof(struct SetOfEnums),
	offsetof(struct SetOfEnums, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfEnums = {
	"SetOfEnums",
	"SetOfEnums",
	&asn_OP_SET_OF,
	asn_DEF_SetOfEnums_tags_1,
	sizeof(asn_DEF_SetOfEnums_tags_1)
		/sizeof(asn_DEF_SetOfEnums_tags_1[0]), /* 1 */
	asn_DEF_SetOfEnums_tags_1,	/* Same as above */
	sizeof(asn_DEF_SetOfEnums_tags_1)
		/sizeof(asn_DEF_SetOfEnums_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_SetOfEnums_1,
	1,	/* Single element */
	&asn_SPC_SetOfEnums_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [NamedSetOfNULL] >>> ***/

#include <NULL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< TYPE-DECLS [NamedSetOfNULL] >>> ***/

typedef struct NamedSetOfNULL {
	A_SET_OF(NULL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} NamedSetOfNULL_t;

/*** <<< FUNC-DECLS [NamedSetOfNULL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfNULL;
extern asn_SET_OF_specifics_t asn_SPC_NamedSetOfNULL_specs_1;
extern asn_TYPE_member_t asn_MBR_NamedSetOfNULL_1[1];

/*** <<< STAT-DEFS [NamedSetOfNULL] >>> ***/

asn_TYPE_member_t asn_MBR_NamedSetOfNULL_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "y"
		},
};
static const ber_tlv_tag_t asn_DEF_NamedSetOfNULL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_NamedSetOfNULL_specs_1 = {
	sizeof(struct NamedSetOfNULL),
	offsetof(struct NamedSetOfNULL, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_NamedSetOfNULL = {
	"NamedSetOfNULL",
	"NamedSetOfNULL",
	&asn_OP_SET_OF,
	asn_DEF_NamedSetOfNULL_tags_1,
	sizeof(asn_DEF_NamedSetOfNULL_tags_1)
		/sizeof(asn_DEF_NamedSetOfNULL_tags_1[0]), /* 1 */
	asn_DEF_NamedSetOfNULL_tags_1,	/* Same as above */
	sizeof(asn_DEF_NamedSetOfNULL_tags_1)
		/sizeof(asn_DEF_NamedSetOfNULL_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_NamedSetOfNULL_1,
	1,	/* Single element */
	&asn_SPC_NamedSetOfNULL_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [NamedSetOfREAL] >>> ***/

#include <REAL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< TYPE-DECLS [NamedSetOfREAL] >>> ***/

typedef struct NamedSetOfREAL {
	A_SET_OF(REAL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} NamedSetOfREAL_t;

/*** <<< FUNC-DECLS [NamedSetOfREAL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfREAL;
extern asn_SET_OF_specifics_t asn_SPC_NamedSetOfREAL_specs_1;
extern asn_TYPE_member_t asn_MBR_NamedSetOfREAL_1[1];

/*** <<< STAT-DEFS [NamedSetOfREAL] >>> ***/

asn_TYPE_member_t asn_MBR_NamedSetOfREAL_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_REAL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "name"
		},
};
static const ber_tlv_tag_t asn_DEF_NamedSetOfREAL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_NamedSetOfREAL_specs_1 = {
	sizeof(struct NamedSetOfREAL),
	offsetof(struct NamedSetOfREAL, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_NamedSetOfREAL = {
	"NamedSetOfREAL",
	"NamedSetOfREAL",
	&asn_OP_SET_OF,
	asn_DEF_NamedSetOfREAL_tags_1,
	sizeof(asn_DEF_NamedSetOfREAL_tags_1)
		/sizeof(asn_DEF_NamedSetOfREAL_tags_1[0]), /* 1 */
	asn_DEF_NamedSetOfREAL_tags_1,	/* Same as above */
	sizeof(asn_DEF_NamedSetOfREAL_tags_1)
		/sizeof(asn_DEF_NamedSetOfREAL_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_NamedSetOfREAL_1,
	1,	/* Single element */
	&asn_SPC_NamedSetOfREAL_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [NamedSetOfEnums] >>> ***/

#include <ENUMERATED.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [NamedSetOfEnums] >>> ***/

typedef enum name {
	name_one	= 0,
	name_oneMore	= 1
} e_name;

/*** <<< TYPE-DECLS [NamedSetOfEnums] >>> ***/

typedef struct NamedSetOfEnums {
	A_SET_OF(ENUMERATED_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} NamedSetOfEnums_t;

/*** <<< FUNC-DECLS [NamedSetOfEnums] >>> ***/

/* extern asn_TYPE_descriptor_t asn_DEF_name_2;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfEnums;
extern asn_SET_OF_specifics_t asn_SPC_NamedSetOfEnums_specs_1;
extern asn_TYPE_member_t asn_MBR_NamedSetOfEnums_1[1];

/*** <<< CODE [NamedSetOfEnums] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [NamedSetOfEnums] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_name_value2enum_2[] = {
	{ 0,	3,	"one" },
	{ 1,	7,	"oneMore" }
};
static const unsigned int asn_MAP_name_enum2value_2[] = {
	0,	/* one(0) */
	1	/* oneMore(1) */
};
static const asn_INTEGER_specifics_t asn_SPC_name_specs_2 = {
	asn_MAP_name_value2enum_2,	/* "tag" => N; sorted by tag */
	asn_MAP_name_enum2value_2,	/* N => "tag"; sorted by N */
	2,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_name_tags_2[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_name_2 = {
	"ENUMERATED",
	"ENUMERATED",
	&asn_OP_ENUMERATED,
	asn_DEF_name_tags_2,
	sizeof(asn_DEF_name_tags_2)
		/sizeof(asn_DEF_name_tags_2[0]), /* 1 */
	asn_DEF_name_tags_2,	/* Same as above */
	sizeof(asn_DEF_name_tags_2)
		/sizeof(asn_DEF_name_tags_2[0]), /* 1 */
	{ 0, 0, ENUMERATED_constraint },
	0, 0,	/* Defined elsewhere */
	&asn_SPC_name_specs_2	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_NamedSetOfEnums_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_name_2,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "name"
		},
};
static const ber_tlv_tag_t asn_DEF_NamedSetOfEnums_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_NamedSetOfEnums_specs_1 = {
	sizeof(struct NamedSetOfEnums),
	offsetof(struct NamedSetOfEnums, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_NamedSetOfEnums = {
	"NamedSetOfEnums",
	"NamedSetOfEnums",
	&asn_OP_SET_OF,
	asn_DEF_NamedSetOfEnums_tags_1,
	sizeof(asn_DEF_NamedSetOfEnums_tags_1)
		/sizeof(asn_DEF_NamedSetOfEnums_tags_1[0]), /* 1 */
	asn_DEF_NamedSetOfEnums_tags_1,	/* Same as above */
	sizeof(asn_DEF_NamedSetOfEnums_tags_1)
		/sizeof(asn_DEF_NamedSetOfEnums_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_NamedSetOfEnums_1,
	1,	/* Single element */
	&asn_SPC_NamedSetOfEnums_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SequenceOf] >>> ***/

#include <INTEGER.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< TYPE-DECLS [SequenceOf] >>> ***/

typedef struct SequenceOf {
	A_SEQUENCE_OF(INTEGER_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SequenceOf_t;

/*** <<< FUNC-DECLS [SequenceOf] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SequenceOf;
extern asn_SET_OF_specifics_t asn_SPC_SequenceOf_specs_1;
extern asn_TYPE_member_t asn_MBR_SequenceOf_1[1];

/*** <<< STAT-DEFS [SequenceOf] >>> ***/

asn_TYPE_member_t asn_MBR_SequenceOf_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "id"
		},
};
static const ber_tlv_tag_t asn_DEF_SequenceOf_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SequenceOf_specs_1 = {
	sizeof(struct SequenceOf),
	offsetof(struct SequenceOf, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_SequenceOf = {
	"SequenceOf",
	"SequenceOf",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_SequenceOf_tags_1,
	sizeof(asn_DEF_SequenceOf_tags_1)
		/sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */
	asn_DEF_SequenceOf_tags_1,	/* Same as above */
	sizeof(asn_DEF_SequenceOf_tags_1)
		/sizeof(asn_DEF_SequenceOf_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_OF_constraint },
	asn_MBR_SequenceOf_1,
	1,	/* Single element */
	&asn_SPC_SequenceOf_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqOfZuka] >>> ***/

#include <NULL.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< TYPE-DECLS [SeqOfZuka] >>> ***/

typedef struct SeqOfZuka {
	A_SEQUENCE_OF(NULL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqOfZuka_t;

/*** <<< FUNC-DECLS [SeqOfZuka] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SeqOfZuka;
extern asn_SET_OF_specifics_t asn_SPC_SeqOfZuka_specs_1;
extern asn_TYPE_member_t asn_MBR_SeqOfZuka_1[1];

/*** <<< STAT-DEFS [SeqOfZuka] >>> ***/

asn_TYPE_member_t asn_MBR_SeqOfZuka_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "zuka"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqOfZuka_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SeqOfZuka_specs_1 = {
	sizeof(struct SeqOfZuka),
	offsetof(struct SeqOfZuka, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SeqOfZuka = {
	"SeqOfZuka",
	"SeqOfZuka",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_SeqOfZuka_tags_1,
	sizeof(asn_DEF_SeqOfZuka_tags_1)
		/sizeof(asn_DEF_SeqOfZuka_tags_1[0]), /* 1 */
	asn_DEF_SeqOfZuka_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqOfZuka_tags_1)
		/sizeof(asn_DEF_SeqOfZuka_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_OF_constraint },
	asn_MBR_SeqOfZuka_1,
	1,	/* Single element */
	&asn_SPC_SeqOfZuka_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SetOfChoice] >>> ***/

#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< FWD-DECLS [SetOfChoice] >>> ***/

struct SimpleChoice;

/*** <<< TYPE-DECLS [SetOfChoice] >>> ***/

typedef struct SetOfChoice {
	A_SET_OF(struct SimpleChoice) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfChoice_t;

/*** <<< FUNC-DECLS [SetOfChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SetOfChoice;
extern asn_SET_OF_specifics_t asn_SPC_SetOfChoice_specs_1;
extern asn_TYPE_member_t asn_MBR_SetOfChoice_1[1];

/*** <<< POST-INCLUDE [SetOfChoice] >>> ***/

#include "SimpleChoice.h"

/*** <<< STAT-DEFS [SetOfChoice] >>> ***/

asn_TYPE_member_t asn_MBR_SetOfChoice_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = &asn_DEF_SimpleChoice,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_SetOfChoice_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_SetOfChoice_specs_1 = {
	sizeof(struct SetOfChoice),
	offsetof(struct SetOfChoice, _asn_ctx),
	2,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfChoice = {
	"SetOfChoice",
	"SetOfChoice",
	&asn_OP_SET_OF,
	asn_DEF_SetOfChoice_tags_1,
	sizeof(asn_DEF_SetOfChoice_tags_1)
		/sizeof(asn_DEF_SetOfChoice_tags_1[0]), /* 1 */
	asn_DEF_SetOfChoice_tags_1,	/* Same as above */
	sizeof(asn_DEF_SetOfChoice_tags_1)
		/sizeof(asn_DEF_SetOfChoice_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_SetOfChoice_1,
	1,	/* Single element */
	&asn_SPC_SetOfChoice_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [NamedSetOfChoice] >>> ***/

#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< FWD-DECLS [NamedSetOfChoice] >>> ***/

struct SimpleChoice;

/*** <<< TYPE-DECLS [NamedSetOfChoice] >>> ***/

typedef struct NamedSetOfChoice {
	A_SET_OF(struct SimpleChoice) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} NamedSetOfChoice_t;

/*** <<< FUNC-DECLS [NamedSetOfChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice;
extern asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_specs_1;
extern asn_TYPE_member_t asn_MBR_NamedSetOfChoice_1[1];

/*** <<< POST-INCLUDE [NamedSetOfChoice] >>> ***/

#include "SimpleChoice.h"

/*** <<< STAT-DEFS [NamedSetOfChoice] >>> ***/

asn_TYPE_member_t asn_MBR_NamedSetOfChoice_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = &asn_DEF_SimpleChoice,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "whatever"
		},
};
static const ber_tlv_tag_t asn_DEF_NamedSetOfChoice_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_NamedSetOfChoice_specs_1 = {
	sizeof(struct NamedSetOfChoice),
	offsetof(struct NamedSetOfChoice, _asn_ctx),
	2,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_NamedSetOfChoice = {
	"NamedSetOfChoice",
	"NamedSetOfChoice",
	&asn_OP_SET_OF,
	asn_DEF_NamedSetOfChoice_tags_1,
	sizeof(asn_DEF_NamedSetOfChoice_tags_1)
		/sizeof(asn_DEF_NamedSetOfChoice_tags_1[0]), /* 1 */
	asn_DEF_NamedSetOfChoice_tags_1,	/* Same as above */
	sizeof(asn_DEF_NamedSetOfChoice_tags_1)
		/sizeof(asn_DEF_NamedSetOfChoice_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_NamedSetOfChoice_1,
	1,	/* Single element */
	&asn_SPC_NamedSetOfChoice_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SimpleChoice] >>> ***/

#include <NULL.h>
#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [SimpleChoice] >>> ***/

typedef enum SimpleChoice_PR {
	SimpleChoice_PR_NOTHING,	/* No components present */
	SimpleChoice_PR_a,
	SimpleChoice_PR_b
} SimpleChoice_PR;

/*** <<< TYPE-DECLS [SimpleChoice] >>> ***/

typedef struct SimpleChoice {
	SimpleChoice_PR present;
	union SimpleChoice_u {
		NULL_t	 a;
		INTEGER_t	 b;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SimpleChoice_t;

/*** <<< FUNC-DECLS [SimpleChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SimpleChoice;
extern asn_CHOICE_specifics_t asn_SPC_SimpleChoice_specs_1;
extern asn_TYPE_member_t asn_MBR_SimpleChoice_1[2];

/*** <<< STAT-DEFS [SimpleChoice] >>> ***/

asn_TYPE_member_t asn_MBR_SimpleChoice_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SimpleChoice, choice.a),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NULL,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SimpleChoice, choice.b),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "b"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_SimpleChoice_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* b */
};
asn_CHOICE_specifics_t asn_SPC_SimpleChoice_specs_1 = {
	sizeof(struct SimpleChoice),
	offsetof(struct SimpleChoice, _asn_ctx),
	offsetof(struct SimpleChoice, present),
	sizeof(((struct SimpleChoice *)0)->present),
	.tag2el = asn_MAP_SimpleChoice_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	0, 0,
	.ext_start = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_SimpleChoice = {
	"SimpleChoice",
	"SimpleChoice",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_SimpleChoice_1,
	2,	/* Elements count */
	&asn_SPC_SimpleChoice_specs_1	/* Additional specs */
};

