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

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

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

struct Fault;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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

#include <Fault.h>

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

static asn_TYPE_member_t asn_MBR_Programming_1[] = {
	{ 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 constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Programming_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Programming_1_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,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_1_tags,
	sizeof(asn_DEF_Programming_1_tags)
		/sizeof(asn_DEF_Programming_1_tags[0]), /* 1 */
	asn_DEF_Programming_1_tags,	/* Same as above */
	sizeof(asn_DEF_Programming_1_tags)
		/sizeof(asn_DEF_Programming_1_tags[0]), /* 1 */
	asn_MBR_Programming_1,
	1,	/* Single element */
	&asn_SPC_Programming_1_specs	/* Additional specs */
};


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

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

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

struct Error;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Fault;

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

#include <Error.h>

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

static asn_TYPE_member_t asn_MBR_Fault_1[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Error,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Fault_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Fault_1_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,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Fault_1_tags,
	sizeof(asn_DEF_Fault_1_tags)
		/sizeof(asn_DEF_Fault_1_tags[0]), /* 1 */
	asn_DEF_Fault_1_tags,	/* Same as above */
	sizeof(asn_DEF_Fault_1_tags)
		/sizeof(asn_DEF_Fault_1_tags[0]), /* 1 */
	asn_MBR_Fault_1,
	1,	/* Single element */
	&asn_SPC_Fault_1_specs	/* Additional specs */
};


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

#include <constr_SEQUENCE.h>

/*** <<< 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;

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

extern asn_TYPE_descriptor_t asn_DEF_Error;

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

static ber_tlv_tag_t asn_DEF_Error_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Error_1_tag2el[] = {
};
static asn_SEQUENCE_specifics_t asn_SPC_Error_1_specs = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	asn_MAP_Error_1_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_1_tags,
	sizeof(asn_DEF_Error_1_tags)
		/sizeof(asn_DEF_Error_1_tags[0]), /* 1 */
	asn_DEF_Error_1_tags,	/* Same as above */
	sizeof(asn_DEF_Error_1_tags)
		/sizeof(asn_DEF_Error_1_tags[0]), /* 1 */
	0, 0,	/* No members */
	&asn_SPC_Error_1_specs	/* Additional specs */
};

