
/*** <<< DEPS [LogLine] >>> ***/

/* Dependencies for LogLine */
#include <IA5String.h>

/* Dependencies for varsets */
#include <VariablePartSet.h>
#include <asn_SEQUENCE_OF.h>

	#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

extern asn1_TYPE_descriptor_t asn1_DEF_LogLine;

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


typedef struct LogLine {
	IA5String_t	 line_digest;
	struct varsets {
		A_SEQUENCE_OF(struct VariablePartSet) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} varsets;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} LogLine_t;

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

	static asn1_SET_OF_element_t asn1_DEF_varsets_elements[] = {
		{ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
			(void *)&asn1_DEF_VariablePartSet },
	};
	static ber_tlv_tag_t asn1_DEF_varsets_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = {
		sizeof(struct varsets),
		offsetof(struct varsets, _ber_dec_ctx),
		asn1_DEF_varsets_elements
	};
	asn1_TYPE_descriptor_t asn1_DEF_varsets = {
		"varsets",
		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_varsets_tags,
		sizeof(asn1_DEF_varsets_tags)
			/sizeof(asn1_DEF_varsets_tags[0]),
		0,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_varsets_specs	/* Additional specs */
	};
	
#include <constr_SEQUENCE.h>

static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = {
	{ offsetof(struct LogLine, line_digest), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (22 << 2)),
		0,
		(void *)&asn1_DEF_IA5String,
		"line-digest"
		},
	{ offsetof(struct LogLine, varsets), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_varsets,
		"varsets"
		},
};
static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_LogLine_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* varsets at 25 */
    { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0 }, /* line-digest at 23 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = {
	sizeof(struct LogLine),
	offsetof(struct LogLine, _ber_dec_ctx),
	asn1_DEF_LogLine_elements,
	2,	/* Elements count */
	asn1_DEF_LogLine_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_LogLine = {
	"LogLine",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_LogLine_tags,
	sizeof(asn1_DEF_LogLine_tags)
		/sizeof(asn1_DEF_LogLine_tags[0]),
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_LogLine_specs	/* Additional specs */
};


/*** <<< DEPS [VariablePartSet] >>> ***/

/* Dependencies for VariablePartSet */
#include <ActionItem.h>

/* Dependencies for vparts */
#include <VariablePart.h>
#include <asn_SEQUENCE_OF.h>

	#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet;

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


typedef struct VariablePartSet {
	struct vparts {
		A_SEQUENCE_OF(struct VariablePart) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} vparts;
	ActionItem_t	 resolution;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} VariablePartSet_t;

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

	static asn1_SET_OF_element_t asn1_DEF_vparts_elements[] = {
		{ -1 /* Ambiguous tag (CHOICE?) */,
			(void *)&asn1_DEF_VariablePart },
	};
	static ber_tlv_tag_t asn1_DEF_vparts_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = {
		sizeof(struct vparts),
		offsetof(struct vparts, _ber_dec_ctx),
		asn1_DEF_vparts_elements
	};
	asn1_TYPE_descriptor_t asn1_DEF_vparts = {
		"vparts",
		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_vparts_tags,
		sizeof(asn1_DEF_vparts_tags)
			/sizeof(asn1_DEF_vparts_tags[0]),
		0,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_vparts_specs	/* Additional specs */
	};
	
#include <constr_SEQUENCE.h>

static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = {
	{ offsetof(struct VariablePartSet, vparts), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_vparts,
		"vparts"
		},
	{ offsetof(struct VariablePartSet, resolution), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_ActionItem,
		"resolution"
		},
};
static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0 }, /* vparts at 33 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* resolution at 35 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = {
	sizeof(struct VariablePartSet),
	offsetof(struct VariablePartSet, _ber_dec_ctx),
	asn1_DEF_VariablePartSet_elements,
	2,	/* Elements count */
	asn1_DEF_VariablePartSet_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = {
	"VariablePartSet",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_VariablePartSet_tags,
	sizeof(asn1_DEF_VariablePartSet_tags)
		/sizeof(asn1_DEF_VariablePartSet_tags[0]),
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_VariablePartSet_specs	/* Additional specs */
};


/*** <<< DEPS [VariablePart] >>> ***/


/* Dependencies for vset */
#include <VisibleString.h>
#include <asn_SET_OF.h>

		#include <constr_SET_OF.h>
		
