
/*** <<< INCLUDES [T] >>> ***/

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

/*** <<< DEPS [T] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_T;

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


typedef struct T {
	INTEGER_t	 int;
	struct collection {
		A_SEQUENCE_OF(struct T2) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} collection;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T_t;

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

static asn1_TYPE_member_t asn1_MBR_collection[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_T2,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_collection_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = {
	sizeof(struct collection),
	offsetof(struct collection, _ber_dec_ctx),
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_collection = {
	"collection",
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_print,
	SEQUENCE_OF_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_collection_tags,
	sizeof(asn1_DEF_collection_tags)
		/sizeof(asn1_DEF_collection_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_collection,
	1,	/* Single element */
	&asn1_DEF_collection_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_T[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T, int),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "int"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, collection),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_collection,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "collection"
		},
};
static ber_tlv_tag_t asn1_DEF_T_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* collection at 17 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = {
	sizeof(struct T),
	offsetof(struct T, _ber_dec_ctx),
	asn1_DEF_T_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_T = {
	"T",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T_tags,
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_T,
	2,	/* Elements count */
	&asn1_DEF_T_specs	/* Additional specs */
};


/*** <<< INCLUDES [T2] >>> ***/

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

/*** <<< DEPS [T2] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_T2;

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


typedef struct T2 {
	BOOLEAN_t	 flag;
	UTF8String_t	 str;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T2_t;

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

static asn1_TYPE_member_t asn1_MBR_T2[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T2, flag),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "flag"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T2, str),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "str"
		},
};
static ber_tlv_tag_t asn1_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 }, /* str at 21 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _ber_dec_ctx),
	asn1_DEF_T2_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_T2 = {
	"T2",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T2_tags,
	sizeof(asn1_DEF_T2_tags)
		/sizeof(asn1_DEF_T2_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_T2,
	2,	/* Elements count */
	&asn1_DEF_T2_specs	/* Additional specs */
};

