
/*** <<< INCLUDES [LogLine] >>> ***/

#include <IA5String.h>
#include <VariablePartSet.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

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

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]),
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_varsets_specs	/* Additional specs */
	};
	
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, 0, 0 }, /* varsets at 25 */
    { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0, 0, 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]),
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_LogLine_specs	/* Additional specs */
};


/*** <<< INCLUDES [VariablePartSet] >>> ***/

#include <ActionItem.h>
#include <VariablePart.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

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

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]),
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_vparts_specs	/* Additional specs */
	};
	
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, 0, 1 }, /* vparts at 33 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 }, /* 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]),
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_VariablePartSet_specs	/* Additional specs */
};


/*** <<< INCLUDES [VariablePart] >>> ***/

#include <VisibleString.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <constr_SEQUENCE.h>
#include <constr_CHOICE.h>

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

typedef enum VariablePart_PR {
	VariablePart_PR_NOTHING,	/* No components present */
	VariablePart_PR_vset,
	VariablePart_PR_vrange,
	/* Extensions may appear below */
} VariablePart_PR_e;
extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart;

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


typedef struct VariablePart {
	VariablePart_PR_e 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]),
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vset_specs	/* Additional specs */
		};
		
		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, 0, 1 }, /* from at 45 */
		    { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 }, /* 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]),
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vrange_specs	/* Additional specs */
		};
		
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, 0, 0 }, /* vrange at 45 */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 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 */
	1	/* 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 */
};


/*** <<< INCLUDES [ActionItem] >>> ***/

#include <ENUMERATED.h>
#include <BOOLEAN.h>
#include <VisibleString.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <constr_SEQUENCE.h>

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

	typedef enum accept_as {
		accept_as_unknown	= 0,
		accept_as_safe	= 1,
		accept_as_unsafe	= 2,
		/*
		 * Enumeration is extensible
		 */
	} accept_as_e;
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]),
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_email_specs	/* Additional specs */
		};
		
	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, 0, 0 }, /* critical at 61 */
	    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 }, /* 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]),
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_notify_specs	/* Additional specs */
	};
	
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, 0, 0 }, /* accept-as at 55 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* 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]),
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_ActionItem_specs	/* Additional specs */
};

