
/*** <<< INCLUDES [Programming] >>> ***/

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

/*** <<< DEPS [Programming] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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


typedef struct Programming {
	A_SEQUENCE_OF(Fault_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Programming_t;

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

static asn_TYPE_member_t asn_MBR_Programming[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Fault,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Programming_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Programming_specs = {
	sizeof(struct Programming),
	offsetof(struct Programming, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Programming = {
	"Programming",
	"Programming",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_tags,
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_DEF_Programming_tags,	/* Same as above */
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_MBR_Programming,
	1,	/* Single element */
	&asn_DEF_Programming_specs	/* Additional specs */
};


/*** <<< INCLUDES [Fault] >>> ***/

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

/*** <<< DEPS [Fault] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Fault;

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


typedef struct Fault {
	A_SET_OF(Error_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Fault_t;

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

static asn_TYPE_member_t asn_MBR_Fault[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Error,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Fault_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Fault_specs = {
	sizeof(struct Fault),
	offsetof(struct Fault, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Fault = {
	"Fault",
	"Fault",
	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 */
	asn_DEF_Fault_tags,
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_DEF_Fault_tags,	/* Same as above */
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_MBR_Fault,
	1,	/* Single element */
	&asn_DEF_Fault_specs	/* Additional specs */
};


/*** <<< INCLUDES [Error] >>> ***/

#include <constr_SEQUENCE.h>

/*** <<< DEPS [Error] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Error;

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


typedef struct Error {
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Error_t;

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

static ber_tlv_tag_t asn_DEF_Error_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Error_tag2el[] = {
};
static asn_SEQUENCE_specifics_t asn_DEF_Error_specs = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	asn_DEF_Error_tag2el,
	0,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Error = {
	"Error",
	"Error",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Error_tags,
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	asn_DEF_Error_tags,	/* Same as above */
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	0, 0,	/* No members */
	&asn_DEF_Error_specs	/* Additional specs */
};