/* Dependencies for vrange */
#include <VisibleString.h>
#include <VisibleString.h>

		#include <constr_SEQUENCE.h>
		
extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart;

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


typedef struct VariablePart {
	enum {
		VariablePart_PR_NOTHING,	/* No components present */
		VariablePart_PR_vset,
		VariablePart_PR_vrange,
	} present;
	union {
		struct vset {
			A_SET_OF(VisibleString_t) list;
			
			/* Context for parsing across buffer boundaries */
			ber_dec_ctx_t _ber_dec_ctx;
		} vset;
		struct vrange {
			VisibleString_t	 from;
			VisibleString_t	 to;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			ber_dec_ctx_t _ber_dec_ctx;
		} vrange;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} VariablePart_t;

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

		static asn1_SET_OF_element_t asn1_DEF_vset_elements[] = {
			{ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				(void *)&asn1_DEF_VisibleString },
		};
		static ber_tlv_tag_t asn1_DEF_vset_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
		};
		static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = {
			sizeof(struct vset),
			offsetof(struct vset, _ber_dec_ctx),
			asn1_DEF_vset_elements
		};
		asn1_TYPE_descriptor_t asn1_DEF_vset = {
			"vset",
			SET_OF_constraint,
			SET_OF_decode_ber,
			SET_OF_encode_der,
			SET_OF_print,
			SET_OF_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_vset_tags,
			sizeof(asn1_DEF_vset_tags)
				/sizeof(asn1_DEF_vset_tags[0]),
			0,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vset_specs	/* Additional specs */
		};
		
		#include <constr_SEQUENCE.h>
		
		static asn1_SEQUENCE_element_t asn1_DEF_vrange_elements[] = {
			{ offsetof(struct vrange, from), 0,
				(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				0,
				(void *)&asn1_DEF_VisibleString,
				"from"
				},
			{ offsetof(struct vrange, to), 0,
				(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				0,
				(void *)&asn1_DEF_VisibleString,
				"to"
				},
		};
		static ber_tlv_tag_t asn1_DEF_vrange_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
		};
		static asn1_TYPE_tag2member_t asn1_DEF_vrange_tag2el[] = {
		    { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0 }, /* from at 45 */
		    { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1 }, /* to at 46 */
		};
		static asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = {
			sizeof(struct vrange),
			offsetof(struct vrange, _ber_dec_ctx),
			asn1_DEF_vrange_elements,
			2,	/* Elements count */
			asn1_DEF_vrange_tag2el,
			2,	/* Count of tags in the map */
			1,	/* Start extensions */
			3	/* Stop extensions */
		};
		asn1_TYPE_descriptor_t asn1_DEF_vrange = {
			"vrange",
			SEQUENCE_constraint,
			SEQUENCE_decode_ber,
			SEQUENCE_encode_der,
			SEQUENCE_print,
			SEQUENCE_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_vrange_tags,
			sizeof(asn1_DEF_vrange_tags)
				/sizeof(asn1_DEF_vrange_tags[0]),
			0,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vrange_specs	/* Additional specs */
		};
		
#include <constr_CHOICE.h>

static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = {
	{ offsetof(struct VariablePart, choice.vset), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		0,
		(void *)&asn1_DEF_vset,
		"vset"
		},
	{ offsetof(struct VariablePart, choice.vrange), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_vrange,
		"vrange"
		},
};
static ber_tlv_tag_t asn1_DEF_VariablePart_tags[] = {
	
};
static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* vrange at 45 */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0 }, /* vset at 42 */
};
static asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = {
	sizeof(struct VariablePart),
	offsetof(struct VariablePart, _ber_dec_ctx),
	offsetof(struct VariablePart, present),
	sizeof(((struct VariablePart *)0)->present),
	asn1_DEF_VariablePart_elements,
	2,	/* Elements count */
	asn1_DEF_VariablePart_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
asn1_TYPE_descriptor_t asn1_DEF_VariablePart = {
	"VariablePart",
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_print,
	CHOICE_free,
	CHOICE_outmost_tag,
	asn1_DEF_VariablePart_tags,
	sizeof(asn1_DEF_VariablePart_tags)
		/sizeof(asn1_DEF_VariablePart_tags[0]),
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_VariablePart_specs	/* Additional specs */
};


/*** <<< DEPS [ActionItem] >>> ***/

/* Dependencies for ActionItem */
#include <ENUMERATED.h>

	typedef enum accept_as {
		accept_as_unknown	= 0,
		accept_as_safe	= 1,
		accept_as_unsafe	= 2,
		/*
		 * Enumeration is extensible
		 */
	} accept_as_e;
/* Dependencies for notify */
#include <BOOLEAN.h>

/* Dependencies for email */
#include <VisibleString.h>
#include <asn_SET_OF.h>

		#include <constr_SET_OF.h>
		
	#include <constr_SEQUENCE.h>
	
#include <constr_SEQUENCE.h>

extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem;

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


typedef struct ActionItem {
	ENUMERATED_t	 accept_as;
	struct notify {
		BOOLEAN_t	 critical;
		struct email {
			A_SET_OF(VisibleString_t) list;
			
			/* Context for parsing across buffer boundaries */
			ber_dec_ctx_t _ber_dec_ctx;
		} email;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *notify;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} ActionItem_t;

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

		static asn1_SET_OF_element_t asn1_DEF_email_elements[] = {
			{ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				(void *)&asn1_DEF_VisibleString },
		};
		static ber_tlv_tag_t asn1_DEF_email_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
		};
		static asn1_SET_OF_specifics_t asn1_DEF_email_specs = {
			sizeof(struct email),
			offsetof(struct email, _ber_dec_ctx),
			asn1_DEF_email_elements
		};
		asn1_TYPE_descriptor_t asn1_DEF_email = {
			"email",
			SET_OF_constraint,
			SET_OF_decode_ber,
			SET_OF_encode_der,
			SET_OF_print,
			SET_OF_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_email_tags,
			sizeof(asn1_DEF_email_tags)
				/sizeof(asn1_DEF_email_tags[0]),
			0,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_email_specs	/* Additional specs */
		};
		
	#include <constr_SEQUENCE.h>
	
	static asn1_SEQUENCE_element_t asn1_DEF_notify_elements[] = {
		{ offsetof(struct notify, critical), 0,
			(ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
			0,
			(void *)&asn1_DEF_BOOLEAN,
			"critical"
			},
		{ offsetof(struct notify, email), 0,
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
			0,
			(void *)&asn1_DEF_email,
			"email"
			},
	};
	static ber_tlv_tag_t asn1_DEF_notify_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_TYPE_tag2member_t asn1_DEF_notify_tag2el[] = {
	    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0 }, /* critical at 61 */
	    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1 }, /* email at 62 */
	};
	static asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = {
		sizeof(struct notify),
		offsetof(struct notify, _ber_dec_ctx),
		asn1_DEF_notify_elements,
		2,	/* Elements count */
		asn1_DEF_notify_tag2el,
		2,	/* Count of tags in the map */
		1,	/* Start extensions */
		3	/* Stop extensions */
	};
	asn1_TYPE_descriptor_t asn1_DEF_notify = {
		"notify",
		SEQUENCE_constraint,
		SEQUENCE_decode_ber,
		SEQUENCE_encode_der,
		SEQUENCE_print,
		SEQUENCE_free,
		0,	/* Use generic outmost tag fetcher */
		asn1_DEF_notify_tags,
		sizeof(asn1_DEF_notify_tags)
			/sizeof(asn1_DEF_notify_tags[0]),
		0,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_notify_specs	/* Additional specs */
	};
	
#include <constr_SEQUENCE.h>

static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = {
	{ offsetof(struct ActionItem, accept_as), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		(void *)&asn1_DEF_ENUMERATED,
		"accept-as"
		},
	{ offsetof(struct ActionItem, notify), 1,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_notify,
		"notify"
		},
};
static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0 }, /* accept-as at 55 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1 }, /* notify at 61 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = {
	sizeof(struct ActionItem),
	offsetof(struct ActionItem, _ber_dec_ctx),
	asn1_DEF_ActionItem_elements,
	2,	/* Elements count */
	asn1_DEF_ActionItem_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_ActionItem = {
	"ActionItem",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_ActionItem_tags,
	sizeof(asn1_DEF_ActionItem_tags)
		/sizeof(asn1_DEF_ActionItem_tags[0]),
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_ActionItem_specs	/* Additional specs */
};

