
/*** <<< INCLUDES [Forest] >>> ***/

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

/*** <<< DEPS [Forest] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_Forest;

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


typedef struct Forest {
	A_SET_OF(Tree_t) list;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Forest_t;

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

static asn1_TYPE_member_t asn1_MBR_Forest[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Tree,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_Forest_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = {
	sizeof(struct Forest),
	offsetof(struct Forest, _ber_dec_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn1_TYPE_descriptor_t asn1_DEF_Forest = {
	"Forest",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	0,				/* Not implemented yet */
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Forest_tags,
	sizeof(asn1_DEF_Forest_tags)
		/sizeof(asn1_DEF_Forest_tags[0]), /* 1 */
	asn1_DEF_Forest_tags,	/* Same as above */
	sizeof(asn1_DEF_Forest_tags)
		/sizeof(asn1_DEF_Forest_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Forest,
	1,	/* Single element */
	&asn1_DEF_Forest_specs	/* Additional specs */
};


/*** <<< INCLUDES [Tree] >>> ***/

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

/*** <<< DEPS [Tree] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_Tree;

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


typedef struct Tree {
	INTEGER_t	 height;
	INTEGER_t	 width;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Tree_t;

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

static asn1_TYPE_member_t asn1_MBR_Tree[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "width"
		},
};
static ber_tlv_tag_t asn1_DEF_Tree_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Tree_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 }, /* width at 19 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _ber_dec_ctx),
	asn1_DEF_Tree_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_Tree = {
	"Tree",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Tree_tags,
	sizeof(asn1_DEF_Tree_tags)
		/sizeof(asn1_DEF_Tree_tags[0]), /* 1 */
	asn1_DEF_Tree_tags,	/* Same as above */
	sizeof(asn1_DEF_Tree_tags)
		/sizeof(asn1_DEF_Tree_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Tree,
	2,	/* Elements count */
	&asn1_DEF_Tree_specs	/* Additional specs */
};


/*** <<< INCLUDES [Stuff] >>> ***/

#include <Forest.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <BIT_STRING.h>
#include <constr_SEQUENCE.h>
#include <constr_SET.h>

/*** <<< DEPS [Stuff] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Stuff_PR {
	Stuff_PR_trees,	/* Member trees is present */
	Stuff_PR_anything,	/* Member anything is present */
} Stuff_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_Stuff;

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


typedef struct Stuff {
	struct trees {
		A_SET_OF(Forest_t) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *trees;
	struct anything {
		A_SET_OF(struct anything_member {
			BIT_STRING_t	 cup_of_coffee;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			ber_dec_ctx_t _ber_dec_ctx;
		} ) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *anything;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Stuff_t;

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

static asn1_TYPE_member_t asn1_MBR_trees[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Forest,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_trees_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = {
	sizeof(struct trees),
	offsetof(struct trees, _ber_dec_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_trees = {
	"trees",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	0,				/* Not implemented yet */
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_trees_tags,
	sizeof(asn1_DEF_trees_tags)
		/sizeof(asn1_DEF_trees_tags[0]) - 1, /* 1 */
	asn1_DEF_trees_tags,	/* Same as above */
	sizeof(asn1_DEF_trees_tags)
		/sizeof(asn1_DEF_trees_tags[0]), /* 2 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_trees,
	1,	/* Single element */
	&asn1_DEF_trees_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_anything_member[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct anything_member, cup_of_coffee),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "cup-of-coffee"
		},
};
static ber_tlv_tag_t asn1_DEF_anything_member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_anything_member_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = {
	sizeof(struct anything_member),
	offsetof(struct anything_member, _ber_dec_ctx),
	asn1_DEF_anything_member_tag2el,
	1,	/* Count of tags in the map */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything_member = {
	"",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_anything_member_tags,
	sizeof(asn1_DEF_anything_member_tags)
		/sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */
	asn1_DEF_anything_member_tags,	/* Same as above */
	sizeof(asn1_DEF_anything_member_tags)
		/sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything_member,
	1,	/* Elements count */
	&asn1_DEF_anything_member_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_anything[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_anything_member,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_anything_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = {
	sizeof(struct anything),
	offsetof(struct anything, _ber_dec_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything = {
	"anything",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	0,				/* Not implemented yet */
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_anything_tags,
	sizeof(asn1_DEF_anything_tags)
		/sizeof(asn1_DEF_anything_tags[0]) - 1, /* 1 */
	asn1_DEF_anything_tags,	/* Same as above */
	sizeof(asn1_DEF_anything_tags)
		/sizeof(asn1_DEF_anything_tags[0]), /* 2 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything,
	1,	/* Single element */
	&asn1_DEF_anything_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_Stuff[] = {
	{ ATF_POINTER, 2, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_trees,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "trees"
		},
	{ ATF_POINTER, 1, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_anything,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "anything"
		},
};
static ber_tlv_tag_t asn1_DEF_Stuff_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Stuff_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */
};
static uint8_t asn1_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6)
};
static asn1_SET_specifics_t asn1_DEF_Stuff_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _ber_dec_ctx),
	offsetof(struct Stuff, _presence_map),
	asn1_DEF_Stuff_tag2el,
	2,	/* Count of tags in the map */
	0,	/* Whether extensible */
	(unsigned int *)asn1_DEF_Stuff_mmap	/* Mandatory elements map */
};
asn1_TYPE_descriptor_t asn1_DEF_Stuff = {
	"Stuff",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	0,				/* Not implemented yet */
	SET_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Stuff_tags,
	sizeof(asn1_DEF_Stuff_tags)
		/sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */
	asn1_DEF_Stuff_tags,	/* Same as above */
	sizeof(asn1_DEF_Stuff_tags)
		/sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Stuff,
	2,	/* Elements count */
	&asn1_DEF_Stuff_specs	/* Additional specs */
};

